latex图片并排放置_图片对比 基于OpenCV和Python的 图像比对

dc21dea566f232d204bc7fd71a10f30d.png

原文链接

图片对比 基于OpenCV和Python的 图像比对 - 热分享​hotdog29.com
654d85f95459384aad6427b9b7d523eb.png

在 2019年7月27日 上张贴 由 hotdog发表回复

图片对比 基于OpenCV和Python的 图像比对

82a98334d9ef5f72b4aa44dd22af16dc.png


在之前的博客文章中,我详细介绍了如何使用结构相似性指数(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现在我们的系统已经准备好了先决条件,让我们继续。
计算 图像差异
你能发现这两个图像之间的区别吗?

47aec703a69da83edfb3b031c6f25457.png

图1:手动检查两个输入图像(源)之间的差异。
如果您花一秒钟研究这两张信用卡,您会注意到MasterCard徽标出现在 左侧图像上,但已从右侧图像中删除 。
您可能已经立即注意到这种差异,或者可能已经花了几秒钟。无论哪种方式,这都证明了比较图像差异的一个重要方面 – 有时图像差异是微妙的 – 如此微妙以至于肉眼难以立即理解差异(我们将在本博文后面看到这样一个图像的例子)。那么为什么计算图像差异如此重要呢?
一个例子是 网络钓鱼。攻击者可以稍微操纵图像,以欺骗不验证URL的毫无戒心的用户,使他们认为他们正在登录他们的银行网站 – 后来发现这是一个骗局。
将网页上的徽标和已知用户界面(UI)元素与现有数据集进行比较有助于减少网络钓鱼攻击(非常感谢Chris Cleveland传递 PhishZoo:通过查看网络钓鱼网站作为应用计算机视觉预防的示例来检测网络钓鱼网站网络钓鱼)。
开发网络钓鱼检测系统显然比简单的图像差异复杂得多,但我们仍然可以应用这些技术来确定是否已经操纵了给定的图像。
现在,让我们计算两个图像之间的差异,并使用OpenCV,scikit-image和Python并排查看差异。
打开一个新文件并将其命名为 image_diff .py

14f1fb13f843fd64988df5bf745d1930.png

第2-5行显示我们的进口。我们将使用 compare_ssim (来自scikit-image), argparse ,imutils 和 cv2 (OpenCV)。
我们建立两个命令行参数, – first 和 – second ,它们是我们希望比较的两个相应输入图像的路径(第8-13行)。
接下来,我们将从磁盘加载每个图像并将其转换为灰度

6f57829d722d301b394888531191762a.png

我们载入我们的第一和第二图像, – –first 和 – –second ,在 16和17,它们 分别 存储为 imageA 和 imageB 。

47aec703a69da83edfb3b031c6f25457.png

图2:我们将要应用图像差异的两个输入图像。
然后我们在第20行和第21行将每个转换为灰度。

531a1acde409719a92a79df2d08bed72.png

图3:将两个输入图像转换为灰度。
接下来,让我们计算两个灰度图像之间的结构相似性指数(SSIM)。

46c9ebeb3524ca07e6e96769ea9cecfb.png

使用 scikit-image中的 compare_ssim函数,我们计算 score 得分 和差异图像 diff (第25行)。
所述 得分 表示两个输入图像之间的结构相似性指数。该值可以落在[-1,1]范围内 值为1是“完美匹配”。
该 差异 的图像包含实际 图像的差异 ,我们希望以可视化的两个输入图像之间差异。差异图像当前表示为[0,1]范围内的浮点数据类型, 因此我们首先将数组转换为[0,255]第26行)范围内的8位无符号整数, 然后我们才能进一步 使用 openCV处理它
现在,让我们找到轮廓,以便我们可以在标识为“不同”的区域周围放置矩形

1f2aba867c5f2d7a2ccfcb6a94628b03.png

