OpenCV快速寻找图像差异

2023-05-16

如何使用结构相似性指数(SSIM)将两个图像与Python进行比较。

使用这种方法,我们能够轻松确定两个图像是否相同或由于轻微的图像处理,压缩伪像或有目的的篡改而产生差异。

今天我们将扩展SSIM方法,以便我们可以使用OpenCV和Python可视化图像之间的差异。具体来说,我们将在两个不同的输入图像中的区域周围绘制边界框。

与OpenCV和Python的图像差异

为了计算两个图像之间的差异,我们将利用结构相似性指数,由Wang等人首先介绍。在2004年的论文中,图像质量评估:从错误可见性到结构相似性。此方法已在scikit-image 库中实现以进行图像处理。

诀窍是学习如何根据(x,y) -坐标位置精确确定图像差异的位置。

为此,我们首先需要确保我们的系统具有Python,OpenCV,scikit-image和imutils。

您可以使用我的OpenCV安装教程学习如何在系统上配置和安装Python和OpenCV 。

如果您还没有 scikit - 已安装/升级映像,请通过以下方式升级:

$ pip install --upgrade scikit-image

当你在这里时,继续安装/升级 imutils :

$ pip install --upgrade imutils

现在我们的系统已经准备好了先决条件,让我们继续。

计算图像差异

你能发现这两个图像之间的区别吗?

图1:手动检查两个输入图像(源)之间的差异

如果您花一秒钟研究这两张信用卡,您会注意到MasterCard徽标出现在 左侧图像上,但已从右侧图像中删除 。

您可能已经立即注意到这种差异,或者可能已经花了几秒钟。无论哪种方式,这都证明了比较图像差异的一个重要方面 - 有时图像差异是微妙的 - 如此微妙以至于肉眼难以立即理解差异(我们将在本博文后面看到这样一个图像的例子)。

那么为什么计算图像差异如此重要呢?

一个例子是 网络钓鱼。攻击者可以稍微操纵图像,以欺骗不验证URL的毫无戒心的用户,使他们认为他们正在登录他们的银行网站 - 后来发现这是一个骗局。

将网页上的徽标和已知用户界面(UI)元素与现有数据集进行比较有助于减少网络钓鱼攻击(非常感谢Chris Cleveland传递 PhishZoo:通过查看网络钓鱼网站作为应用计算机视觉预防的示例来检测网络钓鱼网站网络钓鱼)。

开发网络钓鱼检测系统显然比简单的图像差异复杂得多,但我们仍然可以应用这些技术来确定是否已经操纵了给定的图像。

现在,让我们计算两个图像之间的差异,并使用OpenCV,scikit-image和Python并排查看差异。

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

# import the necessary packages

from skimage.measure import compare_ssim

import argparse

import imutils

import cv2

# construct the argument parse and parse the arguments

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())

# load the two input images

imageA = cv2.imread(args["first"])

imageB = cv2.imread(args["second"])

# convert the images to grayscale

grayA = cv2.cvtColor(imageA, cv2.COLOR_BGR2GRAY)

grayB = cv2.cvtColor(imageB, cv2.COLOR_BGR2GRAY)

# compute the Structural Similarity Index (SSIM) between the two

# images, ensuring that the difference image is returned

(score, diff) = compare_ssim(grayA, grayB, full=True)

diff = (diff * 255).astype("uint8")

print("SSIM: {}".format(score))

# threshold the difference image, followed by finding contours to

# obtain the regions of the two input images that differ

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)

# loop over the contours

for c in cnts:

# compute the bounding box of the contour and then draw the

# bounding box on both input images to represent where the two

# images differ

(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)

# show the output images

cv2.imshow("Original", imageA)

cv2.imshow("Modified", imageB)

cv2.imshow("Diff", diff)

cv2.imshow("Thresh", thresh)

cv2.waitKey(0)

第2-5行显示我们的进口。我们将使用 compare_ssim (来自scikit-image), argparse , imutils 和 cv2 (OpenCV)。

我们建立两个命令行参数, - first 和 - second ,它们是我们希望比较的两个相应输入图像的路径(第8-13行)。

接下来,我们将从磁盘加载每个图像并将其转换为灰度:

我们载入我们的第一和第二图像, - 第一 和 - 第二 ,上 线16和17,它们存储为 imageA 和 imageB 分别。

然后我们在第20行和第21行将每个转换为灰度。

接下来,让我们计算两个灰度图像之间的结构相似性指数(SSIM)。

