如何拍摄一组像素并将它们组合成一个像素

时间:2012-12-12 11:59:44

标签: java image-processing

我试图创建一个程序,找到彼此相似的图像,然后我找到了一个网站(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编写这个程序。

1 个答案:

答案 0 :(得分:1)

有很多不同的interpolation/re-sampling techniques做降尺度 - 您可以根据您期望的结果选择一个。一个简单的就是Nearest neighbour interpolation:但由于简单,这不会导致非常详细的结果。

如果图片实际上是照片(而不是pixelart),则更高级的技术,即linear interpolationbiliniear interpolationbicubic 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