4

虹のように、画像を 7 色 (赤、オレンジ、黄、緑、水色、青、紫) でセグメント化する必要があります。あなたはそれを行う方法を知っていますか?どんな論文やアルゴリズムでも構いません。たとえば、各トリプル(r、g、b)に色を割り当てることで実行できます。しかし、255^3 の組み合わせに達したため、効果的ではありません。

4

5 に答える 5

4

HSV色空間http://en.wikipedia.org/wiki/HSL_and_HSVの「H」コンポーネントは、(連続した)虹の位置を表す妥当な数値を提供します。

そうすれば、その連続したスペースを選択した7つのセグメントに分割するのは簡単です。

于 2011-07-29T05:31:38.627 に答える
1

色が事前定義されている場合、解決策はすべてのピクセルをループして、最も近い代表に置き換えることです。carlosdcが言ったように、色空間変換は単なる。よりも良い結果をもたらす可能性があります(r1-r2)**2 + (g1-g2)**2 + (b1-b2)**2

物事をより速くするための可能なトリックは、いくつかのメモリを交換し、特定のRGBトリプレットの結果をキャッシュすることです...すなわち

// Initialize the cache to 255
std::vector<unsigned char> cache(256*256*256, 255);

for (int y=0; y<h; y++)
{
    unsigned char *pixel = img + y*w*3 + x;
    for int (x=0; x<w; x++, pixel+=3)
    {
        int r = pixel[0], g = pixel[1], b = pixel[2];
        int key = r + (g<<8) + (b<<16);
        int converted = cache[key];
        if (converted == 255)
        {
            ... find closest representative ...
            cache[key] = converted;
        }
        pixel[0] = red[converted];
        pixel[1] = green[converted];
        pixel[2] = blue[converted];
    }
}

色の数が少ない場合は、より少ないメモリを使用できます。たとえば、代表者の数を15に制限すると、カラーエントリごとに4ビット(スペースの半分)が必要になり、次のようになります。

std::vector<unsigned char> cache(256*256*256/2, 255);

...
int converted = (key&1) ? (cache[key>>1] >> 4) : (cache[key>>1] & 0x0F);
if (converted == 15) // Empty slot
{
    ...
    cache[key>>1] ^= (key & 1) ? ((converted << 4)^0xF0) : (converted^0x0F);
}
...

反対に、可能な入力色の数が少なく、代表の数が多いことがわかっている場合は、標準std::mapが有効な代替手段になる可能性があります。

于 2011-07-29T05:57:53.217 に答える
1

必要な 7 色が既にあるので、クラスタリングを使用する必要はありません。賢明な出発点は次のとおりです。画像内の各ピクセルについて、7 つの色のうちどれがそれに最も近いかを見つけ (RGB の L2 距離を使用)、その最も近い色をそのピクセルに割り当てます。最初に CIE XYZ などの他の色空間に変換することで、より良い (より知覚的に類似した) 結果を得ることができる場合がありますが、これには実験が必要です。

于 2011-07-29T05:11:58.180 に答える
0

クラスタリングの手法(アルゴリズム)を使ってみませんか?たとえば、k-means アルゴリズムです。それ以外の場合は、「色による画像セグメンテーション」をググってください。

于 2011-07-29T05:01:55.210 に答える
-1

見栄えを良くしたい場合は、ディザリングを使用することをお勧めします。たとえば、Floyd Steinberg ディザリング: http://en.wikipedia.org/wiki/Floyd%E2%80%93Steinberg_dithering

于 2011-07-29T08:04:51.600 に答える