使用 scikit-image中的 compare_ssim函数,我们计算 得分 和差异图像 diff (第25行)。

所述 得分 表示两个输入图像之间的结构相似性指数。该值可以落在[-1,1]范围内 ,值为1是“完美匹配”。

该 差异 的图像包含实际 图像的差异 ,我们希望以可视化的两个输入图像之间。差异图像当前表示为[0,1]范围内的浮点数据类型, 因此我们首先将数组转换为[0,255](第26行)范围内的8位无符号整数, 然后我们才能进一步处理它使用OpenCV。

现在,让我们找到轮廓,以便我们可以在标识为“不同”的区域周围放置矩形:

在 第31行和第32行,我们 使用cv2对我们的差异图像进行 阈值 处理。THRESH_BINARY_INV 和 cv2 。THRESH_OTSU - 使用垂直条'或'符号,|同时应用这两个设置 。有关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绘制一个红色矩形 。矩形 (第43和44行)。

最后,我们用差异图像,差异图像和阈值图像显示比较图像(第47-50行)。

我们打电话给 cv2 。waitKey 上 50线,直到按下一个键,这使得程序等待(此时脚本将退出)。

接下来,让我们运行脚本并可视化一些图像差异。

可视化图像差异

使用此脚本和以下命令,我们可以快速轻松地突出显示两个图像之间的差异:

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

--second images/modified_02.png

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

让我们尝试另一个计算图像差异的例子,这次是由杰拉尔德·R·福特总统(来源)撰写的支票。

通过运行下面的命令并提供相关图像,我们可以看到这里的差异更加微妙:

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

--second images/modified_03.png

请注意图7中的以下更改:

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

在像检查这样的复杂图像上,通常很难用肉眼找到 所有差异。幸运的是,我们现在可以使用Python,OpenCV和scikit-image制作的这个方便的脚本轻松计算差异并可视化结果。

摘要

我们学习了如何使用OpenCV,Python和scikit-image的结构相似性指数(SSIM)来计算图像差异。基于图像差异,我们还学习了如何在两个图像中标记和可视化不同区域

相关源码关注微信公众号:“图像算法”或者微信搜索账号imalg_cn关注公众号回复

公众号回复关键字:different获取源码

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

