import cv2
from PIL import Image
from numpy import average, dot, linalg
from skimage.metrics import peak_signal_noise_ratio as psnr
from skimage.metrics import structural_similarity as ssim
def calc_similar(image1, image2):
def hist_similar(lh, rh):
assert len(lh) == len(rh)
return sum(1 - (0 if l == r else float(abs(l - r)) / max(l, r)) for l, r in zip(lh, rh)) / len(lh)
def imgread(image, size=(256, 256)):
img = Image.open(image)
return img.resize(size).convert('RGB')
li, ri = imgread(image1), imgread(image2)
return hist_similar(li.histogram(), ri.histogram())
def calc_cosin(image1, image2):
def get_thum(image, size=(64, 64), greyscale=False):
image = Image.open(image).convert('RGB')
image = image.resize(size, Image.ANTIALIAS)
if greyscale:
image = image.convert('L')
return image
image1 = get_thum(image1)
image2 = get_thum(image2)
images = [image1, image2]
vectors = []
norms = []
for image in images:
vector = []
for pixel_tuple in image.getdata():
vector.append(average(pixel_tuple))
vectors.append(vector)
norms.append(linalg.norm(vector, 2))
a, b = vectors
a_norm, b_norm = norms
res = dot(a / a_norm, b / b_norm)
return res
def imgread(image):
image = cv2.imread(image)
image = cv2.resize(image, (256,256))
image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
return image
# img1, img2 = './nsfw/2.jpg', './nsfw/3.jpg'
hist = calc_similar(img1, img2)
cosin = calc_cosin(img1, img2)
psnr = psnr(imgread(img1), imgread(img2), data_range=255)
ssim = ssim(imgread(img1), imgread(img2), data_range=255)
print(f'hist:{hist} cosin:{cosin} psnr:{psnr} ssim:{ssim}')