| 245 | |
| 246 | |
| 247 | def ssim(img1, img2): |
| 248 | C1 = (0.01 * 255)**2 |
| 249 | C2 = (0.03 * 255)**2 |
| 250 | |
| 251 | img1 = img1.astype(np.float64) |
| 252 | img2 = img2.astype(np.float64) |
| 253 | kernel = cv2.getGaussianKernel(11, 1.5) |
| 254 | window = np.outer(kernel, kernel.transpose()) |
| 255 | |
| 256 | mu1 = cv2.filter2D(img1, -1, window)[5:-5, 5:-5] # valid |
| 257 | mu2 = cv2.filter2D(img2, -1, window)[5:-5, 5:-5] |
| 258 | mu1_sq = mu1**2 |
| 259 | mu2_sq = mu2**2 |
| 260 | mu1_mu2 = mu1 * mu2 |
| 261 | sigma1_sq = cv2.filter2D(img1**2, -1, window)[5:-5, 5:-5] - mu1_sq |
| 262 | sigma2_sq = cv2.filter2D(img2**2, -1, window)[5:-5, 5:-5] - mu2_sq |
| 263 | sigma12 = cv2.filter2D(img1 * img2, -1, window)[5:-5, 5:-5] - mu1_mu2 |
| 264 | |
| 265 | ssim_map = ((2 * mu1_mu2 + C1) * (2 * sigma12 + C2)) / ((mu1_sq + mu2_sq + C1) * |
| 266 | (sigma1_sq + sigma2_sq + C2)) |
| 267 | return ssim_map.mean() |
| 268 | |
| 269 | |
| 270 | def calculate_ssim(img1, img2): |