OpenCV快速寻找图像差异 的相关文章

  • error: undefined reference to symbol '_ZN5boost6system15system_categoryEv

    使用boost时遇到下面error xff1a cmake version 3 5 1 usr bin ld CMakeFiles RGBD dir src ros rgbd cc o undefined reference to symb
  • ROS 使用signal 终止 Node

    在终端中使用ctrl 43 c可以强制终止运行的程序 xff0c 但有时需要在终止时作一些处理 xff08 如ros shotdown free等 xff09 xff0c 可使用信号函数作退出处理 头文件 include 34 csigna
  • flann error

    error usr include flann util serialization h 18 9 error class std unordered map lt unsigned int std vector lt unsigned i
  • 3个方法解决百度网盘限速

    转载自 lt 作者 xff1a 奔跑中的奶酪 原文链接 https www runningcheese com baiduyun gt 3个方法解决百度网盘限速 xff08 2019 06 20 更新 xff09 3个方法解决百度网盘限速
  • python 文件操作记录

    usr bin env python coding 61 utf 8 import os import shutil def getimagepath path file 61 open path data 61 file read lin
  • PCD格式保存

    coding utf 8 import time filename 61 34 1 txt 34 print 34 the input file name is r 34 filename start 61 time time print
  • 吴恩达机器学习笔记---持续更新

  • 边缘计算简介-1

  • 给Qt程序添加图片

    首先双击列表中的ui文件 xff0c 打开 设计器 然后从左侧列表拖一个 label 进去 然后右键点击 xff0c 出现菜单 xff0c 点击 改变样式表 然后在新出现的窗口里面输入image url 图片路径 jpg 比如 xff1a
  • 禁用win10自带的微软输入法!

    1 点击电脑主屏幕左下角开始图标 xff0c 选择设置 2 选择 时间和语言 gt 语言 gt 中文 3 单击选项 xff0c 删除微软拼音键盘即可 xff0c 这样就不会在不小心按到Ctrl 43 Shift建时 xff0c 出现切换输入
  • Office出现xukezheng问题,如何有效解决

    亲测有效哦 xff01 看原文原文出处 版本Office2019专业增强版
  • MatLab数据结构

    命名规则 xff1a 变量名区分大小写 必须以字母开头 xff0c 可以由字母 数字和下划线组成 xff0c 但不能使用标点 clc xff1a 清屏命令行窗口 clear all 清除工作区的变量 xff0c 但不清理命令行窗口 数据类型
  • MatLab矩阵运算

    1 矩阵构造及定义 A 61 1 3 5 7 8 9 构造多行矩阵 D 61 2 4 构造单行矩阵 B 61 1 2 9 最小值 xff1a 步长 xff1a 最大值 C 61 repmat D 4 3 将D的行重复四次 xff0c 列重复
  • MatLab补充

    1 matlab中所有的变量都是数组 x 61 4 实际是x数组 xff08 11大小 xff09 中存了4 y 61 6 9 是大小为12的数组存储y的数值 当您用空格 xff08 或逗号 xff09 分隔数值时 xff08 如前面的任务
  • MatLab使用注意事项

    1 在命令行输入指令 xff0c 当不加 xff1b 作为结尾时 xff0c 系统会在命令窗口输出数值 当使用 xff1b 作为命令结尾时 xff0c 系统不再输出数值 xff0c 但是会在工作区存储变量 对应的值 2 变量以字母开头 xf
  • EdgeCloudSim仿真实验平台使用介绍

    跑程序前的准备工作 xff1a Java环境配置 网上搜教程吧 xff0c 按着提示做就可以我使用的工具 xff1a Eclipse项目链接 xff1a 其中包含EdgeCloudSim英文说明文档和EdgeCloudSim工程文件夹 链接
  • 内存地址的应用

    学习python时真正了解了内存地址 cpu中的数据分类 cpu中的数据分为两类 xff1a 数据和指令 数据 xff1a 由指令产生的结果 指令 xff1a 键盘 鼠标等电脑输入设备操作以及人为对主机输入设备进行的目的性操作 值得注意的是
  • World插入图片显示不全

    在文档中直接插入图片 xff0c 显示不全 xff0c 具体的说是只能看到图片底部部分 给出两种办法解决 1 局部修改 把光标位置置于图片的末尾 xff0c 然后点击鼠标右键 xff0c 选择 段落 选项进入 段落 文本框 xff0c 选择
  • 快速消除Word文档中空格

    消除Word文档中的空格 0 待处理文档 1 选择文档的替换功能 2 选择 特殊格式 中的 段落标记p 3 设置成对应格式 4 选择全部替换 xff0c 效果如下 问题分析 xff1a 可以看出执行上述操作一次后 xff0c 相当于是扫描了
  • CCF推荐国际学术会议和期刊目录2019年

    链接 xff1a 全目录下载地址

