2017-12-05 14 views
0

私は知覚ベースの画像検索エンジンを実装しようとしています。ユーザーが指定したテンプレート(オブジェクトサンプル画像から)。画像検索エンジンのクラスター化による色抽出機能

ここでの目標は、正確なオブジェクトと一致させることではなく、テンプレートに近い色の重要な領域を見つけることです。私は私のデータセットの索引付けに悩まされています。

私はsklearn.clusterからk-means(私がthis articleから読んだように)のようなクラスタリングアルゴリズムを試しました。サンプル画像から重心を選択して、最終的にはCIELab色空間で取得しますより知覚的な統一性。しかし、クラスターセンターが無作為に生成されているので、同じオブジェクトが抽出されたオブジェクトや画像でもメトリックの結果が悪いです。

単純な画像検索プログラムの一般的なアルゴリズムは、ヒストグラム間の距離を使用していますが、知覚的に有効な色差を維持しようとすると受け入れられません。 2つの別個の色(そしていくつかの追加の値)を管理してmetrics in CIELab colour spaceを計算します。私は自分の実装のCMCl:cメトリックを使用しており、これまでのところ良い結果が得られました。

誰かが私を助け、自分の目的に合ったアルゴリズムをお勧めします。

私がこれまで行ってきたいくつかのコード:

import cv2 as cv 
import numpy as np 
from sklearn.cluster import KMeans, MiniBatchKMeans 
from imageproc.color_metrics import * 

def feature_extraction(image, features_length=6): 
    width, height, dimensions = tuple(image.shape) 

    image = cv.cvtColor(image, cv.COLOR_BGR2LAB) 
    image = cv.medianBlur(image, 7) 

    image = np.reshape(image, (width * height, dimensions)) 

    clustering_handler = MiniBatchKMeans(n_init=40, tol=0.0, n_clusters=features_length, compute_labels=False, 
            max_no_improvement=10, max_iter=200, reassignment_ratio=0.01) 
clustering_handler.fit(image) 

    features = np.array(clustering_handler.cluster_centers_, dtype=np.float64) 
    features[:, :1] /= 255.0 
    features[:, :1] *= 100.0 
    features[:, 1:2] -= 128.0 
    features[:, 2:3] -= 128.0 

    return features 

if __name__ == '__main__': 
    first_image_name = object_image_name 
    second_image_name = image_name 

    sample_features = list() 
    reference_features = list() 

    for name, features in zip([first_image_name, second_image_name], [sample_features, reference_features]): 
     image = cv.imread(name) 
     features.extend(feature_extraction(image, 6)) 
    distance_matrix = np.ndarray((6, 6)) 
    distance_mappings = {} 

    for n, i in enumerate(sample_features): 
     for k, j in enumerate(reference_features): 
      distance_matrix[n][k] = calculate_cmc_distance(i, j) 
      distance_mappings.update({distance_matrix[n][k]: (i, j)}) 



    minimal_distances = [] 
    for i in distance_matrix: 
     minimal_distances.append(min(i)) 

    minimal_distances = sorted(minimal_distances) 
    print(minimal_distances) 
    for ii in minimal_distances: 
     i, j = distance_mappings[ii] 
     color_plate1 = np.zeros((300, 300, 3), np.float32) 
     color_plate2 = np.zeros((300, 300, 3), np.float32) 

     color1 = cv.cvtColor(np.float32([[i]]), cv.COLOR_LAB2BGR)[0][0] 
     color2 = cv.cvtColor(np.float32([[j]]), cv.COLOR_LAB2BGR)[0][0] 

     color_plate1[:] = color1 
     color_plate2[:] = color2 

     cv.imshow("s", np.hstack((color_plate1, color_plate2))) 
     cv.waitKey() 

    print(sum(minimal_distances)) 

答えて

0

通常のアプローチはすべて画像から代表的なサンプルで、唯一後をクラスタ化することです。

これは、「辞書」を生成するための前処理ステップです。

そして、特徴抽出のために、あなたは今、すべての画像間で共有されている固定クラスタ中心にポイントをマップします。これは単純な最近接マッピングであり、クラスタリングはありません。

関連する問題