2017-12-05 16 views
0

사용자가 템플릿을 사용할 때 사용자가 지정한 템플릿 (개체)과 비교적 비슷하거나 가까운 색상의 개체를 포함하는 그림을 찾기 위해 지각 기반 이미지 검색 엔진을 구현하려고합니다. 샘플 이미지에서).이미지 검색 엔진에서 클러스터링을 통한 색상 추출 기능

이제 목표는 정확한 개체를 일치시키는 것이 아니라 템플릿에 가까운 색의 중요한 영역을 찾는 것입니다. 내 데이터 집합 색인 생성에 어려움이 있습니다.

sklearn.cluster (예 : this article)에서 k- 평균과 같은 일부 클러스터링 알고리즘을 사용하여 샘플 이미지에서 중심 이미지를 선택하고 결국 CIELab 색 공간에서 획득합니다 지각적인 통일성. 그러나 클러스터 센터가 무작위로 생성되어 개체와 이미지에서조차도 열악한 메트릭 결과를 얻었 기 때문에 동일한 개체가 추출되었습니다.

내가 아는 한 간단한 이미지 검색 프로그램의 일반적인 알고리즘은 히스토그램 사이의 거리를 사용하는데, 이는 지각 적으로 유효한 색상 차이를 유지하려고 시도 할 때 허용되지 않으며 그로 인해 나는 두 개의 개별 색상 (및 추가 값)을 관리하여 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

일반적인 접근 방식은 모든 이미지에서 대표 샘플 만 하면 클러스터하는 것입니다.

"사전"을 생성하기위한 전처리 단계입니다.

그런 특징 추출을 위해, 당신은 지금 모든 이미지에서 공유 있는 고정 클러스터 센터 점을지도한다. 이것은 가장 가까운 가장 가까운 이웃 맵핑이며 클러스터링이 없습니다.