比较BGR图像是不是完全相同[重复]

Posted

技术标签:

【中文标题】比较BGR图像是不是完全相同[重复]【英文标题】:Compare if BGR image is exactly the same [duplicate]比较BGR图像是否完全相同[重复] 【发布时间】:2019-06-27 23:08:31 【问题描述】:

我正在尝试编写代码来确定两个图像是否相同。我能够以BGR 的形式读取图像,并且能够从另一个中减去一个。我需要检查一下差异是否只包含零。我知道有一个名为countNonZero 的函数,但它只适用于单通道,而不适用于 3 通道。我的一个解决方案是遍历整个矩阵并检查是否一切都为零,但这太慢了。有什么有效的检查方法吗?下面是我的代码。

int main(int argc, char** argv)

  if(argc != 3)
  
    printf("usage: DisplayImage.out <testImg.png> <copy.png>\n");
    return -1; 
  

  Mat image;
  Mat copy;
  Mat output;

  image = imread(argv[1], 1); 
  copy = imread(argv[2], 1); 

  absdiff(image, copy, output);

  if(countNonZero(output) == 0)
  
    cout << "Same" << endl;
  
  else
  
    cout << "Different" << endl;
  

  imshow("outut", output);
  waitKey();
  return 0;

【问题讨论】:

如果我这样做,我会读取文件,然后开始在 for 循环中比较每个 CPU 大小的数据字。一旦发现差异,退出。如果你到达终点,通过。这比将一组差异存储到 RAM 并在事后进行比较要快。我什至打赌这样的循环会很好地矢量化。是否将整个文件读入内存取决于我猜它们有多大。 【参考方案1】:

你可以这样做:

Mat diff_im = image - copy;
double s = cv::sum(diff_im)[0];

【讨论】:

【参考方案2】:

你也可以使用规范类型NORM_L2的OpenCV的norm()函数

double rst = cv::norm(img1, img2, cv::NORM_L2);

如果图像完全相同,结果将为零。

越相似,越接近于零。

【讨论】:

以上是关于比较BGR图像是不是完全相同[重复]的主要内容,如果未能解决你的问题,请参考以下文章

检查图像是不是已完全加载[重复]

比较两个字符串是否完全不重复(没有一个字符相同)

使用 QImage 和 OpenCV 显示图像 [重复]

JPG压缩后的原始BGR图像长度相同?

OpenCV:HSV inRange 返回压缩并重复的二进制图像

MongoDB 是不是使用相同的数据重复子文档?