Я пытаюсь рассчитать евклидовы расстояния двух гистограмм изображений оттенков, я нашел метод cv2.compareHist, но он не дает возможности для евклидова расстояния. Любая помощь высоко ценится.
Расчет расстояний между двумя гистограммами с использованием евклидова расстояния
Ответы (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
Разве это не должно быть равно
dist = cv2.norm(hist1, hist2)
? Почему вы делите сумму на 256?
- person Rotem; 17.06.2021
Верный. Извините, я подумал rmse. Я не знал о cv2.norm ().
- person fmw42; 18.06.2021
Я исправил свой пост в соответствии с комментарием от @rotem.
- person fmw42; 18.06.2021
dist=sqrt( ( (bin1a-bin1b)^2 ... (bin256a-bin256b) ) / 256)
, где bin1a в первом счетчике бинов изображения A, а bin1b - это первое число бинов изображенияB и т. Д. То есть расстояние - это квадратный корень из среднего квадратов разницы между соответствующими интервалами) - person fmw42   schedule 17.06.2021