我是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();
}
}
答案 0 :(得分:1)
更新了答案
为了回答你的评论中的问题,有各种方法 - 这取决于你实际想要达到的目标......你是否需要检测相对于彼此旋转的图像,或者模糊,或平滑,或篡改。有些方法是......
感知哈希 - 您为所有图片创建哈希并计算图像之间的距离。请参阅here以及有关pHash
的评论。
平均颜色 - 您计算图像的平均(或平均)颜色并比较均值 - 这种方法非常简单。
RMSE或类似的 - 您计算所有像素的均方根误差并查找低值以指示图像相似。使用ImageMagick可以轻松完成此方法和上述所有方法。参见并投票选出Kurt(@KurtPfeifle)优秀,全面的答案here。
功能 - 您可以在图片中找到形状和功能并进行比较 - 尝试使用Google搜索"SIFT"
。
原始答案
这不是您的代码问题,它是信息丢失的根本问题。如果将图像调整为较小的尺寸,通常会丢失信息,因为较小的图像不能包含与较大图像相同的信息量。有很多事情可以发生......
色彩损失
想象一下,你有一个可爱的大1000x1000图像,平滑渐变,相应的数百万种颜色如下:
如果您现在将其调整为32x32的图像,它现在最多只能包含1,024种颜色,所以当您再次调整它时,您可能会得到类似的结果:
现在你可以看到条纹已经发生 - 颜色聚集在一起,形成较小图像可以容纳的较少数量的颜色。
<强>格式强>
调整图像大小时,执行此操作的程序可能会从每像素24位真彩色图像更改为仅有256种或更少颜色的图像。图像可能看起来相同,但不一定相同。
还与格式有关,您可以调整图像大小并使用不能包含原始所有功能的不同图像格式,然后在您再次调整大小时它们将丢失。例如,您的原始图片可能是具有透明度的PNG
,并且您可能已将其调整为JPEG
,但不能包含透明度,然后将其重新调整为PNG
并将其调整为var_dump(\DateTime::createFromFormat(\DateTime::ISO8601, '-0001-11-30T00:00:00+0100'));
将失去。
解决/详情强>
如果图像中有明文或细节,则可能会丢失。假设你从这开始:
并调整大小然后再次备份,你可能会得到这个,因为较小的图像无法保存细节。同样,这意味着您的比较将无法发现它们是相同的图像。
同样简单的线条......
缩小规模并重新升级