C#如何在位图中保留1种颜色范围?

时间:2019-05-08 14:00:34

标签: c# colors bitmap

所以在c#中,我在位图中有一个图像,其中有不同的颜色。现在,我试图在图像中仅保留一个单一范围的颜色,而所有其他颜色都可以删除(将它们变成白色像素)。现在我要提取的颜色是黄色,但是仅将像素的颜色与Color进行比较.Yellow不够,因为像素可以具有不同的黄色阴影,所以我猜我需要过滤掉所有其他颜色,但是我似乎不知道该怎么做。

我已经读过一些关于卷积的知识,但是我没有看到直接在程序中实现卷积的方法。

有没有办法使我只保持黄色并且图像中的阴影深浅?

谢谢。

2 个答案:

答案 0 :(得分:1)

非常模糊的定义, 如果我了解您想要做什么,我会这样做:

  1. 遍历位图的每个像素,并将其与黄色范围进行比较(如果超出范围,则分配白色值)
  2. 将每个像素的RGB值转换为CMYK(在线搜索转换公式)[Y =(1-Blue-Black)/(1-Black)]
  3. 如果YellowMin,则分配白色值

卷积不会帮助您,它在空间范围内起作用,而不是颜色

答案 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!

让我们看看它在工作:

enter image description here

可以随意扩展。您可以更改功能的签名以包括目标颜色,并添加亮度和/或饱和度的范围。