Расчет расстояний между двумя гистограммами с использованием евклидова расстояния

Я пытаюсь рассчитать евклидовы расстояния двух гистограмм изображений оттенков, я нашел метод cv2.compareHist, но он не дает возможности для евклидова расстояния. Любая помощь высоко ценится.


person deniyorum    schedule 16.06.2021    source источник
comment
см. более высокие измерения на en.wikipedia.org/wiki/Euclidean_distance. Каждая корзина - это разные размеры   -  person fmw42    schedule 17.06.2021
comment
Я очень плохо разбираюсь в математике, поэтому я должен спросить, будет ли результат числом или массивом чисел   -  person deniyorum    schedule 17.06.2021
comment
Вы видели это? Евклидово расстояние между гистограммой RGB двух изображений   -  person mlg556    schedule 17.06.2021
comment
Одно число: dist=sqrt( ( (bin1a-bin1b)^2 ... (bin256a-bin256b) ) / 256), где bin1a в первом счетчике бинов изображения A, а bin1b - это первое число бинов изображенияB и т. Д. То есть расстояние - это квадратный корень из среднего квадратов разницы между соответствующими интервалами)   -  person fmw42    schedule 17.06.2021


Ответы (1)


Вот как это сделать в Python / OpenCV.

Вход:

введите описание изображения здесь

введите описание изображения здесь

import cv2
import math

# Load the images
img1 = cv2.imread('lena.jpg')
img2 = cv2.imread('zelda1.jpg')

# convert to gray
gray1 = cv2.cvtColor(img1,cv2.COLOR_BGR2GRAY)
gray2 = cv2.cvtColor(img2,cv2.COLOR_BGR2GRAY)

# Calculate the histograms, and normalize them
hist1 = cv2.calcHist([gray1], [0], None, [256], [0, 256])
#cv2.normalize(hist1, hist1, alpha=0, beta=1, norm_type=cv2.NORM_MINMAX)

hist2 = cv2.calcHist([gray2], [0], None, [256], [0, 256])
#cv2.normalize(hist2, hist2, alpha=0, beta=1, norm_type=cv2.NORM_MINMAX)

# compute euclidean distance
sum = 0
for i in range (0,256):
    sum = sum + (hist1[i][0]-hist2[i][0])**2
dist = math.sqrt(sum)
print('euclidean distance:', dist)

# above is equivalent to cv2.norm()
dist2 = cv2.norm(hist1, hist2, normType=cv2.NORM_L2)
print('euclidean distance2:', dist2)

Полученные результаты:

euclidean distance : 2319.6163475885405
euclidean distance2: 2319.6163475885405

Если изображения не имеют одинаковых размеров (общее количество пикселей = ширина * высота), то, вероятно, следует нормализовать гистограммы, разделив каждую ячейку на общее количество пикселей в изображении.

person fmw42    schedule 17.06.2021
comment
Разве это не должно быть равно dist = cv2.norm(hist1, hist2)? Почему вы делите сумму на 256? - person Rotem; 17.06.2021
comment
Верный. Извините, я подумал rmse. Я не знал о cv2.norm (). - person fmw42; 18.06.2021
comment
Я исправил свой пост в соответствии с комментарием от @rotem. - person fmw42; 18.06.2021