# -*- coding: utf-8 -*- __author__ = '上海色宁' import cv2 import numpy as np import time import sys #相关操作 #由于使用的高斯函数圆对称,因此相关操作和卷积操作结果相同 def correlation(img,kernal): kernal_heigh = kernal.shape[0] kernal_width = kernal.shape[1] cor_heigh = img.shape[0] - kernal_heigh + 1 cor_width = img.shape[1] - kernal_width + 1 result = np.zeros((cor_heigh, cor_width), dtype=np.float64) for i in range(cor_heigh): for j in range(cor_width): result[i][j] = (img[i:i + kernal_heigh, j:j + kernal_width] * kernal).sum() return result #产生二维高斯核函数 #这个函数参考自:https://blog.csdn.net/qq_16013649/article/details/78784791 def gaussian_2d_kernel(kernel_size=11, sigma=1.5): kernel = np.zeros([kernel_size, kernel_size]) center = kernel_size // 2 if sigma == 0: sigma = ((kernel_size - 1) * 0.5 - 1) * 0.3 + 0.8 s = 2 * (sigma ** 2) sum_val = 0 for i in range(0, kernel_size): for j in range(0, kernel_size): x = i - center y = j - center kernel[i, j] = np.exp(-(x ** 2 + y ** 2) / s) sum_val += kernel[i, j] sum_val = 1 / sum_val return kernel * sum_val #ssim模型 def ssim(distorted_image,original_image,window_size=11,gaussian_sigma=1.5,K1=0.01,K2=0.03,alfa=1,beta=1,gama=1): distorted_image=np.array(distorted_image,dtype=np.float64) original_image=np.array(original_image,dtype=np.float64) if not distorted_image.shape == original_image.shape: raise ValueError("Input Imagees must has the same size") if len(distorted_image.shape) > 2: raise ValueError("Please input the images with 1 channel") kernal=gaussian_2d_kernel(window_size,gaussian_sigma) #求ux uy ux*uy ux^2 uy^2 sigma_x^2 sigma_y^2 sigma_xy等中间变量 ux=correlation(distorted_image,kernal) uy=correlation(original_image,kernal) distorted_image_sqr=distorted_image**2 original_image_sqr=original_image**2 dis_mult_ori=distorted_image*original_image uxx=correlation(distorted_image_sqr,kernal) uyy=correlation(original_image_sqr,kernal) uxy=correlation(dis_mult_ori,kernal) ux_sqr=ux**2 uy_sqr=uy**2 uxuy=ux*uy sx_sqr=uxx-ux_sqr sy_sqr=uyy-uy_sqr sxy=uxy-uxuy C1=(K1*255)**2 C2=(K2*255)**2 #常用情况的SSIM if(alfa==1 and beta==1 and gama==1): ssim=(2*uxuy+C1)*(2*sxy+C2)/(ux_sqr+uy_sqr+C1)/(sx_sqr+sy_sqr+C2) return np.mean(ssim) #计算亮度相似性 l=(2*uxuy+C1)/(ux_sqr+uy_sqr+C1) l=l**alfa #计算对比度相似性 sxsy=np.sqrt(sx_sqr)*np.sqrt(sy_sqr) c=(2*sxsy+C2)/(sx_sqr+sy_sqr+C2) c=c**beta #计算结构相似性 C3=0.5*C2 s=(sxy+C3)/(sxsy+C3) s=s**gama ssim=l*c*s return np.mean(ssim) if __name__ == "__main__": start =time.clock() ssim_number = ssim(cv2.cvtColor(cv2.imread("_01.jpg"), cv2.COLOR_BGR2GRAY),cv2.cvtColor(cv2.imread("_--.jpg"), cv2.COLOR_BGR2GRAY)) print(ssim_number) ssim_number = ssim(cv2.cvtColor(cv2.imread("_01.jpg"), cv2.COLOR_BGR2GRAY),cv2.cvtColor(cv2.imread("_01.jpg"), cv2.COLOR_BGR2GRAY)) print(ssim_number) ssim_number = ssim(cv2.cvtColor(cv2.imread("_01.jpg"), cv2.COLOR_BGR2GRAY),cv2.cvtColor(cv2.imread("_02.jpg"), cv2.COLOR_BGR2GRAY)) print(ssim_number) ssim_number = ssim(cv2.cvtColor(cv2.imread("_01.jpg"), cv2.COLOR_BGR2GRAY),cv2.cvtColor(cv2.imread("_03.jpg"), cv2.COLOR_BGR2GRAY)) print(ssim_number) ssim_number = ssim(cv2.cvtColor(cv2.imread("_01.jpg"), cv2.COLOR_BGR2GRAY),cv2.cvtColor(cv2.imread("_04.jpg"), cv2.COLOR_BGR2GRAY)) print(ssim_number) ssim_number = ssim(cv2.cvtColor(cv2.imread("_01.jpg"), cv2.COLOR_BGR2GRAY),cv2.cvtColor(cv2.imread("_05.jpg"), cv2.COLOR_BGR2GRAY)) print(ssim_number) ssim_number = ssim(cv2.cvtColor(cv2.imread("_01.jpg"), cv2.COLOR_BGR2GRAY),cv2.cvtColor(cv2.imread("_06.jpg"), cv2.COLOR_BGR2GRAY)) print(ssim_number) ssim_number = ssim(cv2.cvtColor(cv2.imread("_01.jpg"), cv2.COLOR_BGR2GRAY),cv2.cvtColor(cv2.imread("_07.jpg"), cv2.COLOR_BGR2GRAY)) print(ssim_number) ssim_number = ssim(cv2.cvtColor(cv2.imread("_01.jpg"), cv2.COLOR_BGR2GRAY),cv2.cvtColor(cv2.imread("_08.jpg"), cv2.COLOR_BGR2GRAY)) print(ssim_number) ssim_number = ssim(cv2.cvtColor(cv2.imread("_01.jpg"), cv2.COLOR_BGR2GRAY),cv2.cvtColor(cv2.imread("_08.jpg"), cv2.COLOR_BGR2GRAY)) print(ssim_number) end = time.clock() print('Running time: %s Seconds'%(end-start)) img = cv2.imread("_--.jpg") print(img) ''' images = ['_--.jpg','_01.jpg','_02.jpg','_03.jpg','_04.jpg','_05.jpg','_06.jpg','_07.jpg','_08.jpg','_09.jpg'] start =time.clock() i = 0 while i < len(images): j = 0 while i+j < len(images): ssim_number = ssim(cv2.cvtColor(cv2.imread(images[i]), cv2.COLOR_BGR2GRAY),cv2.cvtColor(cv2.imread(images[i]), cv2.COLOR_BGR2GRAY)) print(ssim_number) print("ssim of "+images[i]+","+images[j]+" is: "+str(ssim_number)) j +=1 i +=1 end = time.clock() print('Running time: %s Seconds'%(end-start)) '''