我正在用Java编写照片马赛克。为此,我必须计算并比较2个图像的RGB,并用最合适的平铺图像替换目标图像。最合适的意思是,如果我们找不到精确的RGB匹配,则允许使用d
的错误。
我使用以下代码计算RGB:
protected static int calcRGBForEachFile(String filePath) throws IOException {
int RGBTotal = 0;
try{
BufferedImage tile = ImageIO.read(new File(filePath));
tileWidth = tile.getWidth();
tileHeight = tile.getHeight();
for(int i=0; i<tileWidth; i++){
for(int j=0; j<tileHeight; j++){
RGBTotal = getPixelData(tile.getRGB(i,j));
}
}
}
catch(IOException e){
System.out.println(e);
}
return RGBTotal;
}
protected static void getPixelData(int rgb) {
int red = (rgb >> 16) & 0xff;
int green = (rgb >> 8) & 0xff;
int blue = (rgb) & 0xff;
}
它的作用是从给定的路径中获取图像,计算其RGB并将其存储在HashMap
中。
有没有更好的方法来计算RGB并将它们与2张图像进行比较以获得更好的效果?
编辑:我根据一些评论编辑了我的问题。答案 0 :(得分:3)
根据人类感知(粗略地)比较图像的最佳方式之一是SSIM。
您也可以尝试比较每个像素的R,G和B值,并且稍加努力,根据人眼灵敏度对每种颜色进行加权(例如,参见Von Kries's method)。如果图像不是非常非常接近,并且尺寸相同,那么这将不会像您希望的那样有效。
我写了一个保存格式推荐程序(PNG vs JPG),ImageGuide,其(开放)源包含一个简单的图像比较算法,它可以用于其目的。它可能会帮助你开始。