in android/spectrumtestutils/src/main/java/com/facebook/spectrum/testutils/ImageComparisonSsim.java [83:120]
private static float ssimForWindow(final int l, final int[] a, final int[] b) {
Preconditions.checkArgument(l == a.length);
Preconditions.checkArgument(l == b.length);
// calculate avg
float avgA = 0.0f, avgB = 0.0f;
for (int i = 0; i < l; i++) {
avgA += a[i];
avgB += b[i];
}
avgA /= (float) l;
avgB /= (float) l;
// calculate variance
float varA = 0.0f, varB = 0.0f;
for (int i = 0; i < l; i++) {
final float ta = a[i] - avgA;
final float tb = b[i] - avgB;
varA += ta * ta;
varB += tb * tb;
}
varA /= (float) l;
varB /= (float) l;
// calculate co-variance
float covAB = 0.0f;
for (int i = 0; i < l; i++) {
covAB += (a[i] - avgA) * (b[i] - avgB);
}
covAB /= (float) l;
// combine in SSIM formula
final float t1 = 2 * avgA * avgB + SSIM_C1;
final float t2 = 2 * covAB + SSIM_C2;
final float t3 = avgA * avgA + avgB * avgB + SSIM_C1;
final float t4 = varA + varB + SSIM_C2;
return (t1 * t2) / (t3 * t4);
}