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