package com.alibaba.simpleimage.analyze.harissurf; import java.awt.image.BufferedImage; import java.awt.image.WritableRaster; import java.io.Serializable; public class IntegralImage implements Serializable { private static final long serialVersionUID = 1L; private float[][] mIntImage; private int mWidth = -1; private int mHeight = -1; public float[][] getValues() { return mIntImage; } public int getWidth() { return mWidth; } public int getHeight() { return mHeight; } public float getValue(int column, int row) { return mIntImage[column][row]; } public IntegralImage(BufferedImage input) { mIntImage = new float[input.getWidth()][input.getHeight()]; mWidth = mIntImage.length; mHeight = mIntImage[0].length; int width = input.getWidth(); int height = input.getHeight(); WritableRaster raster = input.getRaster(); int[] pixel = new int[4]; float sum; for (int y = 0; y < height; y++) { sum = 0F; for (int x = 0; x < width; x++) { raster.getPixel(x, y, pixel); /** * TODO: FIX LOSS IN PRECISION HERE, DON'T ROUND BEFORE THE * DIVISION (OR AFTER, OR AT ALL) This was done to match the C++ * version, can be removed after confident that it's working * correctly. */ float intensity = Math.round((0.299D * pixel[0] + 0.587D * pixel[1] + 0.114D * pixel[2])) / 255F; sum += intensity; if (y == 0) { mIntImage[x][y] = sum; } else { mIntImage[x][y] = sum + mIntImage[x][y - 1]; } } } } }