I want to compare 2 images using numpy. This is what I have got so far.
One of the outputs should be a white image with black pixels where pixels are different.
I am sure it's possible to make it more efficient by better use of numpy, e.g. the for loop can be avoided. Or maybe there is a function/package that has implemented something similar already?
import gc
import PIL
import numpy as np
def compare_images(image_to_test_filename, image_benchmark_filename):
print('comparing', image_to_test_filename, 'and', image_benchmark_filename)
image_benchmark = plt.imread(image_benchmark_filename)
image_to_test = plt.imread(image_to_test_filename)
assert image_to_test.shape[0] == image_benchmark.shape[0] and image_to_test.shape[1] == image_benchmark.shape[1]
diff_pixel = np.array([0, 0, 0], np.uint8)
true_array = np.array([True, True, True, True])
diff_black_white = np.zeros([image_benchmark.shape[0], image_benchmark.shape[1], 3], dtype=np.uint8) + 255
is_close_pixel_by_pixel = np.isclose(image_to_test, image_benchmark)
nb_different_rows = 0
for r, row in enumerate(is_close_pixel_by_pixel):
diff_indices = [c for c, elem in enumerate(row) if not np.all(elem == true_array)]
if len(diff_indices):
diff_black_white[r][diff_indices] = diff_pixel
nb_different_rows += 1
dist = np.linalg.norm(image_to_test - image_benchmark) / (image_to_test.shape[0] * image_to_test.shape[1])
if nb_different_rows > 0:
print("IS DIFFERERENT! THE DIFFERENCE IS (% OF ALL PIXELS)", dist * 100)
im = PIL.Image.fromarray(diff_black_white)
im.save(image_to_test_filename+'_diff.png')
del im
del image_benchmark
del image_to_test
del diff_black_white
gc.collect()
return dist, None