我试图创建一个程序,找到彼此相似的图像,然后我找到了一个网站(http://www.hackerfactor.com/blog/index.php?/archives/432-Looks-Like-It.html),它提供了创建图像指纹的功能的步骤,第一步是将图像的大小缩小为8 x 8(64像素)图像,但我无法弄清楚如何将一组像素转换为一个像素,例如
[(R,G,B)][(R,G,B)][(R,G,B)]
[(R,G,B)][(R,G,B)][(R,G,B)]
[(R,G,B)][(R,G,B)][(R,G,B)]
取这组像素,每个像素都有不同的R,G和B值,如何将它们全部取出并将它们转换成一组值,例如。
[(R,G,B)]
我想也许可以添加所有的R,G和B值,然后将它们平均,但这似乎很简单,任何人都知道如何做到这一点?我正在用java编写这个程序。
答案 0 :(得分:1)
有很多不同的interpolation/re-sampling techniques做降尺度 - 您可以根据您期望的结果选择一个。一个简单的就是Nearest neighbour interpolation:但由于简单,这不会导致非常详细的结果。
如果图片实际上是照片(而不是pixelart),则更高级的技术,即linear interpolation,biliniear interpolation或bicubic interpolation更适合。但链接中缩小的图像也没有太多细节 - 所以最近的邻居似乎已经足够了(至少从一开始就是这样)。
public int[] resizePixels(int[] pixels,int w1,int h1,int w2,int h2) {
int[] temp = new int[w2*h2] ;
double x_ratio = w1/(double)w2 ;
double y_ratio = h1/(double)h2 ;
double px, py ;
for (int i=0;i<h2;i++) {
for (int j=0;j<w2;j++) {
px = Math.floor(j*x_ratio) ;
py = Math.floor(i*y_ratio) ;
temp[(i*w2)+j] = pixels[(int)((py*w1)+px)] ;
}
}
return temp ;
}
此java函数采用像素值数组(原始大小 - w1和h1)并返回最近的邻居(向上/向下) - 尺寸为w2 x h2的像素数组。另见:here。