比较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图像是不是完全相同[重复]的主要内容,如果未能解决你的问题,请参考以下文章