| 667 | |
| 668 | |
| 669 | def ssim(img1, img2): |
| 670 | C1 = (0.01 * 255)**2 |
| 671 | C2 = (0.03 * 255)**2 |
| 672 | |
| 673 | img1 = img1.astype(np.float64) |
| 674 | img2 = img2.astype(np.float64) |
| 675 | kernel = cv2.getGaussianKernel(11, 1.5) |
| 676 | window = np.outer(kernel, kernel.transpose()) |
| 677 | |
| 678 | mu1 = cv2.filter2D(img1, -1, window)[5:-5, 5:-5] # valid |
| 679 | mu2 = cv2.filter2D(img2, -1, window)[5:-5, 5:-5] |
| 680 | mu1_sq = mu1**2 |
| 681 | mu2_sq = mu2**2 |
| 682 | mu1_mu2 = mu1 * mu2 |
| 683 | sigma1_sq = cv2.filter2D(img1**2, -1, window)[5:-5, 5:-5] - mu1_sq |
| 684 | sigma2_sq = cv2.filter2D(img2**2, -1, window)[5:-5, 5:-5] - mu2_sq |
| 685 | sigma12 = cv2.filter2D(img1 * img2, -1, window)[5:-5, 5:-5] - mu1_mu2 |
| 686 | |
| 687 | ssim_map = ((2 * mu1_mu2 + C1) * (2 * sigma12 + C2)) / ((mu1_sq + mu2_sq + C1) * |
| 688 | (sigma1_sq + sigma2_sq + C2)) |
| 689 | return ssim_map.mean() |
| 690 | |
| 691 | |
| 692 | ''' |