Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >还在用肉眼找不同吗?这个技术轻松搞定

还在用肉眼找不同吗?这个技术轻松搞定

作者头像
AI算法与图像处理
发布于 2019-08-12 09:57:58
发布于 2019-08-12 09:57:58
6.5K06
代码可运行
举报
运行总次数:6
代码可运行

点击上方“AI算法与图像处理”,选择加"星标"或“置顶” 重磅干货,第一时间送达

研究好玩又有用的技术第 007 期

在学习中发现快乐,在应用找到价值。这是我第七期分享图像技术应用的文章。 前五期欢迎阅读和分享:

概述 来源:pyimagesearch 编译:AI算法与图像处理 我想应该很多人都玩过腾讯的这款游戏《大家来找茬》,想当年不知道多少人用鼠标对着美女图一顿输出,就是找不到哪里不一样。 今天我们要用到图像技术可以应用到这个上面。

今天,我们将使用扩展ssim(结构相似性索引)方法,以便使用OpenCV和python可视化图像之间的差异。具体来说,我们将在两个输入图片的不同处绘制边界框。 为了计算两张图片的不同,我们将使用结构相似性索引(由wang等人首次提出)。在他们的2004年论文中,图像质量评估:从可视化误差到结构相似性。该方法已经在scikit-image库中应用于图像处理。 https://ece.uwaterloo.ca/~z70wang/publications/ssim.pdf 要去学习的技巧是我们如何去准确确定图片不同点的坐标位置(x,y)。 要实现这一点,首先我们要确定系统已经安装好python、OpenCV、scikit-image和imutils。 你可以使用下面的OpenCV安装教程学习如何在系统上配置和安装python和OpenCV。 https://www.pyimagesearch.com/opencv-tutorials-resources-guides/ 如果你还没安装或更新scikit-image包,你可以使用下面的操作: pip3 install --upgrade scikit-image 同样的,如果你还为安装或更新imutils,你可以使用下面的操作: pip3 install --upgrade imutils 现在我们的系统已经准备好了,可以继续往下操作了。

计算图片的差异

思考:你能分辨出下面这两幅图片的区别吗?

如果你利用一点时间研究这两种信用卡,你会发现左边的图片上是有一个logo的,但是右边的图片已经用ps消除了。

你可能会马上注意到这个差异,或者说花费一点时间。不管怎样,这都说明了比较图片的差异是一个重要的方面——有时图片的差异是微小的——这将导致肉眼难以立刻发现这些差异(文章的后面会有一个这样子的例子)。

为什么计算图片的差异如此重要?

一个例子是网络钓鱼。

攻击者可以轻而易举地操纵图片,以欺骗那些不验证url的用户,让他们认为自己正在登录银行网络,但后面却发现这是一个骗局。

在网站上存在一个数据库对比logo和已知用户界面(UI)元素帮助减少钓鱼网站的攻击。(这要归功于Chris Cleveland的论文——通过监视来检测钓鱼网站,作为一个例子应用于计算机视觉来阻止钓鱼网站)

http://www1.icsi.berkeley.edu/~sadia/papers/phishzoo-icsc_final.pdf

开发一个网络钓鱼检测系统显然比简单的图片差异对比要复杂得多,但是我们仍然可以应用这些技术来确定一个给定的图片是否被处理过。

现在,让我们计算两张图片的差异,并使用OpenCV、scikit-Image和python可视化这些差异。

打开一个新文件并命名为image_diff.py,并插入下面的代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 导入必要的包
from skimage.measure import compare_ssim
import argparse
import imutils
import cv2

# 构造解析参数
ap = argparse.ArgumentParser()
ap.add_argument("-f","--first",required=True,
               help="first input image")
ap.add_argument("-s","second",required=True,
               help="second")
args = vars(ap.parse_args())

第2-5行为导入的必要包。

我们将使用compare_ssim(scikit0-image)、argparse、imutils和cv2

我们建立两个命令行参数--first和--second,这是我们想要比较的两张图片的路径(第8-13行)

接下来,我们将从磁盘中导入图片并将他们转换为灰度图:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 导入图片
imageA = cv2.imread(args["--first"])
imageB = cv2.imread(args["--second"])

