| 50 | |
| 51 | |
| 52 | def ssim(img1, img2): |
| 53 | C1 = (0.01 * 255)**2 |
| 54 | C2 = (0.03 * 255)**2 |
| 55 | |
| 56 | img1 = img1.astype(np.float64) |
| 57 | img2 = img2.astype(np.float64) |
| 58 | kernel = cv2.getGaussianKernel(11, 1.5) |
| 59 | window = np.outer(kernel, kernel.transpose()) |
| 60 | |
| 61 | mu1 = cv2.filter2D(img1, -1, window)[5:-5, 5:-5] # valid |
| 62 | mu2 = cv2.filter2D(img2, -1, window)[5:-5, 5:-5] |
| 63 | mu1_sq = mu1**2 |
| 64 | mu2_sq = mu2**2 |
| 65 | mu1_mu2 = mu1 * mu2 |
| 66 | sigma1_sq = cv2.filter2D(img1**2, -1, window)[5:-5, 5:-5] - mu1_sq |
| 67 | sigma2_sq = cv2.filter2D(img2**2, -1, window)[5:-5, 5:-5] - mu2_sq |
| 68 | sigma12 = cv2.filter2D(img1 * img2, -1, window)[5:-5, 5:-5] - mu1_mu2 |
| 69 | |
| 70 | ssim_map = ((2 * mu1_mu2 + C1) * (2 * sigma12 + C2)) / ((mu1_sq + mu2_sq + C1) * |
| 71 | (sigma1_sq + sigma2_sq + C2)) |
| 72 | return ssim_map.mean() |
| 73 | |
| 74 | |
| 75 | def calculate_ssim(img1, img2): |