随机推荐

  • 2022教资押题

    1 试题类型 2 具体文件夹 3 百度网盘链接 xff1a 链接 xff1a https pan baidu com s 17ZlLeE2E8Rzz7ELHptE8Fg 提取码 xff1a 9vky
  • 强化学习Q-learning入门教学

    1 问题描述 2 图形化展示 3 reward矩阵构建 4 Q表构建 这里需要说明的是Q表的转移规则原本是 xff1a 本例中为了方便介绍 xff0c 将 值设为1了 原文讲解的通俗易懂 xff0c 有兴趣的可以看一下 出处 xff1a h
  • 英文文献代码查找

    原文链接 xff1a https blog csdn net weixin 45656790 article details 109271019
  • Word中插入集合和元素的包含符号

    1 比较简单 xff0c 是元素和集合的包含关系 查找 xff1a word gt 插入 gt 符号栏下拉 xff0c 选择基础数学 2 集合间的包含关系 四个数字 xff0c 代表一个 输入文档中的指定位置 xff0c 选中数字以后 xf
  • 微信PC端聊天界面表情包无法显示

    我试成功的一个办法 xff0c 分享一下 具体步骤 xff1a 1 找到微信聊天界面的设置选项 xff0c 如图 2 进入微信文件保存位置 3 进入WeChat Files All Users config目录 4 删除config dat
  • MathType 提示需要一个新版本的MT Extra(True Type)字体

    1 打开C Windows Fonts文件夹 xff0c 若里面有MT Extra TrueType 字体或其快捷方式 xff0c 则将其删除 2 找到MathType安装目录下C Program Files x86 MathType Fo
  • Word快捷键设置上下标;Word取消表格虚线;Word查找数学符号

    问题1 快捷键设置上下角标 这个在论文写作时比较常用 xff0c 本人也是最近在写大论文 xff0c 遇到了这个情况 Word和Visio中 xff0c 都可以使用 步骤 xff1a 选中即将成为上下标的内容 xff0c 上标快捷键 xff
  • xcode中xib使用之轻松学习

    1 创建xib文件 在工程目录中New Files xff0c 选择user interface类型中的empty创建一个空的interface builder document文件 文件名没有强制的要求 xff0c 最好使用 前缀 xff
  • 用Opencv打造一台自动视觉目标跟踪系统

    平移 倾斜伺服装置 xff0c 帮助摄像机使用视觉自动跟踪颜色对象 简介 现在我们将使用我们的设备帮助相机自动跟踪颜色对象 xff0c 如下所示 xff1a OpenCV可免费用于学术和商业用途 它具有C 43 43 xff0c C xff
  • error: Microsoft Visual C++ 14.0 is required. Get it with "Microsoft Visual C++ Build Tools"【转载+修改】

    error Microsoft Visual C 43 43 14 0 is required Get it with Microsoft Visual C 43 43 Build Tools http landinghub visuals
  • 如何使用OpenCV实现多张图像拼接

    先来看看OpenCV官方的例子得到效果是非常的好 xff0c 输入的images如下 xff1a 效果 xff1a Stitcher类与detail命名空间 OpenCV提供了高级别的函数封装在Stitcher类中 xff0c 使用很方便
  • 如何使用OpenCV对物体进行搜索检测与识别

    在本教程中 xff0c 我们将了解对象检测中称为 选择性搜索 的重要概念 我们还将用C 43 43 和Python共享OpenCV代码 物体检测与物体识别 对象识别算法识别图像中存在哪些对象 它将整个图像作为输入 xff0c 并输出该图像中
  • 一种基于深度学习的方法来检测摩托车头盔的使用

    背景 据统计使用摩托车头盔可以将道路交通事故中摩托车驾驶员致命伤害的可能性降低42 xff05 xff0c 尽管如此 xff0c 遵守摩托车头盔还是较少 xff0c 尤其是在发展中国家 xff0c 为了有效开展针对性的头盔使用运动 xff0
  • 偏振光相机1——偏振光

    光的电磁波属性 光是一种电磁波 xff0c 这个概念大家应该不陌生 既然是电磁波 xff0c 那我们从电磁波的特性上来看它有哪些属性 用图1中的交变电磁场来描述光的特性 xff0c 电场和磁场在空间中相互垂直 xff0c 它们同时与光的传播
  • 偏振光相机2——索尼大法

    Stokes参量 在上一篇 偏振光相机 偏振光 中 xff0c 我们知道偏振光有线性偏振光 椭圆偏振光 圆偏光 那么如何定量的描述偏振光呢 xff1f Stokes矢量是一种广泛用来描述偏振光属性的方法 图1 不同类型的偏振光 线性偏振光和
  • 偏振光相机3——偏振应用

    在之前的2篇中 xff0c 介绍了偏振光的基本概念和基于SONY最新CMOS偏振传感器芯片的相机 在本篇中 xff0c 我们来看看偏振相机的一些应用 偏振相机的应用离不开偏振光 xff0c 那么先看看如何得到偏振光信息 如何获取偏光 在 偏
  • 【干货】生成对抗网络GANs算法在医学图像领域应用总结

    Goodfellow等人 介绍了生成对抗网络 xff08 GAN xff09 以模拟数据分布 由于与两个基本属性相关的原因 xff0c GAN可以合成真实图像 GAN是一种无监督的训练方法 xff0c 可以通过类似于人类学习图像特征的方式获
  • 图像算法之3D人脸识别技术原理概述

    随着深度学习技术的进步 xff0c 面部相关任务的研究也成为学术界和工业界的热门话题 众所周知的面部任务通常包括面部检测 xff0c 面部识别 xff0c 面部表情识别等 xff0c 其主要使用2D RGB面部 xff08 通常包括一些纹理
  • 如何使用OpenCV计算机视觉检测帕金森病图片

    在本教程中 xff0c 您将学习如何使用OpenCV和机器学习在手绘的螺旋和波浪图像中自动检测帕金森病 本教程来自来自巴西的博士生Joao Joao有兴趣利用计算机视觉和机器学习基于几何图形 xff08 即螺旋和符号波 xff09 自动检测
  • OpenCV快速寻找图像差异

    如何使用结构相似性指数 xff08 SSIM xff09 将两个图像与Python进行比较 使用这种方法 xff0c 我们能够轻松确定两个图像是否相同或由于轻微的图像处理 xff0c 压缩伪像或有目的的篡改而产生差异 今天我们将扩展SSIM