OpenCV - 检查两个图像是否 100% 相同的最快方法

mil*_*n m 9 c++ python opencv

这里有很多问题可以检查两个图像是否“几乎”相似。

我的任务很简单。使用 OpenCV,我想确定两个图像是否 100% 相同。

它们的大小相同,但可以使用不同的文件名保存。

Had*_*adi 9

您可以使用像xor运算符这样的逻辑运算符。如果您正在使用python,则可以使用以下单行功能:

Python

def is_similar(image1, image2):
    return image1.shape == image2.shape and not(np.bitwise_xor(image1,image2).any())
Run Code Online (Sandbox Code Playgroud)

whereshape是显示矩阵大小的属性,bitwise_xor顾名思义。C++ 版本可以用类似的方式制作!

C++

请参阅@berak 代码。


注意:该Python代码适用于任何深度图像(1-D、2-D、3-D、..),但该C++版本仅适用于 2-D 图像。自己将其转换为任何深度图像很容易。我希望这能给你洞察力!:)

文档bitwise_xor

编辑C++已删除。感谢@Micka 和@berak 的评论。


ber*_*rak 7

差异的总和应为 0(对于所有通道):

bool equal(const Mat & a, const Mat & b)
{
    if ( (a.rows != b.rows) || (a.cols != b.cols) )
        return false;
    Scalar s = sum( a - b );
    return (s[0]==0) && (s[1]==0) && (s[2]==0);
}
Run Code Online (Sandbox Code Playgroud)

  • 我不认为这是正确的。如果 `a == [[1, -1]]` 和 `b == [[0, 0]]` 不会通过? (5认同)
  • 我应该听你的,@Geoff…这就是[对我来说更好](/sf/answers/3095309101/)的方法。@berak,你的代码运行良好,但是当“b”是“纯白色”时,我得到了假阴性...... (2认同)

小智 7

import cv2
import numpy as np
a = cv2.imread("picture1.png")
b = cv2.imread("picture2.png")
difference = cv2.subtract(a, b)    
result = not np.any(difference)
if result is True:
    print("Pictures are the same")
else:
    print("Pictures are different")
Run Code Online (Sandbox Code Playgroud)