# 把图片转换为灰度图
grayA = cv2.cvtColor(imageA, cv2.COLOR_BGR2GRAY)
grayB = cv2.cvtColor(imageB, cv2.COLOR_BGR2GRAY)

我们导入第一张和第二张图片,并将它们各自存储为imageA和imageB。(第2-3行)

然后我们将其转为灰度图(第6-7行)

接下来,开始计算两会在那个图片之间的结构相似性索引(SSIM)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 计算两张图片的结构相似性索引
# 确保差分图片
(score, diff) = compare_ssim(grayA, grayB, full=True)
diff = (diff*255).astype("uint8")
print("SSIM:{}".format(score))

在第3行中使用scikit-image中的compare_ssim函数,我们计算得到一个score和差分图片diff

score代表两张输入图片的结构相似性索引

该值的范围在[-1, 1],其中值为1时为“完美匹配”。

差分图片包含了我们希望可视化的两张输入图片的实际图片不同点。差分图片当前表示为范围[0, 1]的浮点数,因此在我们继续用OpenCV进处理之前,首先要将数组转换为范围[0, 256]的8位无符号整数。

现在,找到这些轮廓,这样我们可以在被标识为“不同”的区域画出矩形。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 阈值分割差分图像,然后查找轮廓以获得两个输入图片的不同区域
thresh = cv2.threshold(diff, 0, 255,
                      cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)[1]
cnts = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL, 
                       cv2.CHAIN_APPROX_SIMPLE)
cnts = imutils.grab_contours(cnts)

在第2-3行中,我们使用cv2.THRESH_BINARY_INV 和 cv2.THRESH_OTSU来阈值处理我们的差分图片——这两个设置使用竖线或符号 “|” 来同时应用。

有关OTSU双峰阈值设置的详细信息可以参考:

https://docs.opencv.org/trunk/d7/d4d/tutorial_py_thresholding.html

中文版的:cv2.threshold参数详细说明如下:

https://blog.csdn.net/sinat_21258931/article/details/61418681

接下来,第4-6行为找阈值的轮廓。第6行中的三元运算符只处理不同版本的OpenCV中的cv2.findcontours返回的特征差异。

下图清楚地显示了被处理过的图片的ROI区域

现在我们已经将轮廓存储在一个列表中,然后在沿着每张图片的不同区域画出矩形。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 遍历轮廓
for c in cnts:
  # 计算轮廓的边界框,然后在两张输入图片中代表图片不同点的区域绘制边界框
  (x, y, w, h) = cv2.boundingRect(c)
  cv2.rectangle(imageA, (x, y), (x + w, y + h), (0, 0, 255), 2)
  cv2.rectangle(imageB, (x, y), (x + w, y + h), (0, 0, 255), 2)
 
# 显示输出图片
cv2.imshow("Original", imageA)
cv2.imshow("Modified", imageB)
cv2.imshow("Diff", diff)
cv2.imshow("Thresh", thresh)
cv2.waitKey(0)

第2行,我们遍历所有的轮廓,cnts。

首先,我们使用cv2.boundingRect计算轮廓周围的边界框。

我们将相关的(x,y)坐标存储为x和y,此外将矩形的宽和高分别用w和h存储。

然后,我们使用这些值利用函数cv2.rectangle在每个图片上绘制一个红色的矩形。

最后,我们显示对比图片的结果,包含将不同处框选出来的和阈值图片。

我们调用cv2.waitKey函数,让程序等待一个按键输入。

接下来让我们运行代码,并可视化更多不同的图片。

可视化图片的不同处

打开终端,并输入下面的命令:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
python3 image_diff.py --first images/original_02.png --second images/modified_02.png

如下图所示,安全芯片和账户持有者的姓名都被删除。

再尝试另一个例子,一张支票。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
python3 image_diff.py --first images/original_03.png --second images/modified_03.png

注意到这些地方发生了改变:

  • 名字被删除
  • 支票编号被删除
  • 日期旁边的符号被删除
  • 最后的名字被删除

肉眼通常在一个复制的图片中找到所有的不同点。幸运的是,我们现在可以通过python、OpenCV和scikit-image轻松的计算这些不同点和可视化结果。

总结

