最近研究了下计算机视觉、图像对比参考了一下py的一些源码和思路等信息学习学习。
但是呢只能对应相似度、稍微改一改剪切了图片后的就变化差异比较大,对目前自己的需求来说不是很有作用,顺带整理分享一下。
如上图:图一:喵1.jpg 图二: g喵1.jpg 图三:喵3.jpg 图四:喵2.jpg(带着后冠的女王喵耶、必须单独一行)

代码执行结果如下:
对比后的相似度,相似度越高,图片越接近,达到1.0说明图片完全相同。
(下图为剪切的布偶喵咪和原猫咪对比)效果你肯定想着还可以的吧、但其实不算理想咯。

上下图、另一个不一样的猫咪对比。
可可爱爱的两个猫咪对比后:还没有0.5没一半、过分了喔、可能因为颜色不一样了?但是姿势角度是一样的?差异那么多? 嗯、下面有提供一些思路一起研究啦。。。

那就接下来继续第三只猫咪吧、冲鸭~

结果可以看到、当前的第三只可爱小猫咪和第二只对比过的相似度是差不多的。唉。。。 数据啊结果啊、总是那么的不如意。。。
反正都对比了就把女王喵和猫2好对比一下看看咯:这个摆明不一样的啦、

![]()
这个结果还是自己认为的妥妥的、对应上了。
计算两幅图片的相似度总结参考:
猫咪对比的代码参考、互学共进步、顺带自己记录一下 稳稳的
from PIL import Image
import glob
import os
class CompareImage():
def calculate(self, image1, image2):
g = image1.histogram()
s = image2.histogram()
assert len(g) == len(s), "error"
data = []
for index in range(0, len(g)):
if g[index] != s[index]:
data.append(1 - abs(g[index] - s[index]) / max(g[index], s[index]))
else:
data.append(1)
return sum(data) / len(g)
def split_image(self, image, part_size):
pw, ph = part_size
w, h = image.size
sub_image_list = []
assert w % pw == h % ph == 0, "error"
for i in range(0, w, pw):
for j in range(0, h, ph):
sub_image = image.crop((i, j, i + pw, j + ph)).copy()
sub_image_list.append(sub_image)
return sub_image_list
def compare_image(self, file_image1, file_image2, size=(256, 256), part_size=(64, 64)):
'''
'file_image1'和'file_image2'是传入的文件路径
可以通过'Image.open(path)'创建'image1' 和 'image2' Image 对象.
'size' 重新将 image 对象的尺寸进行重置,默认大小为256 * 256 .
'part_size' 定义了分割图片的大小.默认大小为64*64 .
返回值是 'image1' 和 'image2'对比后的相似度,相似度越高,图片越接近,达到1.0说明图片完全相同。
'''
image1 = Image.open(file_image1)
image2 = Image.open(file_image2)
#调用"split_image"函数,把图片切割,并分别放在数组中
img1 = image1.resize(size).convert("RGB")
sub_image1 = self.split_image(img1, part_size)
img2 = image2.resize(size).convert("RGB")
sub_image2 = self.split_image(img2, part_size)
sub_data = 0
#把切割好的照片,从数组中一一对应的提出来,传入"calculate"函数,做直方图比较
for im1, im2 in zip(sub_image1, sub_image2):
sub_data += self.calculate(im1, im2)
x = size[0] / part_size[0]
y = size[1] / part_size[1]
pre = round((sub_data / (x * y)), 6)
# print(str(pre * 100) + '%')
if pre<0.3:
os.remove(fp[k])
print('Compare the image result is: ' + str(pre))
return pre
if __name__ == '__main__':
img1 = '/Users/yizhilaomuzhu/Downloads/喵2.jpg'
img2 = '/Users/yizhilaomuzhu/Downloads/喵3.jpg'
compare_image = CompareImage()
compare_image.compare_image(img1,img2)
======================================== 分割线 ================================================
OpenCV 进行图像相似度对比的几种办法、对应的一些关联、定期更新咯
1、直方图方法
方法描述:有两幅图像 patch (当然也可是整幅图像),分别计算两幅图像的直方图,并将直方图进行归一化,然后按照某种距离度量的标准进行相似度的测量。
方法的思想:基于简单的向量相似度来对图像相似度进行度量。
优点:直方图能够很好的归一化,比如 256 个 bin 条,那么即使是不同分辨率的图像都可以直接通过其直方图来计算相似度,计算量适中。比较适合描述难以自动分割的图像。
缺点:直方图反应的是图像灰度值得概率分布,并没有图像的空间位置信息在里面,因此,常常出现误判;从信息论来讲,通过直方图转换,信息丢失量较大,因此单一的通过直方图进行匹配显得有点力不从心。
2、图像模板匹配
一般而言,源图像与模板图像 patch 尺寸一样的话,可以直接使用上面介绍的图像相似度测量的方法;如果源图像与模板图像尺寸不一样,通常需要进行滑动匹配窗口,扫面个整幅图像获得最好的匹配 patch。
在 OpenCV 中对应的函数为:matchTemplate ():函数功能是在输入图像中滑动窗口寻找各个位置与模板图像 patch 的相似度。
3、PSNR 峰值信噪比
PSNR(Peak Signal to Noise Ratio),一种全参考的图像质量评价指标。
简介:https://en.wikipedia.org/wiki/Peak_signal-to-noise_ratio
PSNR 是最普遍和使用最为广泛的一种图像客观评价指标,然而它是基于对应像素点间的误差,即基于误差敏感的图像质量评价。由于并未考虑到人眼的视觉特性(人眼对空间频率较低的对比差异敏感度较高,人眼对亮度对比差异的敏感度较色度高,人眼对一个区域的感知结果会受到其周围邻近区域的影响等),因而经常出现评价结果与人的主观感觉不一致的情况。
4、SSIM(structural similarity)结构相似性
也是一种全参考的图像质量评价指标,它分别从亮度、对比度、结构三方面度量图像相似性。
SSIM 取值范围 [0,1],值越大,表示图像失真越小.
在实际应用中,可以利用滑动窗将图像分块,令分块总数为 N,考虑到窗口形状对分块的影响,采用高斯加权计算每一窗口的均值、方差以及协方差,然后计算对应块的结构相似度 SSIM,最后将平均值作为两图像的结构相似性度量,即平均结构相似性 MSSIM:
5、感知哈希算法
(perceptual hash algorithm)
http://blog.csdn.net/fengbingchun/article/details/42153261
感知哈希算法 (perceptual hash algorithm),它的作用是对每张图像生成一个 “指纹”(fingerprint) 字符串,然后比较不同图像的指纹。结果越接近,就说明图像越相似。
实现步骤:
- 缩小尺寸:将图像缩小到 8*8 的尺寸,总共 64 个像素。这一步的作用是去除图像的细节,只保留结构 / 明暗等基本信息,摒弃不同尺寸 / 比例带来的图像差异;
- 简化色彩:将缩小后的图像,转为 64 级灰度,即所有像素点总共只有 64 种颜色;
- 计算平均值:计算所有 64 个像素的灰度平均值;
- 比较像素的灰度:将每个像素的灰度,与平均值进行比较,大于或等于平均值记为 1,小于平均值记为 0;
- 计算哈希值:将上一步的比较结果,组合在一起,就构成了一个 64 位的整数,这就是这张图像的指纹。组合的次序并不重要,只要保证所有图像都采用同样次序就行了;
- 得到指纹以后,就可以对比不同的图像,看看 64 位中有多少位是不一样的。在理论上,这等同于” 汉明距离”(Hamming distance, 在信息论中,两个等长字符串之间的汉明距离是两个字符串对应位置的不同字符的个数)。如果不相同的数据位数不超过 5,就说明两张图像很相似;如果大于 10,就说明这是两张不同的图像。
以上内容摘自:http://www.ruanyifeng.com/blog/2011/07/principle_of_similar_image_search.html
本文介绍了使用OpenCV进行图像相似度对比的几种方法,包括直方图对比、图像模板匹配、PSNR峰值信噪比、SSIM结构相似性和感知哈希算法。通过案例展示了这些方法在不同场景下的应用效果,如猫咪图像的对比,讨论了各自的优缺点和适用范围。




1万+

被折叠的 条评论
为什么被折叠?



