ImageUtils { public static double[][] calcIntegralImage(BufferedImage source) { double[][] integralImage = new double[source.getHeight()][source.getWidth()]; Raster raster = source.getRaster(); int[] pixel = new int[raster.getNumBands()]; double leftNum; double upNum; double leftUpNum; for (int y = 0; y < source.getHeight(); y++) { for (int x = 0; x < source.getWidth(); x++) { leftNum = (x == 0) ? 0 : integralImage[y][x - 1]; upNum = (y == 0) ? 0 : integralImage[y - 1][x]; leftUpNum = (x == 0 || y == 0) ? 0 : integralImage[y - 1][x - 1]; try { integralImage[y][x] = leftNum + upNum + raster.getPixel(x, y, pixel)[0] - leftUpNum; } catch (Exception e) { e.printStackTrace(); } } } return integralImage; } private  ImageUtils(); static ImageComparedResult compare(BufferedImage image1, Rectangle imageArea1, BufferedImage image2,
			Rectangle imageArea2, CompareOption[] options); static boolean isContained(BufferedImage entireImage, BufferedImage partImage); static double[][] calcIntegralImage(BufferedImage source); static boolean imageEquals(BufferedImage image1, BufferedImage image2); static BufferedImage getMaskedImage(BufferedImage image, List<Rectangle> maskAreas); static BufferedImage getMarkedImage(BufferedImage image, DiffPoints diffPoints); static BufferedImage getDiffImage(BufferedImage leftImage, BufferedImage rightImage, DiffPoints diffPoints); static BufferedImage trim(BufferedImage image, int trimTop, int trimLeft, int trimBottom, int trimRight); static BufferedImage verticalMerge(List<BufferedImage> images); static BufferedImage merge(List<List<BufferedImage>> images); static int[] getRGB(BufferedImage image, int width, int height); static int[] toARGB(int pixel); static int toPixel(int[] argb); static int toPixel(int r, int g, int b); static int toPixel(int a, int r, int g, int b); static int detectBackgroundColor(BufferedImage b); static boolean getObjectRectangle(BufferedImage image, Rectangle rectangle); static double norm(int pixel1, int pixel2); static double[] countSubpixel(BufferedImage bimage); static void removeRedundantRectangles(List<Rectangle> rectangles, int xLimit, int yLimit); static void removeOverlappingRectangles(List<Rectangle> rectangles); static void reshapeRect(Rectangle rectangle, int xLimit, int yLimit); static Rectangle getTightDiffArea(Rectangle rectangle, int xLimit, int yLimit); static List<Rectangle> convertObjectGroupsToAreas(List<ObjectGroup> objectGroups); static List<ObjectGroup> convertDiffPointsToObjectGroups(DiffPoints DP, int group_distance); static BufferedImage getSubImage(BufferedImage image, Rectangle rectangle); static Offset findDominantOffset(BufferedImage expectedImage, BufferedImage actualImage, double diffThreshold); static BufferedImage getDominantImage(BufferedImage expectedImage, BufferedImage actualImage, Offset offset); static int getSizeRelationType(int expectedWidth, int expectedHeight, int actualWidth, int actualHeight);  }
@Test public void testCalcIntegralImage() throws Exception { BufferedImage source = ImageIO.read(getClass().getResource("ImageUtilsTest_calc_integral_image.png")); double[][] expected = { { 255.0, 255.0, 510.0, 765.0 }, { 510.0, 765.0, 1275.0, 1530.0 }, { 510.0, 1020.0, 1785.0, 2295.0 }, { 765.0, 1530.0, 2295.0, 3060.0 } }; double[][] actual = ImageUtils.calcIntegralImage(source); assertThat(actual, is(expected)); }