private static float ssimForWindow()

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);
  }