python: opencv сравнивает гистограммы со странными результатами - PullRequest
0 голосов
/ 19 октября 2018

Я использую встроенную функцию 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 enter image description here

Скрипт отлично работает для большинства файлов, есть идеи ПОЧЕМУ так проводные результаты?

1 Ответ

0 голосов
/ 22 октября 2018

После создания визуальных гистограмм для этих двух изображений и дальнейшего исследования проблема заключалась в том, что после удаления фона (замены на черные пиксели) наблюдался огромный всплеск пикселей с черным цветом pitch [0,0,0], который имел размер ячейки-10, что привело к очень высокой корреляции.

Чтобы решить проблему, мне пришлось создавать гистограммы без черных пикселей, удаляя их из диапазона гистограмм: hist_range=[1, 256, 1, 256, 1, 256]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...