【问题标题】:Application C# image quality [duplicate]应用程序 C# 图像质量 [重复]
【发布时间】:2021-01-09 01:12:04
【问题描述】:

我正在使用 C# 开发一个应用程序。在我开发的应用程序中,我使用用户选择的图片文件并将图片传输到表单中。

在这一步之后,我想对图片的位图进行更改。例如将图像调整为小尺寸并转换为 1bpp 颜色格式。

我现在可以做这些,我可以调整图像大小并将其转换为 1bpp 颜色格式,但此时我认为我有质量问题。

例如,当我截取一段文本并将其发送到程序时,当我以调整大小的 1bpp 颜色格式查看文本时,我发现文本中的字母明显不好。

我展示了我使用的算法和应用程序的屏幕截图:

Bitmap bmp = new Bitmap(ResizeImage.filePath);
Bitmap bmpOriginalRGB = Helper.ImageResize(bmp, 512, 384);
pcbox1.Image = bmpOriginalRGB;

Bitmap bmpResizeRGB = Helper.ImageResize(bmp, ResizeWidth, ResizeHeight);
pcbox2.Image = bmpResizeRGB;

Bitmap bmpResize1BPP_1 = Helper.ConvertTo1BppImage(Helper.ImageResize(bmp, ResizeWidth, ResizeHeight));
pcbox3.Image = bmpResize1BPP_1;

Bitmap bmpResize1BPP_2 = bmpResizeRGB.Clone(new Rectangle(0, 0, ResizeWidth, ResizeHeight), PixelFormat.Format1bppIndexed);
pcbox4.Image = bmpResize1BPP_2;
Bitmap oledBitmap = bmpResize1BPP_2;

public static Bitmap ImageResize(Image image, int width, int height)
{
    var destRect = new Rectangle(0, 0, width, height);
    var destImage = new Bitmap(width, height);

    destImage.SetResolution(image.HorizontalResolution, image.VerticalResolution);

    using (var graphics = Graphics.FromImage(destImage))
    {
        graphics.CompositingMode = CompositingMode.SourceCopy;
        graphics.CompositingQuality = CompositingQuality.HighQuality;
        graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
        graphics.SmoothingMode = SmoothingMode.HighQuality;
        graphics.PixelOffsetMode = PixelOffsetMode.HighQuality;

        using (var wrapMode = new ImageAttributes())
        {
            wrapMode.SetWrapMode(WrapMode.TileFlipXY);
            graphics.DrawImage(image, destRect, 0, 0, image.Width, image.Height, GraphicsUnit.Pixel, wrapMode);
        }
    }
    return destImage;
}

Here's a first screenshoot
Here's a second screenshoot
Here's a third screenshoot

例如,在第二个屏幕图像中,女人的影子显示为黑色。我不想那样。我想看到更清晰的黑白图像。

你认为有可能进一步提高这个画质吗?

编辑:抱歉翻译..

【问题讨论】:

  • 为什么要使用1bpp?
  • 你已经发布了这个问题previous。删除和重新发布已关闭的问题违反了社区规则。不要那样做。当您的问题被关闭时,您的工作是 edit that question 解决导致其关闭的问题,然后等待社区再次对其进行评估。如果你对它进行了足够的改进,它将重新打开。
  • 如果您的问题在于转换为 1bpp,您应该真正添加执行此操作的实际函数。您发布了 ImageResize 一个,但没有发布 ConvertTo1BppImage 一个。

标签: c# image image-processing


【解决方案1】:

我不认为你的问题是调整大小的质量,而是从灰度到黑白的转换。

调整大小时,将相邻像素的颜色平均在一起,以获得与像素集近似的新颜色。因此,从 200x200 像素图像到 100x100 像素图像,一组 4 个像素变成一个像素。它看起来仍然相当不错,但纯黑色文本将变成一系列灰色像素。确切的公式将因使用的插值方法而异。但是当调整一段漂亮的黑白文本的大小时,文本最终会变浅或变灰(这在以后很重要)

但是,当从灰度(或全彩色)变为黑白时,每个像素最终都会变成黑白,没有其他选择,但是有不同的算法用于决定哪些像素最终变成黑色或白色,通常称为抖动。 (https://en.wikipedia.org/wiki/Dither)

您的第一张黑白图像似乎使用了某种形式的误差扩散,很可能是 Floyd-Steinberg。它往往在真实的世界图像上工作得相当好,并将灰色区域变成间隔开的黑色像素,在视觉上近似于它们所在区域的灰度。

您的第二张黑白图像似乎是一个简单的阈值算法。基本上,比某种颜色深的像素最终会变成黑色,而其余的像素都会变成白色。您可以通过简单地设置使用哪种颜色作为阈值来调整图像。通常这适用于文本,但您需要调整用作阈值的值,但我不知道您使用的库是否允许这样做。我发现以编程方式选择阈值的最佳方法是将每种颜色的像素总数加起来,然后假设一些百分比将是黑色(文本往往大部分是空白),然后选择为您提供的阈值黑色像素的数量。

您可以尝试许多其他抖动算法,以及边缘检测算法。您也可以在转换为黑白之前尝试调整图像的对比度。

但是,归根结底,当分辨率较低(每个字符的像素数)时,可能无法轻松地将它们转换为黑白并使其仍然可读(只需尝试将小文本传真到标准模式下的传真机)。请记住,您的调整大小删除了很多信息,而从 8 位到 1 位的转换又删除了调整后图片中 87% 的信息。

【讨论】:

    猜你喜欢
    • 2012-11-27
    • 2023-03-22
    • 2019-01-14
    • 1970-01-01
    • 2017-08-03
    • 2012-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多