无法使用此程序绘制图像?

时间:2011-08-29 14:56:22

标签: c# .net image image-processing

我正在尝试处理图像以找出其中的红色区域。我扫描像素,如果发现它们是红色的,它们将转换为黑色,否则为白色。

为了加快这个过程,我跳过了某些像素,需要在它们的位置绘制黑色或白色的块。我正在使用这个功能,但似乎在某处出错了。我到底得到的图像完全是空白的。

    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));
                }
            }
        }
   }

你能指出错误,还是其他任何更好的方法来实现我的目标?

3 个答案:

答案 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)。