Reading and writing of pixels of BufferedImages
The problem comes from iteratively accessing your image object in your current manner.  Take a look below.  This is substantially faster.

import java.awt.image.BufferedImage;
import java.awt.image.DataBufferByte;


public class FastRGB {

private final int width;
private final int height;
private final boolean hasAlphaChannel;
private int pixelLength;
private final byte[] pixels;

public FastRGB(BufferedImage image) {
    pixels = ((DataBufferByte) image.getRaster().getDataBuffer()).getData();
    width = image.getWidth();
    height = image.getHeight();
    hasAlphaChannel = image.getAlphaRaster() != null;
    pixelLength = 3;
    if (hasAlphaChannel) {
        pixelLength = 4;
    }
}

public int getRGB(int x, int y) {
    int pos = (y * pixelLength * width) + (x * pixelLength);
    int argb = -16777216;
    if (hasAlphaChannel) {
        argb = (((int) pixels[pos++] &amp; 0xff) &lt;&lt; 24);
    }
    argb += ((int) pixels[pos++] &amp; 0xff);
    argb += (((int) pixels[pos++] &amp; 0xff) &lt;&lt; 8);
    argb += (((int) pixels[pos++] &amp; 0xff) &lt;&lt; 16);
    return argb;
}
}