Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- from PIL import Image
- from PIL import ImageChops
- from os import listdir
- from os.path import isfile, join
- import numpy as np
- import sys
- def pixel_diff(image_a, image_b):
- diff = ImageChops.difference(image_a.convert('L'), image_b.convert('L'))
- diff = diff.convert('L')
- return diff
- def total_histogram_diff(pixel_diff):
- return sum(i * n for i, n in enumerate(pixel_diff.histogram()))
- def image_diff(image_a, image_b):
- if isinstance(image_a, str):
- image_a = Image.open(image_a)
- if isinstance(image_b, str):
- image_b = Image.open(image_b)
- histogram_diff = total_histogram_diff(pixel_diff(image_a, image_b))
- return histogram_diff
- def is_equal(image_a, image_b, tolerance=0.0):
- return image_diff_percent(image_a, image_b) <= tolerance
- def image_diff_percent(image_a, image_b):
- if isinstance(image_a, str):
- image_a = Image.open(image_a)
- if isinstance(image_b, str):
- image_b = Image.open(image_b)
- input_images_histogram_diff = image_diff(image_a, image_b)
- black_reference_image = Image.new('RGB', image_a.size, (0, 0, 0))
- white_reference_image = Image.new('RGB', image_a.size, (255, 255, 255))
- worst_bw_diff = image_diff(black_reference_image, white_reference_image)
- percentage_histogram_diff = (input_images_histogram_diff / float(worst_bw_diff)) * 100
- return percentage_histogram_diff
- def hash_to_string(x):
- ret = ''
- for i in x.reshape(-1):
- if i == True:
- ret+='1'
- else:
- ret+='0'
- return ret
- def diff(image_a, image_b):
- res = 0
- if isinstance(image_a, str):
- image_a = Image.open(image_a)
- if isinstance(image_b, str):
- image_b = Image.open(image_b)
- a_hash = average_hash(image_a)
- b_hash = average_hash(image_b)
- for i in range(len(a_hash)):
- if(a_hash[i] != b_hash[i]):
- res +=1
- return res
- def average_hash(image, hash_size=8):
- image = image.convert("RGB").resize((hash_size, hash_size), Image.ANTIALIAS)
- pixels = np.asarray(image)
- r = np.zeros(shape = (hash_size, hash_size), dtype = float)
- g = np.copy(r)
- b = np.copy(r)
- for i,j in np.ndindex(r.shape):
- r[i][j] = pixels[i][j][0]
- g[i][j] = pixels[i][j][1]
- b[i][j] = pixels[i][j][2]
- avg_r = r.mean()
- avg_g = g.mean()
- avg_b = b.mean()
- diff_r = r > avg_r
- diff_g = g > avg_b
- diff_b = b > avg_b
- return hash_to_string(diff_r) + hash_to_string(diff_g) + hash_to_string(diff_b)
- if ("--path" not in sys.argv):
- print("Arguments:")
- print("")
- print("\t\t--path PATH\t specifies path to images")
- print("\t\t--help, -h \t get some help")
- print("\n")
- exit()
- pathIndex = sys.argv.index("--path") + 1
- if ((pathIndex != len(sys.argv)) & (len(sys.argv) > 2)):
- pathToImages = sys.argv[pathIndex] + "\\"
- else:
- exit()
- imagesNames = [f for f in listdir(pathToImages) if isfile(join(pathToImages, f))]
- images = []
- for imageName in imagesNames:
- images.append(Image.open(pathToImages + imageName))
- results = []
- for i in range(len(images)):
- for j in range(i + 1, len(images)):
- if (is_equal(images[i], images[j])):
- results.append([i, j])
- elif (diff(images[i], images[j]) <=10 ):
- results.append([i,j])
- for result in results:
- print(imagesNames[result[0]] + " " + imagesNames[result[1]])
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement