怎样比较两个图片是否一样?(200分)

  • 主题发起人 主题发起人 sleepy
  • 开始时间 开始时间
S

sleepy

Unregistered / Unconfirmed
GUEST, unregistred user!
我只关心两幅图片看上去是否一样,而不关心图片的格式。
有什么好的方法吗?

另外, 两个ico文件的比较是否有更简便的方法? 谢谢!!
 
两幅图片都变成bmp(应该无损转换),比较字节,我以前是这样做的。
ico,看是否每个字节都一样,如果一样那么它们相同。
 
我也想过比较字节的方法, ico比较字节应该没有问题, 但是bmp我有些疑惑。

因为, 以前看见一个程序, 是把一个文件插入到bmp文件的缝隙中,所以两幅
看上去一样的bmp,文件尺寸也一样,但是字节却大不一样, 那怎样处理呢?
也就是说,怎样转换才能确保只要看上去一样,字节就一样呢?
 
这个很困难吧
本身“看上去一样”的概念就是很模糊,那只是人眼的一种辨识吧,
起码一些细微的就不行啦
 
我没有很高的要求。 如果精确一些更容易实现的话, 那就是两幅图片在各象素点
上一模一样。
 
不知你到底想怎样,
我写几句伪 code 吧:

function CompBitMap : boolean;
var P : PByteArray;
begin
result := false;
1: 载入BMP文件:
Image1.Picture.BitMap.LoadFromFile('c;/sample.bmp');
Image2.Picture.BitMap.LoadFromFile('c;/sample2.bmp');

2: 比较大小,如大小不一样,则无需比较内容:

if ( Image1.Picture.BitMap.Height <> Image2.Picture.BitMap.Height )
or ( Image1.Picture.BitMap.Width <> Image2.Picture.BitMap.Width ) then Exit;

3: 逐一比较象素:
for y := 0 to Image1.Picture.BitMap.Height - 1 do
begin
p := Image1.Picture.BitMap.ScanLine[y];
p2 := Image2.Picture.BitMap.ScanLine[y];
for x := 0 to Image1.Picture.BitMap.width -1 do
begin
if P[x] <> P2[x] then exit;
end;
end;

result := true;

end;


这段code我随手写的,肯定有点问题,不过就这个意思 可以比较 BMP文件了。
 
你可以用xor两张图的方法来看一下是否一样,
也就是说如果完全一样生成的图为黑色吧,好像是好长时间不用了
然后把生成的图输出为另一的.bmp文件,看看里面的数据是不是都为‘0’
或者是一个很小的数,每一个像素的值,如果很小,小于某一个确定的值
你自己规定的,则可以说明两张图片是否看起来一样的,
如果判断是否完全一样
可以比较*.bmp文件,
别忘了给我一点分呀,我现在穷极了,还有好多问题要闻
 
把一些信息收藏到位图的原理是这样的.
因为人眼对颜色并不十分敏感.
而颜色中红蓝绿都有256个色阶,如果我只对前7位信息保留,而最后一位全部
置0的话,出来的效果人是分辩出来的.
正是这个原因,位图中的信息是极大冗余,可以利用这一个点3个位的空间去隐藏你的东西.

如果你是要比较经过这种处理的图片跟原图的话,就比较好办对每个字节进行异或(xor)
看是否每一个结果均是0或1,如果是可以肯定的说,这两张图片是表示同一事物的.

如果你不是指上面的经过这种处理的两张图片,那么就可能要用到模式识别中的东西,
首先提取两张图片的不变量,然后比较其不变量是否相同,相同就认为它们是同一事物.
 
反过来讲,你的两张标准相片,实际上是“相等”的,但是用像素判断是不相等的。

这就牵涉到“智能多媒体”的领域了,实际上如果媒体分析只是判断相等这么简单,就没有
什么意思了。

华东师大计算机系顾君忠教授开设的“多媒体概论”挺好的,去听听吧。
 
同意吕雪松的意见,比较两个图的相似,你无法很精确的,同样是jpeg的图,
压缩率梢有不一样,就不可能用比较相同,而框不一样的格式。这是模糊数学的概念,
建议你看一下有关方面的书,这是一个很大的课题。
 
如吕雪松、xygz所说的话,那就试图像识别的话题啦。也满有意思的,谁有这样的样例
或者控件啊,收购收购!
 
利用图象的均值,方差,或几种方法相结合,图象处理的书上有
 
TO 吕雪松:

"多媒体概论"在哪时听,网上能听到吗?
 
这个太难了,有个苯办法,可能对你有用。
先都转为灰度图,然后以一幅为准,改变另外一幅的使其平均灰度向第一幅靠拢,
再将所有像素相减,将差值的绝对值相加,如该值小于一个什么值,则可认为是
“看上去”一样。
 
procedure TForm1.Button1Click(Sender: TObject);
var
Bmp1,Bmp2 :TBitmap;
begin
Bmp1 :=TBitmap.Create;
Bmp1.LoadFromFile('e:/图片/end004.bmp');
Bmp2 :=TBitmap.Create;
Bmp2.LoadFromFile('e:/图片/yunwen3.bmp');
BitBlt(Bmp2.Canvas.Handle,0,0,Bmp2.Width,Bmp2.Height,Bmp1.Canvas.Handle,0,0,SRCINVERT);
Image1.Picture.Bitmap.Assign(Bmp2);
Bmp1.Free;
Bmp2.Free;
end;
 
结束吧,这么久了
 
都2003年啦!
 
后退
顶部