OpenCV-Python图像的减法运算cv2.subtract函数详解以及和矩阵减法的差异对比

OpenCV-Python图像差异检测:cv2.subtract实战解析与矩阵减法在视觉任务中的陷阱 本文深入解析OpenCV-Python中的`cv2.subtract`函数在图像差异检测中的应用,详细对比其与NumPy矩阵减法的核心差异,揭示饱和运算机制在视觉任务中的关键作用。通过工业质检、安防监控等实战案例,展示如何避免常见陷阱并优化性能,帮助开发者高效实现精准的图像差异分析。 阅读详情
AI摘要

本文详细介绍OpenCV图像减法运算的作用、语法及其四种应用场景,并通过案例对比OpenCV图像减法与矩阵减法的不同,展示OpenCV在图像差异检测方面的优势。

☞ ░ 前往老猿Python博客 https://blog.youkuaiyun.com/LaoYuanPython ░

一、概述

在《OpenCV-Python图像的加法运算cv2.add函数详解》详细介绍了图像的加法运算,有加法就有减法,本文介绍图像的减法运算。

图像的减法通常用于查找图像的差异,如医学上血管的影像和造影后的血管影像比对就可以看出血液流动的情况,当然减法也可以用在图像的特殊处理上。

二、cv2.subtract函数语法

调用语法:

subtract(src1, src2, dst=None, mask=None, dtype=None)

参数说明:

减法的参数与加法类似:

  1. src1:作为被减数的图像数组或一个标量
  2. src2:作为减数的图像数组或一个标量
  3. dst:可选参数,输出结果保存的变量,默认值为None,如果为非None,输出图像保存到dst对应实参中,其大小和通道数与输入图像相同,图像的深度(即图像像素的位数)由dtype参数或输入图像确
  4. mask:图像掩膜,可选参数,为8位单通道的灰度图像,用于指定要更改的输出图像数组的元素,即输出图像像素只有mask对应位置元素不为0的部分才输出,否则该位置像素的所有通道分量都设置为0
  5. dtype:可选参数,输出图像数组的深度,即图像单个像素值的位数(如RGB用三个字节表示,则为24位)。
  6. 返回值:相减的结果图像

三、减法运算的四种场景

  1. 两个图像矩阵相减, 要求两个矩阵必须有相同大小和通道数
    dst(I)=saturate(src1(I)−src2(I))if mask(I)≠0
  2. 1个图像矩阵和1个标量相减, 要求src2是标量或者与src1的通道数相同的元素个数,经实际测试应该是一个四元组,如果src1是3通道的,则按通道顺序依次与该四元组的前3个元素相减
    dst(I)=saturate(src1(I)−src2)if mask(I)≠0
  3. 1个标量和一个图像数组相减, 要求src1是标量或者与src1的通道数相同的元素个数
    dst(I)=saturate(src1−src2(I))if mask(I)≠0
  4. 在给定值减去矩阵的SubRS情况下,为1个标量和一个图像数组相减的反向差,老猿认为这是第二种场景的一种特殊解读
    dst(I)=saturate(src2−src1(I))if mask(I)≠0

以上运算过程理解存在疑问的,请参考《opencv图像处理学习随笔:帮助文档运算公式中saturate的含义》。

四、减法运算案例

下面的两张图,后者是前者基础上增加了两处文字和一处曲线:

原图seaside.jpg:

在这里插入图片描述

在原图上添加变化的新图seaside_new.jpg:在这里插入图片描述
减法案例代码:
import numpy as np
import cv2

def  main():
    img1 = cv2.imread(r'F:\pic\seaside.jpg')
    img2 = cv2.imread(r'F:\pic\seaside_new.jpg')
  
    diffImg1 = cv2.subtract(img1,img2)
    diffImg2 = cv2.subtract(img2, img1)
    diffImg3 = img1 - img2
    diffImg4 =  img2 - img1

    cv2.imshow('subtract(img1,img2)',diffImg1)
    cv2.imshow('subtract(img2,img1)', diffImg2)
    cv2.imshow('img1 - img2',diffImg3)
    cv2.imshow('img2 - img1', diffImg4)

    cv2.waitKey(0)

main()
subtract(img2, img1)结果图:

在这里插入图片描述

subtract(img1,img2)结果图:

在这里插入图片描述

img1 - img2结果图:

在这里插入图片描述

img2 - img1结果图:

在这里插入图片描述

可以看到opencv的减法和矩阵减法在处理差异时opencv的结果更自然平滑。这种情况在两个图表面看起来差不多但实际有比较大的差别时更明显。

