点击上方“小白学视觉”,选择加"星标"或“置顶

重磅干货,第一时间送达

本文转自: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,并插入下面的代码:

# 导入必要的包
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行)

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

# 导入图片
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)

# 计算两张图片的结构相似性索引
# 确保差分图片
(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位无符号整数。

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

# 阈值分割差分图像,然后查找轮廓以获得两个输入图片的不同区域
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区域

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

# 遍历轮廓
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函数,让程序等待一个按键输入。

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

可视化图片的不同处

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

python3 image_diff.py --first images/original_02.png --second images/modified_02.png

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

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

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/

下载1:OpenCV-Contrib扩展模块中文版教程

在「小白学视觉」公众号后台回复:扩展模块中文教程即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。

下载2:Python视觉实战项目52讲

在「小白学视觉」公众号后台回复:Python视觉实战项目即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。

下载3:OpenCV实战项目20讲

在「小白学视觉」公众号后台回复:OpenCV实战项目20讲即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。

交流群

欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~

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

  1. kafka删除队列_没想到 Kafka 还会这样问,学会这些带你轻松搞定大厂面试!

    一.前言 自上次师兄遭受了面试官 「Kafka」 的暴击追问后,回来发奋图强,企图"「吊打面试官」",奈何还是面试官套路深啊,最近的面试,又被问到「知识盲点」了!让我们一起来看看, ...

  2. exce中让两列数据一一对应_表格数据对比眼花缭乱、痛苦不堪,找对方法,1秒搞定...

    [温馨提示]亲爱的朋友,阅读之前请您点击[关注],您的支持将是我最大的动力!#学问分享官# 在我们日常工作中,经常碰到两列数据或者两个表格对比,找出差异数据,如果表格的数据太多,靠肉眼一行行对比,即使 ...

  3. 微信好友互删服务器还会有记录吗,微信好友互删后还能恢复吗?一招轻松搞定...

    一.共同好友法 找共同好友或者都认识的朋友在推荐一下名片就可以了;如果没有就点击微信通讯录最上方,点击新的朋友,上面会有你们当初通过什么方式加的微信好友,在重新加回来即可. 二.直接在手机上使用卓师兄 ...

  4. 新款宝马MINI钥匙增加!轻松搞定,这MINI看着还可以噢

    新款宝马MINI钥匙增加!轻松搞定,这MINI看着还可以噢

  5. 还在用Word写论文?收下这个排版神器,轻松搞定所有公式!

    写论文一点也不可怕 可怕的是论文排版 稍微修改了下字体, 插图就不知道跑哪去了, 好不容易挪了回来, 文字又打乱了, 文字排好了 参考文献又乱了? 图片与公式显示又乱了 写论文只是费脑子 排版简直是要 ...

  6. z7D3 安装linux,还在为装系统烦恼?战神Z7-SL7D3为你轻松搞定

    原标题:还在为装系统烦恼?战神Z7-SL7D3为你轻松搞定 一般情况下,如果更换电脑或是电脑系统出现问题,按照一般路径,都需要采用重装系统的方法来解决.虽然重装系统会让电脑的性能散发出全新的活力,可是 ...

  7. 正在找工作的设计师,你应该把自己的作品集放在云端--读完此文轻松搞定个人作品网站

    AWO起源 很多公司的内推系统对设计师非常不友好,甚至可以说"歧视设计职位",有的要求作品必须是pdf,有的要求体积限制在12m以内,反正花样繁多.一个优秀的设计作品要阐述清晰设计 ...

  8. java读取word文档内容_合并多个Word文档内容,还在复制粘贴就out了,同事五秒轻松搞定...

    在我们工作中,我们经常会编写多个Word文档内容,那么怎么将多个单个的Word文档合并到一个文档中,这就会显得有些难度. 如上图所示,我们需要将三个不同的案例,快速的汇总到我们的案例汇总表当中.许多朋 ...

  9. 你们还在担心手机找不到?教你一招轻松搞定

    大家有时候会不会因为出门太急而找不到手机,其实我们只需要大喊一声,不管手机藏在哪个角落,我们都能听到手机的回应. 如果你用的是苹果手机,打开[设置]-[Siri与搜索],开启[用"嘿Siri ...

最新文章

  1. spark编程基础--6.DataFrame
  2. 官宣!《新程序员·开发者黄金十年》正式发布
  3. 代码编辑器——sublime
  4. 【Android 安装包优化】WebP 图片格式兼容与性能 ( Android 中的 WebP 图片格式兼容问题 | Android 中的 WebP 图片格式性能 )
  5. js点击获取连接的内容
  6. Coding:两个从大到小的有序链表合并成一个从小到大有序链表
  7. 【Java文件操作(六)】借助内存复制图片:ByteArrayOutputStream\ByteArrayInputStream\FileOutputStream\FileInputStream辨析
  8. autocomplete的使用
  9. 省市联动_简单的Demo,适用于各种二级菜单联动
  10. notepad++批量操作笔记(持续更新..)
  11. 最新wineQQ 完美解决方案
  12. 周立功USBCAN资料分享
  13. 有哪些令人骄傲的国产软件或应用?这5款你一定不知道!
  14. java加载不了驱动程序,请教java连mysql数据库时一直加载不起驱动
  15. c++ double 截取_c++ double 截取_C/C++ double取余函数
  16. BZOJ5011 [Jx2017]颜色(洛谷P4065)
  17. 产品经理求职方法指南:面试通关
  18. [问题已处理]-mac安装cobra失败
  19. 轻触开关实现自锁功能
  20. HCIA---对等网和TCP/IP

热门文章

  1. 华人“霸榜”ACL最佳长短论文、杰出论文一作,华为、南理工等获奖
  2. 华为 | 人生苦短,码短情长,有场大Party等你来Pick!
  3. 11月最佳机器学习开源项目Top10!
  4. 最实用的机器学习算法优缺点分析,没有比这篇说得更好了
  5. 亏本也要抢市场!谷歌亚马逊一路死磕到CES,争夺语音入口之路,谁都不是吃素的
  6. 蓝绿部署、金丝雀发布(灰度发布)、AB测试……
  7. 盘点 Github 上的高仿 app 项目
  8. 搞懂限流算法这一篇就够了
  9. @AI开发者:薅资源,赢大奖,零成本体验AI开发,这场大赛等你来战!
  10. 两位MIT学霸,25岁退学,40岁完成800亿IPO!