我正在尝试处理图像以找出其中的红色区域。我扫描像素,如果发现它们是红色的,它们将转换为黑色,否则为白色。
为了加快这个过程,我跳过了某些像素,需要在它们的位置绘制黑色或白色的块。我正在使用这个功能,但似乎在某处出错了。我到底得到的图像完全是空白的。
public void ProcessFrame( ref Bitmap image )
{
int skip = 10;
Graphics g = Graphics.FromImage(System.Drawing.Image.FromHbitmap(image.GetHbitmap()));
SolidBrush black = new SolidBrush(Color.Black);
SolidBrush white = new SolidBrush(Color.White);
for (int i = 0; i < image.Width; i=i+skip)
{
for (int j = 0; j < image.Height; j = j + skip)
{
Color cl = image.GetPixel(i, j);
if (cl.R > (cl.G * 2) && cl.R > (cl.B * 2))
{
g.FillRectangle(black, new Rectangle(i, j, skip, skip));
}
else
{
g.FillRectangle(white, new Rectangle(i, j, skip, skip));
}
}
}
}
你能指出错误,还是其他任何更好的方法来实现我的目标?
答案 0 :(得分:4)
空白,你的意思是白色吗?
我不知道你的形象,但是if (cl.R > (cl.G * 2) && cl.R > (cl.B * 2))
不适合发红。 #010000通过了该测试,但基本上是黑色的。并且,#futaaa看起来很红,但不会通过。
如果你有一个非常暗的图像,很多像素可能会通过那个不是很红的测试。使用浅色图像时,许多红色像素将无法通过。
可能最好的方法是将颜色转换为HSL,然后使用红色区域中的H(ue)值,但前提是S(aturation)和L(uminance)足够明亮且不灰色(在门槛上不仅仅是黑色或灰色)。
答案 1 :(得分:2)
尝试使用:
Graphics g = Graphics.FromImage(image);
然后考虑其他回复以改善您的色彩测试。
答案 2 :(得分:0)
您没有显示创建image
的位置,但此代码将绘制到位图中:
var bmp = new Bitmap(200,200);
using (g = Graphics.FromImage(bmp))
{
g.FillEllipse(Brushes.Red, 10, 10, 50, 50);
}
请注意,在使用图片之前,您需要致电Graphics.Dispose
(或使用using
)。
另请注意,使用GetPixel
进行图像处理会非常慢。使用低级内存访问(Bitmap.LockBits
)或尝试使用.NET的图像处理库(如AForge)。