1

私のアプリケーションでは、画像を読み込んでおり、似たような色を検出できるようにしたいと考えています。したがって、色を選択した場合、アプリケーションが同じ (またはほぼ同じ) 色のすべてのピクセルを見つけられるようにする必要があります。これは、マウス クリックのポイントとビットマップの終わりの間の垂直方向に見える検出システムのために私が書いたものです。

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

これが最善の方法でしょうか?なんだか黄色がかった色と相性が良さそうです。

4

3 に答える 3

2

RGB は3D空間です。

すべての方向の色の遠方のしきい値は、元の色とあまり似ていません (また、数値的に似ているものは、人間の目にあまり似ていない可能性があります)。

たとえば、色相値が有限の 1D 範囲である HSL (たとえば) を使用してチェックを行います。

for (int y = mouseY; y < m_bitmap.Height; y++)
{
    Color pixel = m_bitmap.GetPixel(mouseX, y);
    if (Math.Abs(color.GetHue() - curcolor.GetHue()) <= threshold)
    {
        // ...
    }
}

さらに、この方法でビットマップを使用することに注意してください (GetPixel()非常に遅いです。この投稿を見て、はるかに高速な代替方法を確認してください)。

于 2013-10-17T13:26:33.520 に答える
0

黄色で問題が発生する理由は、RGB が知覚的に均一な色空間ではないことが原因である可能性があります。これは、色空間内の 2 つの点/色の間の距離が与えられた場合、この色の距離/差の知覚は一般に同じではないことを意味します。

とはいえ、Adriano が提案する HSL や、Lab.

RGBに固執したい場合は、次のようにユークリッド距離を計算することをお勧めします(より簡単だと思います):

float distance = Math.sqrt((pixel.R-curcolor.R)^2 + (pixel.G-curcolor.G)^2 + (pixel.B-curcolor.B)^2);

if(distance < threshold)
{
    // Do what you have to. 
}
于 2013-10-17T13:41:04.870 に答える
0

Paint.NETの魔法の杖ツールがどのように機能するかを見るのは興味深いかもしれません。

これは、2つの色を比較する方法です。

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

ソース

于 2013-10-17T13:53:49.847 に答える