Skip to content

Commit d63837e

Browse files
committed
Structure similarity example
- Added two images to check structure similarity - Added example code to calculate structure similarity
1 parent 78943ad commit d63837e

File tree

3 files changed

+54
-0
lines changed

3 files changed

+54
-0
lines changed

data/ssim-1.png

235 KB
Loading

data/ssim-2.png

77.7 KB
Loading

examples/getStructureSimilarity.js

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
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

Comments
 (0)