上面的案例第一张图是使用windows画图另存之后保存的,第二张图是在前面保存图的基础上增加了内容,如果第一张图直接用原图不另存,其内容与另存的还是有比较大的差异,两个文件的大小都不同。下面的seaside2.jpg是没有使用画图工具另存的真正原图,seaside.jpg是使用画图工具另存的原图,二者图像的分辨率一样。

在这里插入图片描述
我们使用真正的原图与变换内容的图进行比较。代码如下:

def  main():
    img1 = cv2.imread(r'F:\pic\seaside2.jpg')
    img2 = cv2.imread(r'F:\pic\seaside_new.jpg')
  
    print(img1.shape,img2.shape)
    diffImg1 = cv2.subtract(img1,img2)
    diffImg2 = cv2.subtract(img2, img1)
    diffImg3 = img1 - img2
    diffImg4 =  img2 - img1

    cv2.imshow('subtract(img1,img2)',diffImg1)
    cv2.imshow('subtract(img2,img1)', diffImg2)
    cv2.imshow('img1 - img2', diffImg3)
    cv2.imshow('img2 - img1',diffImg4)

    cv2.waitKey(0)

main()

则各处理结果图像如下:

subtract(img1,img2):

在这里插入图片描述

subtract(img2,img1):在这里插入图片描述
img2-img1:

在这里插入图片描述

img1-img2:

在这里插入图片描述
可以看到,对这种图像处理时,OpenCV处理比矩阵减法要好很多。

仔细分析了一下相关数据,发现另存之后的图像大部分像素数据在BGR三个分量上出现了很小的变化,可能每个通道就1-2个数值的差异,有的通道增加了一点,有得减少了一点,opencv是饱和运算,小于0时被置为了0,但矩阵运算出现负数时由于类型是uint8,负数变成了256加该负数的值,导致差异很大。

五、小结

本文详细介绍了opencv图像减法的作用、具体语法以及四种使用场景,并举例介绍了opencv图像减法和矩阵减法的差别,可以看到,OpenCV的减法函数在图像处理上比矩阵减法更自然和平滑。

更多OpenCV-Python的介绍请参考专栏《OpenCV-Python图形图像处理 》

博文地址:https://blog.youkuaiyun.com/laoyuanpython/category_9979286.html

关于老猿的付费专栏

