Android中的图像比较。

时间:2015-08-05 05:51:42

标签: image image-processing image-comparison

我是Android学习者。我正在尝试图像比较。它显示不同大小的相同图像的图像不相同,所以我使用createScaledBitmap(Bitmap src,int dstWidth,int dstHeight,boolean filter)重新缩放图像。即使在重新缩放之后,当我比较我得到的结果时,两个图像都是不同的。请帮帮我。

            bmpimg1 = BitmapFactory.decodeFile(path1);
            bmpimg2 = BitmapFactory.decodeFile(path2);

            int bm1Height = bmpimg1.getHeight();
            int bm1Width = bmpimg1.getWidth();
            int bm1Res = bm1Height * bm1Width;

            int bm2Height = bmpimg2.getHeight();
            int bm2Width = bmpimg2.getWidth();
            int bm2Res = bm2Height * bm2Width;

            if(bm1Res==bm2Res){
                Toast.makeText(getApplicationContext(), "Both Images Same Size", Toast.LENGTH_SHORT).show();

                if(bmpimg1.sameAs(bmpimg2)){
                    Toast.makeText(getApplicationContext(), "Same", Toast.LENGTH_LONG).show();
                }else{
                    Toast.makeText(getApplicationContext(), "Not Same", Toast.LENGTH_LONG).show();
                }
            }


           if (bm1Res > bm2Res)
            {
                    Bitmap rbm1 = Bitmap.createScaledBitmap(bmpimg1, bmpimg2.getWidth(), bmpimg2.getHeight(), true);
                    ImageView imageView1 = (ImageView) findViewById(R.id.image1);
                    imageView1.setImageBitmap(rbm1);
                    Toast.makeText(getApplicationContext(), "Image1 has to be Scaled", Toast.LENGTH_SHORT).show();

                    if(rbm1.sameAs(bmpimg2)){
                        Toast.makeText(getApplicationContext(), "Same", Toast.LENGTH_LONG).show();
                    }else{
                        Toast.makeText(getApplicationContext(), "Not Same", Toast.LENGTH_LONG).show();
                    }
            }

            if(bm1Res<bm2Res)
            {
                    Bitmap rbm2 = Bitmap.createScaledBitmap(bmpimg2, bmpimg1.getWidth(), bmpimg1.getHeight(), true);
                    ImageView imageView2 = (ImageView) findViewById(R.id.image2);
                    imageView2.setImageBitmap(rbm2);
                    Toast.makeText(getApplicationContext(), "Image2 has to be Scaled", Toast.LENGTH_SHORT).show();

                    if(bmpimg1.sameAs(rbm2)) {
                        Toast.makeText(getApplicationContext(), "Same", Toast.LENGTH_LONG).show();
                    }else{
                        Toast.makeText(getApplicationContext(), "Not Same", Toast.LENGTH_LONG).show();
                    }
            }

1 个答案:

答案 0 :(得分:1)

更新了答案

为了回答你的评论中的问题,有各种方法 - 这取决于你实际想要达到的目标......你是否需要检测相对于彼此旋转的图像,或者模糊,或平滑,或篡改。有些方法是......

感知哈希 - 您为所有图片创建哈希并计算图像之间的距离。请参阅here以及有关pHash的评论。

平均颜色 - 您计算图像的平均(或平均)颜色并比较均值 - 这种方法非常简单。

RMSE或类似的 - 您计算所有像素的均方根误差并查找低值以指示图像相似。使用ImageMagick可以轻松完成此方法和上述所有方法。参见并投票选出Kurt(@KurtPfeifle)优秀,全面的答案here

功能 - 您可以在图片中找到形状和功能并进行比较 - 尝试使用Google搜索"SIFT"

原始答案

这不是您的代码问题,它是信息丢失的根本问题。如果将图像调整为较小的尺寸,通常会丢失信息,因为较小的图像不能包含与较大图像相同的信息量。有很多事情可以发生......

色彩损失

想象一下,你有一个可爱的大1000x1000图像,平滑渐变,相应的数百万种颜色如下:

enter image description here

如果您现在将其调整为32x32的图像,它现在最多只能包含1,024种颜色,所以当您再次调整它时,您可能会得到类似的结果:

enter image description here

现在你可以看到条纹已经发生 - 颜色聚集在一起,形成较小图像可以容纳的较少数量的颜色。

<强>格式

调整图像大小时,执行此操作的程序可能会从每像素24位真彩色图像更改为仅有256种或更少颜色的图像。图像可能看起来相同,但不一定相同。

还与格式有关,您可以调整图像大小并使用不能包含原始所有功能的不同图像格式,然后在您再次调整大小时它们将丢失。例如,您的原始图片可能是具有透明度的PNG,并且您可能已将其调整为JPEG,但不能包含透明度,然后将其重新调整为PNG并将其调整为var_dump(\DateTime::createFromFormat(\DateTime::ISO8601, '-0001-11-30T00:00:00+0100')); 将失去。

解决/详情

如果图像中有明文或细节,则可能会丢失。假设你从这开始:

enter image description here

并调整大小然后再次备份,你可能会得到这个,因为较小的图像无法保存细节。同样,这意味着您的比较将无法发现它们是相同的图像。

enter image description here

同样简单的线条......

enter image description here

缩小规模并重新升级

enter image description here