原文链接图片对比 基于OpenCV和Python的 图像比对 - 热分享hotdog29.com
图片对比 基于OpenCV和Python的 图像比对
在之前的博客文章中,我详细介绍了如何使用结构相似性指数(SSIM)将两个图像用Python进行比较。
使用 图片对比,我们能够轻松确定两个图像是否相同或由于轻微的图像处理,压缩伪像或有目的的篡改而产生差异。
今天我们将扩展SSIM方法,以便我们可以使用OpenCV和Python可视化图像之间的差异。具体来说,我们将在两个不同的输入图像中的区域周围绘制边界框。
要了解有关使用Python和OpenCV计算和可视化图像差异 图片对比 的更多信息,请继续阅读。
寻找这篇文章的源代码?
跳到下载部分。
基于 OpenCV 和 Python 的 图像差异 计算
为了计算两个图像之间的差异,我们将利用结构相似性指数,由Wang等人首先介绍。在2004年的论文中,scikit-image 库中实现以进行图像处理。
诀窍是学习如何根据(x,y) –坐标位置精确确定图像差异的位置。
为此,我们首先需要确保我们的系统具有Python,OpenCV,scikit-image和imutils。
您可以使用我的OpenCV安装教程学习如何在系统上配置和安装Python和OpenCV 。
如果您还没有 scikit-image 请通过以下方式 安装/升级
$ pip install --upgrade scikit-image当你在这里时,继续安装/升级 imutils
$ pip install --upgrade imutils现在我们的系统已经准备好了先决条件,让我们继续。
计算 图像差异
你能发现这两个图像之间的区别吗?
图1:手动检查两个输入图像(源)之间的差异。
如果您花一秒钟研究这两张信用卡,您会注意到MasterCard徽标出现在 左侧图像上,但已从右侧图像中删除 。
您可能已经立即注意到这种差异,或者可能已经花了几秒钟。无论哪种方式,这都证明了比较图像差异的一个重要方面 – 有时图像差异是微妙的 –如此微妙以至于肉眼难以立即理解差异(我们将在本博文后面看到这样一个图像的例子)。
那么为什么计算图像差异如此重要呢?
一个例子是 网络钓鱼。攻击者可以稍微操纵图像,以欺骗不验证URL的毫无戒心的用户,使他们认为他们正在登录他们的银行网站 – 后来发现这是一个骗局。
将网页上的徽标和已知用户界面(UI)元素与现有数据集进行比较有助于减少网络钓鱼攻击(非常感谢Chris Cleveland传递
第2-5行显示我们的进口。我们将使用 compare_ssim (来自scikit-image), argparse ,imutils 和 cv2 (OpenCV)。
我们建立两个命令行参数, – first 和 – second ,它们是我们希望比较的两个相应输入图像的路径(第8-13行)。
接下来,我们将从磁盘加载每个图像并将其转换为灰度
我们载入我们的第一和第二图像, – –first 和 – –second ,在 16和17,它们 分别 存储为 imageA 和 imageB 。
图2:我们将要应用图像差异的两个输入图像。
然后我们在第20行和第21行将每个转换为灰度。
图3:将两个输入图像转换为灰度。
接下来,让我们计算两个灰度图像之间的结构相似性指数(SSIM)。
使用 scikit-image中的 compare_ssim函数,我们计算 score 得分 和差异图像 diff (第25行)。
所述 得分 表示两个输入图像之间的结构相似性指数。该值可以落在[-1,1]范围内 ,值为1是“完美匹配”。
该 差异 的图像包含实际 图像的差异 ,我们希望以可视化的两个输入图像之间差异。差异图像当前表示为[0,1]范围内的浮点数据类型, 因此我们首先将数组转换为[0,255](第26行)范围内的8位无符号整数, 然后我们才能进一步 使用 openCV处理它
现在,让我们找到轮廓,以便我们可以在标识为“不同”的区域周围放置矩形
在 第31行和第32行,我们 使用 cv2.THRESH_BINARY_INV 和 cv2.THRESH_OTSU 对我们的差异图像进行 阈值 处理。 – 使用垂直条’或’符号 l 同时应用这两个设置 。有关Otsu双峰阈值设置的详细信息,请参阅此OpenCV文档。
随后我们 在 第33-35行找到了thresh的轮廓 。第35行的三元运算符 简单地适应了各种版本的OpenCV中cv2.findContours返回签名之间的差异。
下面图4中的图像清楚地显示了已被操纵的图像的ROI:
图4:使用阈值处理使用OpenCV和Python突出显示图像差异。
现在我们将轮廓存储在列表中,让我们在每个图像的不同区域周围绘制矩形
从第38行开始 ,我们遍历我们的轮廓, cnts 。首先,我们使用 cv2.boundingRect 计算轮廓周围的边界框 。我们将相关的 (x,y )坐标存储为 x 和 y 以及矩形的宽度/高度为 w 和 h 。
然后我们使用这些值在每个图像上用 cv2.rectangle 绘制一个红色矩形 。 (第43和44行)。
最后显示比较图像(第47-50行)。
用 cv2.waitKey 进行键盘监听 在50行,直到按下一个键,脚本将退出。
图5:使用Python和OpenCV可视化图像差异。
接下来,让我们运行脚本并可视化一些图像差异。
可视化图像差异
使用此脚本和以下命令,我们可以快速轻松地突出显示两个图像之间的差异
$ python image_diff.py --first images/original_02.png --second images/modified_02.png
正如您在图6中看到的那样,安全芯片和帐户持有者的名称都被删除了:
图6:使用计算机视觉(源)比较和可视化图像差异。
让我们尝试另一个计算图像差异的例子,这次是由杰拉尔德·R·福特总统(来源)撰写的支票。
通过运行下面的命令并提供相关图像,我们可以看到这里的差异更加微妙
$ python image_diff.py --first images/original_03.png --second images/modified_03.png
图7:计算图像差异并突出显示不同的区域。
请注意图7中的以下更改:贝蒂福特的名字被删除了。
支票号码已删除。
日期旁边的符号将被删除。
姓氏已删除。
在像检查这样的复杂图像上,通常很难用肉眼找到 所有差异。幸运的是,我们现在可以使用Python,OpenCV和scikit-image制作的这个方便的脚本轻松计算差异并可视化结果。
摘要
在今天的博客文章中,我们学习了如何使用OpenCV,Python和scikit-image的结构相似性指数(SSIM)来计算图像差异。基于图像差异,我们还学习了如何在两个图像中标记和可视化不同区域。
要了解有关SSIM的更多信息,请务必参阅此文章和 scikit-image文档。
我希望你喜欢今天的博文!
源代码下载源代码 下载 - 热分享hotdog29.com
原文链接图片对比 基于OpenCV和Python的 图像比对 - 热分享hotdog29.com
文章转自 Adrian Rosebrock ,OpenCV Face Recognition,PyImageSearch,https://www.pyimagesearch.com/Image Difference with OpenCV and Python/,2009年7月27日访问
相关文章