老猿的付费专栏《使用PyQt开发图形界面Python应用 》(https://blog.youkuaiyun.com/laoyuanpython/category_9607725.html)专门介绍基于Python的PyQt图形界面开发基础教程,付费专栏《moviepy音视频开发专栏》 (https://blog.youkuaiyun.com/laoyuanpython/category_10232926.html)详细介绍moviepy音视频剪辑合成处理的类相关方法及使用相关方法进行相关剪辑合成场景的处理,两个专栏都适合有一定Python基础但无相关知识的小白读者学习。

付费专栏文章目录:《moviepy音视频开发专栏文章目录》(https://blog.youkuaiyun.com/LaoYuanPython/article/details/107574583)、《使用PyQt开发图形界面Python应用专栏目录 》(https://blog.youkuaiyun.com/LaoYuanPython/article/details/107580932)。

对于缺乏Python基础的同仁,可以通过老猿的免费专栏《专栏:Python基础教程目录》(https://blog.youkuaiyun.com/laoyuanpython/category_9831699.html)从零开始学习Python。

如果有兴趣也愿意支持老猿的读者,欢迎购买付费专栏。

跟老猿学Python、学OpenCV!

☞ ░ 前往老猿Python博文目录 https://blog.youkuaiyun.com/LaoYuanPython ░
OpenCV图像算术运算实战:从基础到高级应用 图像处理中的算术运算是计算机视觉的基础操作,通过加减乘除等基本运算实现高级功能。在OpenCV中,图像以数值矩阵形式存储,每个像素点对应特定数值,这使得数学运算成为可能。理解数值范围溢出和尺寸匹配等核心约束是关键。算术运算技术广泛应用于图像增强、噪声消除、运动检测等场景,例如通过多帧平均法提升信噪比,或利用减法运算实现背景消除。在工业质检、医疗影像等领域,合理运用这些基础操作能解决90%的预处理问题。掌握OpenCV中的cv2.add()、cv2.subtract()等函数,以及addWeighted混合技 阅读详情

相关推荐

图像归一化原理与C++ OpenCV实战:从最值归一化到Z-Score标准化

在计算机视觉与机器学习中,数据预处理是模型性能的基石。图像归一化作为核心预处理技术,旨在解决原始像素数据因光照、设备差异导致的尺度不一问题。其核心原理是通过数学变换将数据映射到统一区间,消除量纲影响,使模型专注于本质特征。从技术价值看,归一化能显著提升模型训练稳定性,加速梯度下降收敛,并增强模型泛化能力。常见的实现方法包括最值归一化(Min-Max Scaling)和Z-Score标准化,前者通过线性缩放将数据映射到固定区间,但对异常值敏感;后者基于均值和标准差进行中心化与缩放,对异常值更鲁棒,更符合深度学

weixin_30666401的博客 461

OpenCV学习之cv2.subtract函数

是 OpenCV 库中的一个基本函数,用于对两幅图像进行逐像素的减法操作。

qq_46396470的博客 1763

曼哈顿距离实战指南:从路径规划到推荐系统的L1度量应用

曼哈顿距离(L1范数)是一种基于绝对值差求和的度量方式,本质是应对正交约束空间的高效替代方案。其原理摒弃欧氏距离的开方运算,以加法实现低开销、高鲁棒性的‘网格化’距离计算,在路径规划、图像处理、推荐系统等场景中广泛替代L2范数。技术价值体现在计算极简(无浮点开方)、对异常值不敏感、天然适配离散/稀疏/类别型特征;典型应用场景包括AGV网格寻路中的A*启发式函数、PS魔棒工具的RGB容差判定、协同过滤中的杰卡德相似度建模,以及芯片布线中的半周长线长优化。本文聚焦工程落地,覆盖NumPy向量化加速、scikit

weixin_34195142的博客 338

OpenCv中cv2.subtract(image,blurred)与(image-blurred)的区别

cv2.subtract是OpenCV库中的一个函数,用于进行图像减法运算。它可以很方便地进行两个图像之间的减法操作,也可以用来对一个图像进行常量的减法操作。

qq_40280673的博客 1230

5-OpenCVSharp —- Cv2.Subtract()函数功能(图像减法)详解

是 OpenCVSharp 中用于执行图像或矩阵之间逐元素减法的函数。它非常适用于图像差异计算、背景去除、对比度调整等操作。它自动处理减法结果为负值的情况,将其截断为零,确保输出图像不会有负值像素。在某些情况下,可以使用掩膜指定特定区域进行减法运算。

weixin_45590420的博客 917

python图片信息-2cv2-高阶处理

python图片信息-2cv2-高阶处理一:二级目录三级目录 一: 二级目录 三级目录

weixin_42914706的博客 3539

python中减法运算函数_OpenCV-Python图像的减法运算cv2.subtract函数详解以及和矩阵减...

OpenCV-Python图像的减法运算cv2.subtract函数详解以及和矩阵减OpenCV-Python图像的减法运算cv2.subtract函数详解以及和矩阵减法的差异对比? ? 前往老猿Python博文目录 ?在《OpenCV-Python图像的加法运算cv2.add函数详解》详细介绍了图像的加法运算,有加法就有减法,本文介绍图像的减法运算。图像的减法通常用于查找图像的差异,如医学上血管...

weixin_39645165的博客 3961

OpenCV-Python图像除法运算:cv2.divide()函数及图像相除处理

src1:输入图像1,数据类型为np.array。src2:输入图像2,数据类型为np.array。scale:可选参数,用于缩放结果图像的值。默认值为None,表示不进行缩放。dtype:可选参数,指定结果图像的数据类型。默认值为None,表示使用与输入图像1相同的数据类型。dst:结果图像,数据类型与输入图像1相同。

CyberFlare的博客 586

别再直接用‘-’号了!OpenCV cv2.subtract和NumPy矩阵减法,哪个更适合你的Python图像处理项目?

本文深入对比了OpenCV的cv2.subtract和NumPy矩阵减法在Python图像处理中的性能差异与应用场景。通过实际案例和性能测试,分析了两种方法在处理8位图像时的核心差异:OpenCV采用饱和运算确保视觉合理性,而NumPy使用模运算可能导致异常结果。文章为开发者提供了根据项目需求选择减法策略的实用指南,帮助优化图像处理流程。

weixin_30897233的博客 636

OpenCV-Python图像减法运算实战:cv2.subtract函数详解与矩阵减法对比

图像处理作为计算机视觉的核心技术,广泛应用于目标检测、行为识别与医学影像分析等领域。OpenCV凭借其高效的C++内核、跨平台支持及丰富的Python接口,成为行业主流工具。其中,图像算术运算是实现增强、差分与融合的基础操作,而图像减法在运动检测和背景建模中尤为关键。OpenCV通过提供专业减法函数,与NumPy的普通数组减法存在本质差异——前者采用饱和运算防止像素溢出(如将负值截断为0,超255值置为255),后者则按模运算“回卷”,易导致视觉失真。

weixin_42160645的博客 1115

基于OpenCV和Python的车牌识别系统设计与实现

图像处理是计算机视觉领域的基础能力,而车牌识别正是经典的入门实战方向。传统视觉方案利用OpenCV与Python即可完成从图像预处理、边缘检测到轮廓分析的全流程,无需深度学习即可实现车牌定位与字符识别。核心技术在于通过灰度化、高斯滤波、Sobel边缘检测和形态学闭运算生成候选区域,再结合几何特征与颜色特征筛选车牌,最后采用投影分割与模板匹配完成识别。该方案依赖简单、运行快速、可解释性强,适用于教学演示、课程设计及规范场景下的车牌识别需求,也为理解图像处理流水线提供了清晰范本。本文深入拆解各模块原理,并分享环

weixin_30567225的博客 322

图像四则运算详解:用OpenCV掌握像素加减乘除与光照校正

在图像处理中,图像可视为矩阵,像素级四则运算本质是对逐元素进行加减乘除,与线性代数中的矩阵乘法截然不同。图像加法常应用于多帧叠加降噪与亮度补偿,减法则是背景差分、运动检测的基础;乘法用于掩膜权重控制,除法可实现光照归一化,去除环境光干扰。理解这些底层像素运算,能帮助开发者真正掌握OpenCV的数值行为,规避uint8溢出、除零饱和、通道广播等工程陷阱。从工业视觉到深度学习数据预处理,几乎所有图像算法都离不开这四种基础运算。本文以Python和OpenCV为工具,系统拆解图像四则运算的原理、代码实现与调参细节

weixin_34306593的博客 327

CosyVoice 本地部署详细教程 手把手小白教程

本文提供了详细的CosyVoice本地部署教程,强调了避免中文名称和空格的重要性,并列出了必要的软件安装步骤,包括CUDA、cuDNN、Git和Miniconda。教程涵盖了从检查CUDA版本到下载模型和运行模型的全过程,确保用户能够顺利部署并使用CosyVoice。

huazn612的博客 2万+

不止是减法:用OpenCV的subtract()函数实现背景减除和运动检测(附Python/C++代码)

本文深入探讨了OpenCV的subtract()函数在背景减除和运动检测中的工业级应用。通过Python和C++代码示例,展示了如何利用帧差法实现高效实时的运动检测,并提供了动态阈值、多尺度融合等优化策略。文章还介绍了subtract()在智能交通和创意交互等领域的创新应用,以及生产环境中的性能调优建议。

weixin_30603633的博客 212

PyCharm安装PyQt5及工具(Qt Designer、PyUIC、PyRcc)详细教程来了

Qt是常用的用户界面设计工具,而在Python中则使用PyQt这一工具包,它是Python编程语言和Qt库的成功融合。这篇博文通过图文详细介绍在PyCharm中如何完整优雅地安装配置PyQt5的所有工具包,主要内容包括PyQt5、PyQt5-tools的依赖包安装和Qt Designer、PyUIC、PyRcc三个工具的设置。最后简单演示了PyQt5的调用方式及三个工具的使用方法。

Python966的博客 3万+

别再只会用Excel了!Minitab 21手把手教你搞定SPC控制图(从数据导入到结果解读)

本文详细介绍了如何使用Minitab 21高效制作SPC控制图,从数据导入到结果解读的全流程。通过对比Excel的局限性,展示Minitab在自动化计算、图表标准化和特殊原因检验等方面的优势,帮助质量管理人员提升工作效率和数据分析专业性。

weixin_30878501的博客 380

OpenCV(Python 版)

计算机中的图像本质上是由无数像素组成的网格,彩色图像通常通过红(R)、绿(G)、蓝(B)三个独立的颜色通道来记录信息,每个通道都是一个二维数字矩阵,矩阵中的数值代表对应位置像素该颜色的亮度(通常为 0-255),三个通道的数值组合决定了像素最终呈现的颜色,计算机存储的就是这些通道矩阵数据,以及图像的宽、高、通道数等元信息。

qq_32381773的博客 408

防止通达信公式被盗?手把手教你用DLL加密+互联网验证(含易语言后台管理)

本文详细介绍了如何通过DLL加密与互联网验证技术保护通达信公式安全。从DLL加密实现、设备绑定到易语言后台管理,提供了一套完整的防护方案,有效防止公式被盗用。重点讲解了互联网验证登录和绑定设备等核心技术,帮助量化交易者守护核心资产。

weixin_29323551的博客 500

OpenCV图像融合实战:从加权平均到泊松融合的算法解析与参数调优

图像融合是计算机视觉中连接图像编辑、全景拼接与多曝光合成的关键技术,其核心在于解决亮度差异、色彩跳变与结构对齐问题。OpenCV作为工业级视觉工具库,提供了从基础像素操作到数学优化模型的完整融合方案。本文从加权平均融合出发,逐步剖析拉普拉斯金字塔的多频段处理原理,并深入讲解泊松融合如何通过梯度场实现无缝边界,同时涵盖Alpha融合的灵活控制机制。结合典型应用场景如航拍图拼接、物体替换与HDR多曝光合成,梳理了不同算法的适用边界、核心参数调试策略及常见踩坑排查方法,为工程实践中快速选型与效果优化提供参考。

weixin_33946020的博客 206

Simulink+Simscape多体仿真:六自由度Stewart平台动力学建模全流程

本文详细介绍了使用Simulink和Simscape Multibody进行六自由度Stewart平台动力学建模的全流程,涵盖从CAD模型导入、运动学逆解计算到实时控制系统的设计。通过MATLAB/Simulink与Simscape的协同工作,实现高保真度的并联机器人仿真,适用于飞行模拟器、精密加工等高精度领域。

r2s3t4的博客 484

Test软件:Keysight二次开发_(1).Keysight软件开发概述

VISA(Virtual Instrument Software Architecture)库是Keysight提供的一种标准化的仪器控制接口,支持多种编程语言和开发环境。仪器通信:通过GPIB、USB、以太网等接口与仪器进行通信。数据采集:从仪器中获取测量数据。命令发送:向仪器发送控制命令。错误处理:处理通信过程中可能出现的错误。测试自动化是指通过编写脚本或程序来自动执行测试任务,从而提高测试效率和减少人为错误。Keysight的测试设备和仪器支持多种编程语言和开发环境,使得测试自动化变得相对容易。

2401_87715305的博客 1356

java中BigDecimal里面的subtract函数的意思?

java中BigDecimal里面的subtract函数的意思?

gb4215287的博客 8405

芒果YOLOv12改进90:检测头篇之ShareSepHead:即插即用|原创新颖共享Sep检测头,更省参数量,更高效,打造新型YOLOv8检测器,精度高效涨点

芒果YOLOv12改进90:检测头篇之ShareSepHead:即插即用|原创新颖共享Sep检测头,更省参数量,更高效,打造新型YOLOv8检测器,精度高效涨点

包括YOLOv5、YOLOv7、YOLOv8等模型改进 343

OpenCV函数subtract()使用心得及需要注意的地方

OpenCV函数subtract()的原型如下: void cv::subtract( InputArray src1, InputArray src2, OutputArray dst, InputArray mask = noArray(), int dtype = -1 ) 官方文档说明如下: 看了以上文档并结合自己的使用,补充说明以下几点: 1 函数subtract()不仅能做相同大小矩阵之间的差值运算,还可做矩阵与标量之间的相减运算。

昊虹AI笔记 1万+

linux系统中实现智能家居的基本方法

使用QT开发智能家居中的一个物联应用,通过云服务器远程控制设备与设备进行通信。在生活中,可以使用WIFI智能插座控制电器开关,比如远程开启热水器,远程打开空调,窗帘等等。包括:WIFI联网,注册到云服务器上,编写QT UI通过网络来与云服务器通信,然后再下发指令到这个连网的设备。硬件说明:需要有一个串口转WIFI模块,另外需要加上一个USB-TTL模块,外加一根T口USB连接线,可接入PC电脑调试。

嵌入式技术开发 2608

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

上一篇: opencv-python图像处理学习随笔:图像和标量ADD相加中的标量和图像通道数相同元素数量理解
下一篇: 关于付费专栏订阅模式调整的说明
LaoYuanPython
LaoYuanPython 2020年博客之星Top3 2020年博客之星Top3 领域专家: Python技术领域 领域专家: Python技术领域
博客等级 码龄8年 15万+粉丝 1324原创
评论 10
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LaoYuanPython

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值