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

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

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

点击上方“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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
数据人必会的Excel|掌握32个Excel小技巧,成为效率达人(一)
作为数据分析师,有时候我们拿到的数据可能有成百上千行或者成百上千列,如果我们想要选中这成百上千数据中的一部分进行处理,常规的方法是拖动鼠标进行框选,但对于数据量大的情况这种方法不一定好,这时候就该Excel快捷键出马了。
数据万花筒
2021/01/12
1.8K0
20个Excel操作技巧,提高你的数据分析效率
今日头条丨一点资讯丨腾讯丨搜狐丨网易丨凤凰丨阿里UC大鱼丨新浪微博丨新浪看点丨百度百家丨博客中国丨趣头条丨腾讯云·云+社区
数据猿
2019/08/06
2.5K0
Excel小技巧55: 复制并仅粘贴可见单元格
在Excel中,当我们复制包含有隐藏列/行的数据后,在粘贴时会将已隐藏的数据全部粘贴过来,如下图1所示。
fanjy
2020/09/17
17.8K0
Excel小技巧55: 复制并仅粘贴可见单元格
Excel空白单元格填充上一行内容
3、不要进行任何其他操作,直接按顺序输入:①“等于”键 ②“方向键上↑”键,输入成功后选中的第一个控制表格会出现公式。
码客说
2023/04/03
1.5K0
Excel空白单元格填充上一行内容
Excel 常用的九十九个技巧 Office 自学教程快速掌握办公技巧
Microsoft Excel 是微软为 Windows、macOS、Android 和 iOS 开发的电子表格软件,可以用来制作电子表格、完成许多复杂的数据运算,进行数据的分析和预测,并且具有强大的制作图表的功能。由于 Excel 具有十分友好的人机界面和强大的计算功能,它已成为国内外广大用户管理公司和个人财务、统计数据、绘制各种专业化表格的得力助手。允许用户自定义界面的电子制表软件包括字体、文字属性和单元格格式,它还引进了智能重算的功能,当单元格数据变动时,只有与之相关的数据才会更新,荒岛本次带来九十九个 Excel 技巧,提高您的办公效率。
ximagine
2023/05/05
7.5K0
2022年最新Python大数据之Excel基础
•此时,B2单元格为被引用单元格,E2单元格为引用单元格,被引用单元格修改,引用单元格同样变化。
Maynor
2022/09/21
8.5K0
2022年最新Python大数据之Excel基础
【学习】如何快速批量删除Excel单元格中的“换行符”
在Excel单元格中按Alt+Enter就会进行换行,就像在Word中按回车键一样。如果许多单元格中都包含这样的“换行符”,现在要将其全部删除掉,让这些单元格中的内容都变成一行显示,该如何操作呢? 方法一:取消自动换行 在Excel单元格中按快捷键Alt+Enter进行换行时,该单元格就被设置成了“自动换行”,如果要将这些单元格中的“自动换行”效果取消,也就是删除“换行符”,方法如下: 1.Excel 2003操作方法:选择这些需要调整的单元格,鼠标右击,在弹出的快捷菜单中
小莹莹
2018/04/18
19.8K0
Excel中批量填充公式有5个方法
可能有些朋友会说,输入公式有什么可聊的。不就是在第一个单元格中键入公式,然后选中它向下拖动,就自动将公式填充到了剩下的单元格了吗?
超级小可爱
2023/02/20
11.2K0
Excel表格中最经典的36个小技巧,全在这儿了
技巧1、单元格内强制换行 技巧2、锁定标题行 技巧3、打印标题行 技巧4、查找重复值 技巧5、删除重复值 技巧6、快速输入对号√ 技巧7、万元显示 技巧8、隐藏0值 技巧9、隐藏单元格所有值。 技巧10、单元格中输入00001 技巧11、按月填充日期 技巧12、合并多个单元格内容 技巧13、防止重复录入 技巧14、公式转数值 技巧15、小数变整数 技巧16、快速插入多行 技巧17、两列互换 技巧18、批量设置求和公式 技巧19、同时查看一个excel文件的两个工作表。 技巧20:同时修改多个工作表 技巧21:恢复未保存文件 技巧22、给excel文件添加打开密码 技巧23、快速关闭所有excel文件 技巧24、制作下拉菜单 技巧25、二级联动下拉 技巧27、删除空白行 技巧28、表格只能填写不能修改 技巧29、文字跨列居中显示 技巧30、批注添加图片 技巧31、批量隐藏和显示批注 技巧32、解决数字不能求和 技巧33、隔行插入空行 技巧34、快速调整最适合列宽 技巧35、快速复制公式 技巧36、合并单元格筛选
统计学家
2019/09/25
8.4K0
Excel表格中最经典的36个小技巧,全在这儿了
怎样去掉单元格内的字母只留数字?五大方法我选俩
首先,对于Excel里去掉单元格内的字母只留数字先给出我最常用的2种比较容易掌握的处理办法:
大海Power
2021/08/30
19.6K0
Excel表格的35招必学秘技[配图]
一、让数据按需排序   如果你要将员工按其所在的部门进行排序,这些部门名称既的有关信息不是按拼音顺序,也不是按笔画顺序,怎么办?可采用自定义序列来排序。   1.执行“格式→选项”命令,打开“选项”
ytkah
2018/03/06
7.9K0
Excel表格的35招必学秘技[配图]
RPA与Excel(DataTable)
方法: 直接调用invokeCode,入参为已定义好的DataTable,出参为去重后的DataTable,代码如下
用户2017109
2018/08/03
6K0
RPA与Excel(DataTable)
Excel,大多数人只会使用1%的功能
最近,孩子在万门大学上学习了Excel,拿了几道题考考我。我自认为Excel功底还不错,从Office 2000一直用到现在的Office 365,窗口冻结、区域命名、数据筛选,透视表,高级公式,还有VBA编程等等,不算精通也算高手,但一做题,发现不知道的技巧还真不少。
申龙斌
2019/09/10
2.2K0
Excel,大多数人只会使用1%的功能
office相关操作
选中不冻的一行的下一行,在视图中打开冻结窗格,即可让上面的内容一直显示,还可以使用拆分功能
用户6841540
2024/08/02
3810
Excel公式技巧75:查清与公式相关的单元格
在使用Excel时,我们肯定会使用公式。这些公式要么会引用其他的单元格,要么会被其他单元格引用。下面我们先看看这两种情况,如下图1所示。
fanjy
2021/01/06
1.7K0
Excel技巧:锁定包含公式的单元格
有时候,我们想保护工作表中的公式,不让用户能够随便修改,但是又不想限制用户编辑除公式之外的数据。此时,不能够简单的使用“保护工作表”命令,稍微需要添加一点技巧来实现。
fanjy
2022/06/04
3.2K0
Excel技巧:锁定包含公式的单元格
Excel技巧:使用上方单元格的值填充空单元格
有时候,工作表列中有许多空单元格,而不是在每行都重复相同的内容,这样可以使报表更容易阅读,然而也会导致一些问题,例如不方便排序或筛选数据。
fanjy
2022/04/13
3.6K0
Excel技巧:使用上方单元格的值填充空单元格
Excel小技巧88:保护公式单元格
Excel中的“保护工作表”功能使用起来有点奇怪,似乎有点烧脑。但是,你按照下面介绍的步骤,可以快速保护工作表中的公式单元格。
fanjy
2021/07/12
8540
Excel小技巧88:保护公式单元格
你有一份面试题要查收
如图所示,两张表的表头完全一样,但有部份内容缺失,需要合并到一张表里让内容更加完整。
猴子数据分析
2020/10/02
2.2K0
Excel图表学习45: 裁剪图表
这是在chandoo.org学到的技巧。如下图1所示,在使用柱形图制作图表时,如果有些柱形表示的数字很大,可以截断该柱形,使图表看起来更美观。
fanjy
2019/07/19
2.6K0
相关推荐
数据人必会的Excel|掌握32个Excel小技巧,成为效率达人(一)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验