wangzhibo
2022-03-14 9d97a15f5d295e2bc44427fd18bdbaf94b23b57f
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
# -*- 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))
    '''