第31行和第32行,我们 使用 cv2.THRESH_BINARY_INV 和 cv2.THRESH_OTSU 对我们的差异图像进行 阈值 处理。 – 使用垂直条’或’符号 l 同时应用这两个设置 。有关Otsu双峰阈值设置的详细信息,请参阅此OpenCV文档。
随后我们 在 第33-35行找到了thresh的轮廓 。第35行的三元运算符 简单地适应了各种版本的OpenCV中cv2.findContours返回签名之间的差异。
下面图4中的图像清楚地显示了已被操纵的图像的ROI:

0208bebf0d8ead203a98bcfe7434ab28.png

图4:使用阈值处理使用OpenCV和Python突出显示图像差异。
现在我们将轮廓存储在列表中,让我们在每个图像的不同区域周围绘制矩形

955099ad193d874aaf8821a58bbea56f.png

第38行开始 ,我们遍历我们的轮廓, cnts 。首先,我们使用 cv2.boundingRect 计算轮廓周围的边界框 。我们将相关的 (x,y )坐标存储为 x 和 y 以及矩形的宽度/高度为 w 和 h 。
然后我们使用这些值在每个图像上用 cv2.rectangle 绘制一个红色矩形 。 (第43和44行)
最后显示比较图像(第47-50行)。
用 cv2.waitKey 进行键盘监听 在50行,直到按下一个键,脚本将退出。

51d6de2f3c81a02b79c750e6ed158189.png

图5:使用Python和OpenCV可视化图像差异。
接下来,让我们运行脚本并可视化一些图像差异。
可视化图像差异
使用此脚本和以下命令,我们可以快速轻松地突出显示两个图像之间的差异

$ python image_diff.py --first images/original_02.png --second images/modified_02.png

正如您在图6中看到的那样,安全芯片和帐户持有者的名称都被删除了:

82a98334d9ef5f72b4aa44dd22af16dc.png

图6:使用计算机视觉(源)比较和可视化图像差异。
让我们尝试另一个计算图像差异的例子,这次是由杰拉尔德·R·福特总统(来源)撰写的支票。
通过运行下面的命令并提供相关图像,我们可以看到这里的差异更加微妙

$ python image_diff.py --first images/original_03.png --second images/modified_03.png

329524aa1dc020284c2e1b5510412e19.png

图7:计算图像差异并突出显示不同的区域。
请注意图7中的以下更改:

  • 贝蒂福特的名字被删除了。
  • 支票号码已删除。
  • 日期旁边的符号将被删除。
  • 姓氏已删除。

在像检查这样的复杂图像上,通常很难用肉眼找到 所有差异。幸运的是,我们现在可以使用Python,OpenCV和scikit-image制作的这个方便的脚本轻松计算差异并可视化结果。
摘要
在今天的博客文章中,我们学习了如何使用OpenCV,Python和scikit-image的结构相似性指数(SSIM)来计算图像差异。基于图像差异,我们还学习了如何在两个图像中标记和可视化不同区域。
要了解有关SSIM的更多信息,请务必参阅此文章和 scikit-image文档。
我希望你喜欢今天的博文!


源代码下载

源代码 下载 - 热分享​hotdog29.com
0fad3cb6d70d8b9f17817fe50995973f.png

原文链接

图片对比 基于OpenCV和Python的 图像比对 - 热分享​hotdog29.com
654d85f95459384aad6427b9b7d523eb.png


文章转自 Adrian Rosebrock ,OpenCV Face Recognition,PyImageSearch,https://www.pyimagesearch.com/Image Difference with OpenCV and Python/,2009年7月27日访问
相关文章

  • 银行卡号识别 基于 OpenCV 光学字符识别(OCR)
  • 图像着色 使用 OpenCV ,深度学习 进行 黑白图像着色
  • 边缘检测 使用 OpenCV 和 深度学习 进行整体嵌套边缘检测
  • 活体检测 使用OpenCV进行 运动检测
  • 文本识别 使用 Tesseract 进行 OpenCV OCR 和 文本识别

张贴在技术博客、opencv编辑

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值