7

@ SOの提案に基づいて、在庫画像のセットの平均色をカタログ化しました。
R、G、B = image.convert( "RGB")。リサイズ((1,1)、Image.ANTIALIAS).getpixel((0,0))類似の色の画像を見つける

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

「2色の間の距離を見つける」ことをお勧めするいくつかの質問を読んで、Flickr Hacksの本を参照してください。

Flickrのハック距離アルゴリズムは、基本的のようだ:


DIFFR = checkImage.r - = search_b
距離 - search_r
diffg = checkImage.g - search_g
diffb = checkImage.b (diffr * diffr + diffg * diffg + diffb * diffb)
距離が<ならば閾値が一致する。


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

これは可能ですか?

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

ご協力ありがとうございます。

SR

+0

あなたがお探しのものが見つかりましたか? – Thariama

答えて

2

距離を見つけるために二乗するのではなく、各コンポーネントで比較を行うことで、計算量を大幅に節約できます。

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

これをキャッシュテーブルと組み合わせると、実行している作業には十分です。

+0

これはボックス検索で、OPの四角形の合計は球形テストです。私は2つの方法の速度の違い(3つの8ビット乗算3つの加算とabs)の間に違いがあることは疑うが、あなたは最近のほとんどのものと同様に、メモリ帯域幅です。 – Skizz

+0

簡単な方法は簡単ですが、私は必然的に使用可能な結果が得られることを切望しています。ありがとうございました!私はすぐにそれを試し、結果を掲載します。 私はTEDのビデオで、愛好家が商用製品の機能の80%をコストの約2%で達成したと聞いたことがあります。私はその考え方と私が私のプロジェクトで目指しているものを愛しています:はい、視覚的な色の検索は完璧ではありませんが、そのほとんどが数時間の努力であれば、すでに十分にクールです! SR –

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 
012を行います

に結果がない場合は、の画像カタログを実行して比較を行い、肯定的または否定的な結果を表に格納します。

次に、結果がキャッシュされていない場合は遅くなります。あなたのUIが、ユーザーにある便利なプリセット色を選択させるように促したら、それらを事前に計算して、さらに多くの手助けをすることができます。

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

+0

混乱、私があなたを正しく理解していれば、私は比較分析を前もって行い、関係をDBに保存することを提案しています。だから各色のために、私はすでに類似した画像のリストを持っていて、操作は簡単な検索になります。それはかなりシンプルで、実際には非常に巧妙です、私はそれを試してみるつもりです。 ただし、これは検索開始点が既にカタログにある画像の場合にのみ使用できます。私は平均色を計算してから、私の検索を試みます。私はカラーホイールを提示し、選択した色に最もよく合ったものを提示したい。何かご意見は? –

+0

だからこそ、私はそれを主にキャッシング機構と呼んでいます。色と距離の組み合わせが表にない場合は、計算して保存します。事前計算は、ユーザーが選択する可能性の高い値でキャッシュをシードするためにのみ使用されます。 – chaos

0

色を3次元空間の点として見ることができます。各画像は、その平均色によって定義される空間内のある点に位置するようになります。ユーザーは3D空間内の点を選択しており、その点に最も近い画像を探したいとします。

これは単純ではありませんが、あなたや私よりもスマートな人たちによって多くの作業が行われています(Don Knuthは「郵便局問題」と呼んでいます)。いつものように始めるのが良い場所はat Wikipediaです。

関連する問題