|
| 1 | +import {CV_32F, imread, Size} from '../'; |
| 2 | + |
| 3 | +// Ported from https://docs.opencv.org/2.4/doc/tutorials/gpu/gpu-basics-similarity/gpu-basics-similarity.html |
| 4 | +function getStructureSimilarity(i1, i2) { |
| 5 | + const C1 = 6.5025, C2 = 58.5225; |
| 6 | + /***************************** INITS **********************************/ |
| 7 | + const d = CV_32F; |
| 8 | + |
| 9 | + const I1 = i1.convertTo(d); // cannot calculate on one byte large values |
| 10 | + const I2 = i2.convertTo(d); |
| 11 | + |
| 12 | + const I2_2 = I2.hMul(I2); // I2^2 |
| 13 | + const I1_2 = I1.hMul(I1); // I1^2 |
| 14 | + const I1_I2 = I1.hMul(I2); // I1 * I2 |
| 15 | + |
| 16 | + /*************************** END INITS **********************************/ |
| 17 | + |
| 18 | + const mu1 = I1.gaussianBlur(new Size(11, 11), 1.5); |
| 19 | + const mu2 = I2.gaussianBlur(new Size(11, 11), 1.5); |
| 20 | + |
| 21 | + const mu1_2 = mu1.hMul(mu1); |
| 22 | + const mu2_2 = mu2.hMul(mu2); |
| 23 | + const mu1_mu2 = mu1.hMul(mu2); |
| 24 | + |
| 25 | + let sigma1_2 = I1_2.gaussianBlur(new Size(11, 11), 1.5); |
| 26 | + sigma1_2 = sigma1_2.sub(mu1_2); |
| 27 | + |
| 28 | + let sigma2_2 = I2_2.gaussianBlur(new Size(11, 11), 1.5); |
| 29 | + sigma2_2 = sigma2_2.sub(mu2_2); |
| 30 | + |
| 31 | + let sigma12 = I1_I2.gaussianBlur(new Size(11, 11), 1.5); |
| 32 | + sigma12 = sigma12.sub(mu1_mu2); |
| 33 | + |
| 34 | + ///////////////////////////////// FORMULA //////////////////////////////// |
| 35 | + |
| 36 | + let t1 = mu1_mu2.convertTo(-1, 2, C1); |
| 37 | + let t2 = sigma12.convertTo(-1, 2, C2); |
| 38 | + let t3 = t1.hMul(t2); |
| 39 | + |
| 40 | + t1 = mu1_2.addWeighted(1.0, mu2_2, 1.0, C1); |
| 41 | + t2 = sigma1_2.addWeighted(1.0, sigma2_2, 1.0, C2); |
| 42 | + t1 = t1.hMul(t2); |
| 43 | + |
| 44 | + const ssim_map = t3.hDiv(t1); |
| 45 | + const { y, x, w } = ssim_map.mean(); |
| 46 | + return [y, x, w].reduce((a, b) => a + b) / 3; |
| 47 | +} |
| 48 | + |
| 49 | +const i1 = imread('../data/ssim-1.png'); |
| 50 | +const i2 = imread('../data/ssim-2.png'); |
| 51 | + |
| 52 | +const structureSimilarity = getStructureSimilarity(i1, i2); |
| 53 | + |
| 54 | +console.log('SSIM: '+structureSimilarity); // Output: SSIM: 0.717 |
0 commit comments