简单地说,我想将图像中的任何像素设置为白色,其中亮度大于给定阈值。我编写了以下代码,这些代码适用于我的目的。
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方法解决此问题的优化方法?
答案 0 :(得分:3)
您可以使用经过验证的本机算法实现进行优化(例如OpenCV)。虽然我不是这方面的专家,但你认为无论如何你都需要遍历所有像素。即使是关于阈值算法的科学论文(相当注重寻找一个好的门槛)也会在整个图像中循环,所以我认为你不应该感到错误。
无论如何,如果有一些数学方法适用于任何图像,我也会感兴趣,但我怀疑存在。
答案 1 :(得分:3)
对于某些特殊情况(例如2个阈值的功率),你可以使用bitmasking技巧处理32位块,但我怀疑它会非常适合你。您提供的代码中的更大开销是GetPixel
和SetPixel
调用,效率非常低。您可以使用LockBits方法大大加快操作速度,并直接从byte[]
处理基础数据。
答案 2 :(得分:2)
以这种方式考虑,如果您想知道像素是否高于或低于所有像素的阈值,您将不得不访问所有像素。任何未访问的像素都意味着您不知道它的价值。
没有办法比O(n)时间更好地写这个,特别是如果你打算改变某些像素的值。