今天的文章,我们学习了如何使用OpenCV、python和scikit-image的结构相似性所有(SSIM)来计算图片的不同点。基于图片的不同点,我们也学习了如何标记和可视化两张图片中的不同区域,后台回复“找不同”获取源码和示例图片

更多关于SSIM的内容,可以参考https://www.pyimagesearch.com/2014/09/15/python-compare-two-images/和scikit-image的文档https://scikit-image.org/docs/dev/api/skimage.measure.html#skimage.measure.compare_ssim https://www.pyimagesearch.com/2017/06/19/image-difference-with-opencv-and-python/

翻译和整理不易,希望大家能支持一波~

你们永远都是这条街最靓的仔>_<

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-08-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 AI算法与图像处理 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
音频质量评估-2
音频质量评估-1:之前主要学习了音视频的编码和解码原理,和测试音频质量的方法。接下来继续学习下当前 短视频 领域的 视频质量测试方法。
叉叉敌
2021/12/06
1.1K0
音频质量评估-2
基于OpenCV全景拼接(Python)
翻译自https://www.pyimagesearch.com 基于OpenCV(Python)的图片拼接和全景图构建。“缝合”两张有重叠区域的图来创建一张全景图。构建全景图利用到了计算机视觉和图像处理技术有:关键点检测、局部不变特征、关键点匹配、RANSAC(Random Sample Consensus,随机采样一致性)和透视变形。因为在处理关键点检测和局部不变性在OpenCV 2.4.X和OpenCV 3.X中有很大的不同,比如SIFT和SURF。这里将给出兼容两个版本的代码。在之后的博客会解决多张图片的拼接,而不仅仅只是针对两张图片。
一点儿也不潇洒
2018/08/07
7.5K0
基于OpenCV全景拼接(Python)
使用Python和OpenCV检测图像中的多个亮点
本文来自光头哥哥的博客【Detecting multiple bright spots in an image with Python and OpenCV】,仅做学习分享。
周旋
2020/10/23
4.3K0
使用Python和OpenCV检测图像中的多个亮点
【图像配准】使用OpenCV进行多图配准拼接
OpenCV提供了cv2.createStitcher (OpenCV 3.x) 和 cv2.Stitcher_create(OpenCV 4) 这个拼接函数接口,对于其背后的算法,尚未可知(该函数接口是调用其它的C语言进行实现),查阅官方文档,并未找到完全对应上的内容。因此,下文主要偏向于实践。
zstar
2023/02/10
4.3K0
【图像配准】使用OpenCV进行多图配准拼接
OpenCV-简易答题卡识别
参考自:https://www.pyimagesearch.com/2016/10/03/bubble-sheet-multiple-choice-scanner-and-test-grader-using-omr-python-and-opencv/
xxpcb
2020/08/04
1.4K0
如何教电脑玩Spot it!使用OpenCV和深度学习
爱好是玩棋盘游戏,因为对CNN有所了解,所以决定开发一种可以在纸牌游戏中击败人类的应用程序。想使用我自己的数据集从头开始构建模型,以查看使用小数据集从头开始的模型的性能如何。选择从一个不太难的游戏入手!(又称Dobble)。
代码医生工作室
2020/05/09
9820
如何教电脑玩Spot it!使用OpenCV和深度学习
用python和opencv检测图像中的条形码
在日常生活中,经常会看到条形码的应用,比如超市买东西的生活,图书馆借书的时候。。。
AI算法与图像处理
2019/07/25
3.2K0
用python和opencv检测图像中的条形码
使用Python和OpenCV顺时针排序坐标
本文来自光头哥哥的博客【Ordering coordinates clockwise with Python and OpenCV】,仅做学习分享。
周旋
2022/08/07
1.8K0
使用Python和OpenCV顺时针排序坐标
Python+OpenCV检测灯光亮点
本篇博文分享一篇寻找图像中灯光亮点(图像中最亮点)的教程,例如,检测图像中五个灯光的亮点并标记,项目效果如下所示:
不脱发的程序猿
2021/01/20
1.2K0
python智能图片识别系统(图片切割、图片识别、区别标识)
你好! python flask图片识别系统使用到的技术有:图片背景切割、图片格式转换(pdf转png)、图片模板匹配、图片区别标识。
用户6334815
2020/08/13
16K1
python智能图片识别系统(图片切割、图片识别、区别标识)
有贼出没?看我用python来捉"贼"
最近自己的工位老是丢东西,关键只丢一样东西,而且每天早上来,桌子上都是乱七八糟的。像是遭了贼。
赵云龙龙
2019/11/03
6370
OpenCV 图像处理工具包 imutils 简单认知
对每个人而言,真正的职责只有一个:找到自我。然后在心中坚守其一生,全心全意,永不停息。所有其它的路都是不完整的,是人的逃避方式,是对大众理想的懦弱回归,是随波逐流,是对内心的恐惧 ——赫尔曼·黑塞《德米安》
山河已无恙
2023/08/21
6090
OpenCV 图像处理工具包 imutils 简单认知
OpenCV测量物体的尺寸技能 get~
在中学的时候地理课上,老师教过我们如何根据地图上面测量的距离来计算实际空间上距离。
AI算法与图像处理
2019/08/05
3K0
OpenCV测量物体的尺寸技能 get~
学习—用 Python 和 OpenCV 检测和跟踪运动对象
学习了pyimagesearch 的《PyImageSearch Gurus course》。现在记录下代码的分析。
十四君
2019/11/23
3.1K0
学习—用 Python 和 OpenCV 检测和跟踪运动对象
使用python3+opencv3实现的识别答题卡的例子(01)
由于工作需要,最近在研究关于如何通过程序识别答题卡的客观题的答案,之前虽然接触过python,但对于计算机视觉这一块却完全是一个陌生的领域,经过各种调研,发现网上大多数的例子都是采用的OpenCV这个开源库来做的,OpenCV是计算机视觉领域的处理的一个非常优秀的开源库,原生由C++编写,也提供了各个主流编程语言的接口支持,这里选择python完全是因为python在计算机科学领域有着压倒性的优势和生态系统,所以使用它毫无疑问,最快上手的方式莫过于直接阅读网上已有的例子或者轮子了,通过阅读源码以问题驱动的方
我是攻城师
2018/05/15
2.2K0
附代码 | OpenCV实现银行卡号识别,字符识别算法你知多少?
随着计算机视觉在我们生活中的应用越来越广泛,大量的字符识别和提取应用逐渐变得越来越受欢迎,同时也便利了我们的生活。像我们生活中的凭借身份码取快递、超市扫码支付的机器等等。
AI科技大本营
2020/05/29
2.1K0
附代码 | OpenCV实现银行卡号识别,字符识别算法你知多少?
精通 Python OpenCV4:第二部分
在本书的第二部分中,您将更深入地了解 OpenCV 库。 更具体地说,您将看到计算机视觉项目中所需的大多数常见图像处理技术。 此外,您还将看到如何创建和理解直方图,直方图是用于更好地理解图像内容的强大工具。 此外,您将在计算机视觉应用中看到所需的主要阈值处理技术,这是图像分割的关键部分。 此外,您还将看到如何处理轮廓,轮廓用于形状分析以及对象检测和识别。 最后,您将学习如何构建第一个增强现实应用。
ApacheCN_飞龙
2023/04/27
2.3K0
使用OpenCV测量图像中物体之间的距离
本文来自光头哥哥的博客【Measuring distance between objects in an image with OpenCV】,仅做学习分享。
OpenCV学堂
2020/11/09
5.2K0
使用OpenCV测量图像中物体之间的距离
【图像配准】多图配准/不同特征提取算法/匹配器比较测试
本文首先完成之前专栏前置博文未完成的多图配准拼接任务,其次对不同特征提取器/匹配器效率进行进一步实验探究。
zstar
2023/02/13
4.2K0
【图像配准】多图配准/不同特征提取算法/匹配器比较测试
【图像配准】SIFT算法原理及二图配准拼接
本篇开始,将进入图像配准领域的研究。 图像拼接主要有SIFT, BRISK, ORB, AKAZE等传统机器学习算法以及SuperPoint等深度学习算法,在后续将一一进行研究和实验。本篇主要来研究SIFT算法的原理和应用。
zstar
2023/02/02
5.9K0
【图像配准】SIFT算法原理及二图配准拼接
相关推荐
音频质量评估-2
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验