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))