50 lines
1.4 KiB
Python
50 lines
1.4 KiB
Python
import cv2 as cv
|
|
import numpy as np
|
|
|
|
img_cache = {}
|
|
hist_rgb_cache = {}
|
|
|
|
|
|
def readImage(img_path):
|
|
global img_cache
|
|
|
|
if img_path in img_cache.keys():
|
|
pass
|
|
|
|
else:
|
|
# read image
|
|
img_test_rgb = cv.imread(img_path)
|
|
# convert to gray scale
|
|
img_test_rgb = cv.resize(img_test_rgb, (1024, 1024))
|
|
img_cache[img_path] = img_test_rgb
|
|
|
|
return img_cache[img_path]
|
|
|
|
|
|
def cachedCvCalcHist(img2_path, channel, num_bins):
|
|
global hist_rgb_cache
|
|
|
|
img_input = readImage(img2_path)
|
|
|
|
if tuple([img2_path, channel, num_bins]) in hist_rgb_cache.keys():
|
|
return hist_rgb_cache[tuple([img2_path, channel, num_bins])]
|
|
else:
|
|
hist = cv.calcHist([img_input], [channel], None, [num_bins], [0, 255])
|
|
hist_rgb_cache[tuple([img2_path, channel, num_bins])] = hist
|
|
return hist
|
|
|
|
|
|
def compareImgs_hist_rgb(img1_path, img2_path, num_bins=10):
|
|
total_diff = 0
|
|
|
|
for channel in range(3): # Iterate over RGB channels
|
|
# hist1 = cv.calcHist([img1], [channel], None, [num_bins], [0, 255])
|
|
# hist2 = cv.calcHist([img2], [channel], None, [num_bins], [0, 255])
|
|
hist1 = cachedCvCalcHist(img1_path, channel, num_bins)
|
|
hist2 = cachedCvCalcHist(img2_path, channel, num_bins)
|
|
|
|
channel_diff = np.sum(np.abs(hist1 - hist2))
|
|
total_diff += channel_diff
|
|
|
|
return total_diff / (3 * float(1024 * 1024))
|