Python图片比较无论大小
我有两张图片,我想知道它们是否不同,想要一个简单的回答(对或错)。这两张图片的大小不一样。
2 个回答
-1
没有一种方法是完美的,但你可以尝试以下步骤:
- 先确定一个样本大小,这个大小是根据图片的百分比来定义的。
- 然后决定你想要取多少个样本。
- 把样本区域分布到两张图片上。
- 在每个样本区域内,计算所有像素的颜色值的平均值。
- 对于每对平均的样本区域颜色值,检查它们是否在一个小的误差范围内相等。
- 设定一个阈值,来决定匹配的样本数量,这个数量要在你能接受的假阴性和假阳性之间找到平衡。
- 如果达到这个阈值,就返回一个结果表示这两张图片匹配;如果没有达到,就返回一个结果表示它们不匹配。
举个例子,假设你有两张图片,大小分别是100X100和200X200,你决定在每个维度上取10%的样本,想要4个样本。你将会平均并比较:
- 从x0到x9,y0到y9的区域与从x0到x19,y0到y19的区域。
- 从x90到x99,y0到y9的区域与从x180到x199,y0到y19的区域。
- 从x0到x9,y90到y99的区域与从x0到x9,y180到y199的区域。
- 从x90到x99,y90到y99的区域与从x180到x199,y180到y199的区域。
10
这里有一个简单的方法:把最大的图片调整到和最小的图片一样大,然后进行比较。
考虑以下四张图片,我们分别把它们编号为1到4:
要比较两张图片 i
和 j
,首先把较大的那张调整到和另一张一样的大小,可以使用3个叶片的lanczos算法,这个在 PIL
中很方便,只需用 img1.resize(img2.size, Image.ANTIALIAS)
这个命令就可以了。接下来,你可以用一些指标来进行比较,比如在这个链接中提到的。
以下是使用SSIM和NRMSE这两个指标得到的相似度结果:
图片1
-> 2: [0.98, 0.97];
-> 3: [0.96, 0.98];
-> 4: [0.99, 0.99];
图片2:
-> 3: [0.98, 0.97];
-> 4: [0.98, 0.93];
图片3:
-> 4: [0.97, 0.98].
这些值的最大值是1,说明根据这些指标,图片是完全相同的。所以,你可以看到,这些值都很接近1。你只需要选择一个接近1的阈值,如果某个指标的结果超过这个阈值,就返回 True
,否则返回 False
。