Я использую встроенную функцию opencv
, чтобы открыть изображение, удалить фон, обрезать изображение, а затем вычислить гистограмму файла, чтобы сравнить его с гистограммой другого файла.
Для сравнения гистограмм я использую цветовое пространство BGR с функцией: cv2.compareHist(hist_1, hist_2, cv2.HISTCMP_CORREL)
Мой код
def cv_histogram(image, channels=[0, 1, 2], hist_size=[10, 10, 10], hist_range=[0, 256, 0, 256, 0, 256], hist_type='BGR'):
#convert to different color space if needed
if hist_type=='HSV': image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
elif hist_type=='GRAY': image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
elif hist_type=='RGB': image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
image_hist = cv2.calcHist([image], channels, None, hist_size, hist_range)
image_hist = cv2.normalize(image_hist, image_hist).flatten()
return image_hist
def cv_compare_images_histogram(img_base, img_compare, method='correlation'):
hist_1 = cv_histogram(img_base)
hist_2 = cv_histogram(img_compare)
if method == "intersection":
comparison = cv2.compareHist(hist_1, hist_2, cv2.HISTCMP_INTERSECT)
else:
comparison = cv2.compareHist(hist_1, hist_2, cv2.HISTCMP_CORREL)
return comparison
im1 = image_remove_background(cv2.imread("1.jpg"), bg_lower_bgr, bg_upper_bgr)
im2 = image_remove_background(cv2.imread("2.jpg"), bg_lower_bgr, bg_upper_bgr)
sim = cv_compare_images_histogram(im1, im2)
img_new = image_stack(im1, im2)
cv2.imshow('img_new', img_new)
print("Histogram similarity is: ", sim)
, как на экране ниже, изображения имеют разные цвета /объектов, но я получаю очень высокую корреляцию: 0,9198019904818888
Скрипт отлично работает для большинства файлов, есть идеи ПОЧЕМУ так проводные результаты?