7

ここ@SOの提案に基づいて、一連のストック画像の平均色をカタログ化しました.
r,g,b = image.convert("RGB").resize((1,1), Image.ANTIALIAS).getpixel((0,0))

ここで、カラー ホイールをユーザーに提示し、カタログに対して検索を実行して、選択した色に最も近い画像を見つけたいと思います。

ここに投稿された「2 つの色の間の距離を見つける」ことを推奨するいくつかの質問を読み、Flickr Hacks の本を参照しました。

Flickr Hack 距離アルゴリズムは基本的に次のようです。


diffr = checkImage.r - search_r
diffg = checkImage.g - search_g
diffb = checkImage.b - search_b
距離 = (diffr * diffr + diffg * diffg + diffb * diffb)
距離 < しきい値の場合、一致。


この方法では、検索色とすべての画像の色指紋との距離を計算する必要があります。選択した色 (中心点) とあらかじめ決められたしきい値 (または検索半径) に基づいて「検索領域」を指定する方法があるかどうか疑問に思っていました。次に、SQL のようなクエリを作成して、この領域内にあるすべての画像を返します。

これは可能ですか??

ところで、私は PIL と関連ライブラリを使用して Python でこれを実装しています。

助けてくれてありがとう!

SR

4

4 に答える 4

4

色差 (デルタ E) - 2 つの色の差または距離は、色彩科学で重要な指標です。

ここでPythonコードを見つけることができます

を計算RGBする前に に変換する必要があることに注意してください。LabDelta E

RGB -> XYZ -> ラボ

追加情報:

ブルース・ジャスティン・リンドブルームのサイト

色変換の数学と公式

カラーデルタ/比較演算

于 2013-10-21T13:01:37.277 に答える
3

二乗して距離を求めるのではなく、各コンポーネントを比較することで、計算を大幅に節約できます。

if abs(check.r - search.r) < threshold and
   abs(check.g - search.g) < threshold and
   abs(check.b - search.b) < threshold 

これをキャッシュテーブルと組み合わせると、何をしていてもおそらく十分でしょう。

于 2009-06-01T18:49:42.627 に答える
1

それが私だったら、もう少し凝り性を抑えて、次のように検索結果をセカンダリ テーブルにキャッシュします。

CREATE TABLE `image_search` (
    `id` int not null auto_increment,
    `image_id` int not null,
    `r` tinyint not null,
    `g` tinyint not null,
    `b` tinyint not null,
    `distance` tinyint not null,
    `hit` bool not null,
    PRIMARY KEY (`id`),
    UNIQUE KEY `image_id_by_rgb_by_distance` (`image_id`,`r`,`g`,`b`,`distance`),
    KEY `image_id_by_rgb_by_distance_by_hit` (`image_id`,`r`,`g`,`b`,`distance`,`hit`),
);

そこから引き出して、次のように一致を見つけます

SELECT `image_id`
FROM `image_search`
WHERE `r` = $r
AND `g` = $g
AND `b` = $b
AND `distance` = $distance
AND `hit` = 1

結果が得られない場合は、実行します

SELECT `image_id`
FROM `image_search`
WHERE `r` = $r
AND `g` = $g
AND `b` = $b
AND `distance` = $distance

その結果が得られない場合は、イメージ カタログを実行して比較を行い、正または負の各結果をテーブルに格納します。

結果がキャッシュされていない場合にのみ遅くなります。UI がユーザーに特定の有用なプリセット カラーを選択することを奨励している場合、それらを事前に計算してさらに支援することができます。

また、画像をカタログに追加するときに、以前に実行されたすべての検索を事前計算するためのボーナス ポイント。

于 2009-06-01T18:31:12.303 に答える
0

We can look at a color as a point in three-dimensional space. Now each image will be at a point in space defined by its average color. The user is choosing a point in 3-d space, and you want to find the image nearest that point.

This is not simple, but a lot of work has been done on it by people smarter than you or I (Don Knuth calls it the 'post office problem'). A good place to start is at Wikipedia, as usual.

于 2009-06-01T20:54:18.867 に答える