C# 如何按颜色范围选择?

C# 如何按颜色范围选择?,c#,colors,C#,Colors,在我的应用程序中,我加载了一张图片,我希望能够检测到类似的颜色。因此,如果我选择一种颜色,我希望应用程序能够找到具有相同(或几乎相同)颜色的所有像素。这是我为一个检测系统编写的,该系统在鼠标点击点和位图结束之间的垂直方向上进行查看 for (int y = mouseY; y < m_bitmap.Height; y++) { Color pixel = m_bitmap.GetPixel(mouseX, y); //chec

在我的应用程序中,我加载了一张图片,我希望能够检测到类似的颜色。因此,如果我选择一种颜色,我希望应用程序能够找到具有相同(或几乎相同)颜色的所有像素。这是我为一个检测系统编写的,该系统在鼠标点击点和位图结束之间的垂直方向上进行查看

for (int y = mouseY; y < m_bitmap.Height; y++)
        {
            Color pixel = m_bitmap.GetPixel(mouseX, y);
            //check if there is another color
            if ((pixel.R > curcolor.R + treshold || pixel.R < curcolor.R - treshold) ||
                (pixel.G > curcolor.G + treshold || pixel.G < curcolor.G - treshold) ||
                (pixel.B > curcolor.B + treshold || pixel.B < curcolor.B - treshold))
            { //YESSSSS!
                if ((y - ytop > minheight)&&(curcolor != Color.White)) //no white, at least 15px height
                {
                    colorlayers.Add(new ColorLayer(curcolor, y - 1, ytop));
                }
                curcolor = pixel;
                ytop = y;
            } 
        }
for(int y=mouseY;ycurcolor.R+treshold | | pixel.Rcurcolor.G+treshold | | pixel.Gcurcolor.B+treshold | | pixel.Bminheight)&&(curcolor!=Color.White))//没有白色,高度至少为15px
{
添加(新的颜色层(curcolor,y-1,ytop));
}
curcolor=像素;
ytop=y;
} 
}

这是最好的方式吗?不知何故,它看起来不太适合黄色。

RGB是一个3D空间

在所有方向上,一个距离很远的颜色阈值与原始阈值不太相似(根据数字相似的颜色可能与人眼不太相似)

我将使用HSL(例如)进行检查,其中色调值作为有限的1D范围,例如:

for (int y = mouseY; y < m_bitmap.Height; y++)
{
    Color pixel = m_bitmap.GetPixel(mouseX, y);
    if (Math.Abs(color.GetHue() - curcolor.GetHue()) <= threshold)
    {
        // ...
    }
}
for(int y=mouseY;y如果(Math.Abs(color.GetHue()-curcolor.GetHue())黄色出现问题的原因可能是RGB不是一个感知上一致的颜色空间。这意味着,给定颜色空间中两个点/颜色之间的距离,该颜色距离/差异的感知通常不相同

也就是说,您可能想使用另一个颜色空间,如阿德里亚诺建议的HSL,或者实验室

如果您想坚持使用RGB,我建议您计算欧几里德距离,如下所示(我认为更简单):

float distance=Math.sqrt((pixel.R-curcolor.R)^2+(pixel.G-curcolor.G)^2+(pixel.B-curcolor.B)^2);
如果(距离<阈值)
{
//做你该做的。
}

看看in Paint.NET的工作原理可能会很有趣

这是他们比较两种颜色的方式:

private static bool CheckColor(ColorBgra a, ColorBgra b, int tolerance)
{
  int sum = 0;
  int diff;
  diff = a.R - b.R;
  sum += (1 + diff * diff) * a.A / 256;
  diff = a.G - b.G;
  sum += (1 + diff * diff) * a.A / 256;
  diff = a.B - b.B;
  sum += (1 + diff * diff) * a.A / 256;
  diff = a.A - b.A;
  sum += diff * diff;
  return (sum <= tolerance * tolerance * 4);
}
private static bool CheckColor(ColorBgra a、ColorBgra b、int-tolerance)
{
整数和=0;
int-diff;
差异=a.R-b.R;
总和+=(1+diff*diff)*a.a/256;
差异=a.G-b.G;
总和+=(1+diff*diff)*a.a/256;
差异=a.B-B.B;
总和+=(1+diff*diff)*a.a/256;
差异=a.a-b.a;
总和+=diff*diff;

返回(总和请解释
我希望能够检测到类似的颜色
?您希望的输出是什么样的?您是否只是要求帮助您更正
if语句逻辑
?您是否希望从鼠标单击位置向下查看?您的意思是,您的颜色不会水平变化?您可能已经回答了所有这些问题已经..但至少在你的问题中我看不清楚这些事情。
private static bool CheckColor(ColorBgra a, ColorBgra b, int tolerance)
{
  int sum = 0;
  int diff;
  diff = a.R - b.R;
  sum += (1 + diff * diff) * a.A / 256;
  diff = a.G - b.G;
  sum += (1 + diff * diff) * a.A / 256;
  diff = a.B - b.B;
  sum += (1 + diff * diff) * a.A / 256;
  diff = a.A - b.A;
  sum += diff * diff;
  return (sum <= tolerance * tolerance * 4);
}