基于亮度的位图像素替换

时间:2012-10-17 11:03:41

标签: c# image-processing

简单地说,我想将图像中的任何像素设置为白色,其中亮度大于给定阈值。我编写了以下代码,这些代码适用于我的目的。

using (Bitmap image = new Bitmap("C:\\temp\\test1.png"))
{
    for (int x = 0; x < image.Width; x++)
    {
        for (int y = 0; y < image.Height; y++)
        {
            Color c = image.GetPixel(x, y);
            float f = c.GetBrightness(); //From 0 (black) to 1 (white)

            if (f > 0.1) { image.SetPixel(x, y, Color.White); }
        }
    }

    image.Save("C:\\temp\\test2.png");
}

但是,必须逐个遍历每个像素才感觉不对。是否有使用其他.NET Imaging或Graphics方法解决此问题的优化方法?

3 个答案:

答案 0 :(得分:3)

您可以使用经过验证的本机算法实现进行优化(例如OpenCV)。虽然我不是这方面的专家,但你认为无论如何你都需要遍历所有像素。即使是关于阈值算法的科学论文(相当注重寻找一个好的门槛)也会在整个图像中循环,所以我认为你不应该感到错误。

无论如何,如果有一些数学方法适用于任何图像,我也会感兴趣,但我怀疑存在。

答案 1 :(得分:3)

对于某些特殊情况(例如2个阈值的功率),你可以使用bitmasking技巧处理32位块,但我怀疑它会非常适合你。您提供的代码中的更大开销是GetPixelSetPixel调用,效率非常低。您可以使用LockBits方法大大加快操作速度,并直接从byte[]处理基础数据。

答案 2 :(得分:2)

以这种方式考虑,如果您想知道像素是否高于或低于所有像素的阈值,您将不得不访问所有像素。任何未访问的像素都意味着您不知道它的价值。

没有办法比O(n)时间更好地写这个,特别是如果你打算改变某些像素的值。