1

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

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 成像或图形方法来解决此问题的优化方法?

4

3 回答 3

3

您可以通过使用经过验证的本机算法实现(例如 OpenCV)进行优化。尽管我不是这方面的专家,但认为无论如何您都需要遍历所有像素。即使是关于阈值算法的科学论文(更侧重于找到一个好的阈值)也会遍历整个图像,所以我认为您不必对此感到错误。

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

于 2012-10-17T12:37:49.070 回答
3

对于某些特殊情况(例如 2 阈值的幂),您可以使用位掩码技巧处理 32 位块,但我怀疑它会为您带来很多好处。您提供的代码中更大的开销是GetPixelandSetPixel调用,这是非常低效的。您可以使用LockBits方法并直接从byte[].

于 2012-10-17T14:33:48.843 回答
2

这样考虑,如果你想知道一个像素是高于还是低于所有像素的阈值,你将不得不访问所有像素。任何未访问的像素都意味着您不知道它的值。

没有办法在 O(n) 时间内编写此代码,特别是如果您打算更改某些像素的值。

于 2012-10-17T14:22:32.107 回答