无法使用此程序绘制图像
本文关键字:程序 绘制 图像 | 更新日期: 2023-09-27 18:07:01
我正在尝试处理图像以找出其中的红色区域。我扫描像素,如果它们被发现是足够的红色,它们被转换为黑色,否则是白色。
为了加快这一过程,我跳过了某些像素,并且需要在它们的位置绘制黑色或白色块。我正在使用这个功能,但它似乎是错误的地方。我最后得到的图像是完全空白的。
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));
}
}
}
}
你能指出错误,或者其他更好的方法来实现我的目标吗?
你说的空白是指白色吗?
我不知道你的图像,但if (cl.R > (cl.G * 2) && cl.R > (cl.B * 2))
不是一个很好的红色测试。#010000通过了测试,但基本上是黑色的。#ffaaaa看起来是红色的,但不会通过。
如果你有一个非常暗的图像,很多像素可能通过测试,不是很红。对于浅色图像,大量红色像素无法通过。
可能最好的方法是将颜色转换为HSL,然后使用位于红色区域的H(ue)值,但只有当S(饱和度)和L(亮度)足够亮且非灰色(超过阈值而不仅仅是黑色或灰色)
尝试使用:
Graphics g = Graphics.FromImage(image);
然后考虑其他回复来改进你的颜色测试。
您没有显示创建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)。