사용자가 템플릿을 사용할 때 사용자가 지정한 템플릿 (개체)과 비교적 비슷하거나 가까운 색상의 개체를 포함하는 그림을 찾기 위해 지각 기반 이미지 검색 엔진을 구현하려고합니다. 샘플 이미지에서).이미지 검색 엔진에서 클러스터링을 통한 색상 추출 기능
이제 목표는 정확한 개체를 일치시키는 것이 아니라 템플릿에 가까운 색의 중요한 영역을 찾는 것입니다. 내 데이터 집합 색인 생성에 어려움이 있습니다.
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))