static float compareSsim()

in android/spectrumtestutils/src/main/java/com/facebook/spectrum/testutils/ImageComparisonSsim.java [37:76]


  /* package */ static float compareSsim(final Bitmap a, final Bitmap b) {
    Preconditions.checkArgument(a.getWidth() == b.getWidth());
    Preconditions.checkArgument(a.getHeight() == b.getHeight());

    final int w = a.getWidth();
    final int h = a.getHeight();
    Preconditions.checkArgument(w >= SSIM_WINDOW_SIZE);
    Preconditions.checkArgument(h >= SSIM_WINDOW_SIZE);

    final int l = SSIM_WINDOW_SIZE * SSIM_WINDOW_SIZE;
    int[] pixelsA = new int[l];
    int[] pixelsB = new int[l];
    int[] channelA = new int[l];
    int[] channelB = new int[l];

    float ssimSum = 0.0f;
    int ssimRuns = 0;

    for (int x = 0; x < w - SSIM_WINDOW_SIZE; x += SSIM_WINDOW_STEP) {
      for (int y = 0; y < h - SSIM_WINDOW_SIZE; y += SSIM_WINDOW_STEP) {
        a.getPixels(pixelsA, 0, SSIM_WINDOW_SIZE, x, y, SSIM_WINDOW_SIZE, SSIM_WINDOW_SIZE);
        b.getPixels(pixelsB, 0, SSIM_WINDOW_SIZE, x, y, SSIM_WINDOW_SIZE, SSIM_WINDOW_SIZE);

        for (int channel = 0; channel < 2; channel++) {
          final int shift = channel * 8;

          for (int i = 0; i < l; i++) {
            channelA[i] = (pixelsA[i] >> shift) & MASK_RIGHT_MOST_CHANNEL;
            channelB[i] = (pixelsB[i] >> shift) & MASK_RIGHT_MOST_CHANNEL;
          }

          final float ssim = ssimForWindow(l, channelA, channelB);
          ssimSum += ssim;
          ssimRuns += 1;
        }
      }
    }

    return ssimSum / (float) ssimRuns;
  }