所以在c#中,我在位图中有一个图像,其中有不同的颜色。现在,我试图在图像中仅保留一个单一范围的颜色,而所有其他颜色都可以删除(将它们变成白色像素)。现在我要提取的颜色是黄色,但是仅将像素的颜色与Color进行比较.Yellow不够,因为像素可以具有不同的黄色阴影,所以我猜我需要过滤掉所有其他颜色,但是我似乎不知道该怎么做。
我已经读过一些关于卷积的知识,但是我没有看到直接在程序中实现卷积的方法。
有没有办法使我只保持黄色并且图像中的阴影深浅?
谢谢。
答案 0 :(得分:1)
非常模糊的定义, 如果我了解您想要做什么,我会这样做:
卷积不会帮助您,它在空间范围内起作用,而不是颜色
答案 1 :(得分:1)
这是一个快速而简单的解决方案。
它使用一个功能,该功能插件带有您可以找到here的帖子。
这是功能:
public Color ToWhiteExceptYellow(Color c, int range)
{
float hueC = c.GetHue();
float e = 1.5f * range; // you can adapt this nuumber
float hueY = Color.Yellow.GetHue();
float delta = hueC - hueY;
bool ok = (Math.Abs(delta) < e);
//if (!ok) { ok = (Math.Abs(360 + delta) < e); } // include these lines ..
//if (!ok) { ok = (Math.Abs(360 - delta) < e); } // for reddish colors!
return ok ? c : Color.White;
}
它与黄色效果很好,但由于色相是一个环绕数字,它需要更多代码才能与回合点颜色(红色)一起使用。我提供了两行帮助。
要使其正常工作,请更改链接文章中的这些行:
// pick one of our filter methods
ModifyHue hueChanger = new ModifyHue(ToWhiteExceptYellow);
.. and ..
// we pull the bitmap from the image
Bitmap bmp = new Bitmap( (Bitmap)pictureBox1.Image); // create a copy
.. and ..
c = hueChanger(c, trackBar1.Value); // insert a number you like, mine go from 1-10
.. and ..
// we need to re-assign the changed bitmap
pictureBox2.Image = (Bitmap)bmp; // show in a 2nd picturebox
别忘了包括委托人:
public delegate Color ModifyHue(Color c, int ch);
和using子句:
using System.Drawing.Imaging;
请注意,应该丢弃旧内容,以免泄漏图像,也许是这样:
Bitmap dummy = (Bitmap )pictureBox2.Image;
pictureBox2.Image = null;
if (dummy != null) dummy.Dispose;
// now assign the new image!
让我们看看它在工作:
可以随意扩展。您可以更改功能的签名以包括目标颜色,并添加亮度和/或饱和度的范围。