检测相似图像
可能重复的问题:
图像比较算法
我需要写一个程序,来检查两张图片是否相同。看看下面这两张图片:
http://i221.photobucket.com/albums/dd298/ramdeen32/starry_night.jpg
http://i221.photobucket.com/albums/dd298/ramdeen32/starry_night2.jpg
这两张图片其实是一样的,但我该怎么检查它们是否相同呢?我只能使用媒体功能。现在我能想到的就是比较它们的宽度和高度,然后逐个像素比较RGB颜色,但这样的话颜色会不会不一样呢?
我对此完全没有头绪,任何帮助都非常感谢。
*注意,这个程序必须用Python编写,并且要使用(媒体库)
3 个回答
我觉得John Wordsworth的回答中的第二步可能是最难的部分之一——在这里你需要处理的是一张被拉伸过的图片,但你是否还要考虑旋转、裁剪或者其他方式扭曲的图片呢?如果是这样的话,你就需要一个特征匹配算法,比如Hugin或其他全景制作软件中使用的那种。这种算法可以找到匹配的特征,进行扭曲调整,然后你就可以进行其他比较的步骤。理想情况下,你希望能从照片中识别出梵高的画作,甚至是印在杯子上的照片!人类很容易做到这一点,但对计算机来说,这需要更复杂的数学运算。
ImageMagick 是一个可以处理图片的软件,它有专门为 Python 设计的接口和比较功能。这样的话,大部分的工作都可以由它来完成,不过我自己在 Python 里还没用过这个工具。
哇,这个问题真是个大难题,而且有很多可能的解决办法。我不是Python方面的专家,但我觉得你的问题很有意思,所以我想分享一个如果我遇到这个问题会用的方法。
显然,你发的这两张图片其实是很不一样的,所以你需要考虑“差别有多大才算一样”,特别是在处理图片时,还要考虑不同的图片格式和压缩等问题。
总之,如果要找出颜色值之间的差异(但不允许像素位置错位),我会这样做:
选择两张图片。
把较大的那张图片调整到和第一张完全一样的高度和宽度(必要时可以拉伸图片)。
可能的话,把图片转换成灰度图,这样后面的步骤会简单一些,同时效果也不会差太多。其实,这里也可以尝试进行边缘检测。
逐个检查两张图片中的每个像素,记录下每个RGB通道的差异,或者只记录灰度强度的差异。最后会得到一个和图片大小一样的数组,里面记录了两张图片中像素强度的差异。
现在,我不太清楚具体的数值,但你可以遍历这个数组,看看两张图片中每个像素的差异是否相同(或者差不多相同)。也许可以先遍历一次数组,找出两张图片中像素强度的平均差异,然后再遍历一次,看看90%的差异是否在某个阈值范围内(比如5%的差异?)。
这只是一个想法。当然,可能还有一些我不知道的好函数可以让这个过程变得简单,但我不会抱太大希望!