首页 > 编程知识 正文

opencv快速图像处理,opencv图像处理算法

时间:2023-05-06 00:32:13 阅读:172480 作者:710

到老猴子Python博客https://blog.csdn.net/laoyuanpython

一、引言关于图像的腐蚀与膨胀,网络上介绍的资料很多,老猴也多见,但总体上主要偏重于应用OpenCV腐蚀与膨胀函数。 另外,原理的介绍只是很少的一部分,对初学者有很多帮助,但如果想知道这一点的话,总体上是不够的。

从《OpenCV-Python常用图像运算:加减乘除幂开方对数及位运算:https://blog.csdn.net/LaoYuanPython/article/details/108879397》这篇博文发表至今,老猴对腐蚀与膨胀的原理和一些比较偏颇的问题都有了比较深入的研究,这半个月每晚都要花近三个小时进行相关的研究。 在研究期间查阅了大量的资料,进行了大量的测试,又咨询了做这方面的老同学,直到今天我觉得已经基本清楚了,所以就这方面写3-5篇与网上现有资料稍有不同的博文,从不同的角度阐述相关内容

本文是有关老猴图像腐蚀与膨胀系列的博文之一,该系列包括以下博文:

OpenCV-Python图像处理:腐蚀与膨胀原理和erode,dilate函数介绍: https://blog.csdn.net/laoyuanpython/article/details/109441709 opence 采用laoyuanpython/article/details/109477130 opencv-python图像矩阵无扩展边界腐蚀膨胀函数处理算法,探索3359blog.csdog.csdon

3359 blog.csdn.net/laoyuanpython/article/details/109407091本文作为老猴介绍图像腐蚀与膨胀处理的第一篇文章,主要涉及腐蚀与膨胀的基础概念、腐蚀与膨胀的基本运算过程、腐蚀与膨胀的

二、基础概念图像的膨胀(Dilation )和腐蚀)是两种基本的形态学运算,主要用于寻找图像中的极大区域和极小区域。 其中扩张与“区域扩张”类似,扩张了图像中的高亮区域或白色部分,其执行结果图比原始图的高亮区域大; 腐蚀就像“区域被蚕食”,缩小和细化图像中的高亮区域或白色部分会使结果图像小于原始图像中的高亮区域。

具体处理时,腐蚀和膨胀与《数字图像处理:理解什么是卷积(滤波)、卷积核以及相关参考资料(博文地址:https://blog.csdn.net/LaoYuanPython/article/details/108841819))》中介绍的卷积处理相似。

卷积处理通过使用对应于图像的矩阵的一个参考矩阵(卷积核)从左到右、从上到下移动图像矩阵,并且当移动到指定位置时,将卷积核矩阵与图像矩阵重叠的范围内的对应元素相乘来获得乘积矩阵。 卷积是指将乘积矩阵的各元素相加后的值作为结果图像矩阵锚的对应位置元素的值。

蚀刻将对应核矩阵元素不为0的位置的图像矩阵中所有元素的最小值作为结果图像矩阵锚位置的对应元素值,膨胀部将对应的核矩阵元素不为0的位置的图像矩阵中所有元素的最大值作为结果图像矩阵锚位置

三. OpenCV函数3.1、腐蚀和膨胀函数erode(src,kernel,dst=None,anchor=None,iterations=None,borderType=None,border valel ) borderValue=None ) #膨胀函数3.2,函数语法说明腐蚀与膨胀函数参数相同,返回值均为结果矩阵,相关参数含义为:

src :需要腐蚀和膨胀的图像源矩阵kernel :内核矩阵dst :返回结果的矩阵。 传递值时,不将返回值指派给单独的结果变量,直接使用dst就可以了,但是必须先定义dst。 猴子不建议传递这个参数。 因为,使用将不直接返回的结果分配给结果变量的方便的anchor :内核矩阵锚,要么不传递值,要么无法传递值。 -1)中,将校验矩阵的中心位置作为锚iterations。 迭代次数。 border type:border type :相当于一种扩展边界的模式,每次迭代次数多,该模式将该值设置为1,结果为src,iterations为1,其他参数不变,再次调用腐蚀或膨胀函数。 缺省值None表示不执行边界扩展边界值。 如果borderType=cv2.BORDER_CONSTANT,则扩展边界的元素可以用borderValue填充3.3,对于kernel核矩阵kernel核矩阵可以用getstructuringelellue填充

tStructuringElement(shape, ksize, anchor=None)

参数shape表示核的形状,有如下三个取值:

cv2.MORPH_RECT:长方形或正方形矩阵,矩阵中每个元素都为1。如图为一个5*5的正方形矩阵:

cv2.MORPH_CROSS:内置十字形矩阵,矩阵中和锚点同一列或同一行的每个元素都为1,其他元素都为0。下图为一个锚点为(2,3)的5*5内置十字形矩阵:

cv2.MORPH_ELLIPSE:内接椭圆形矩阵,矩阵中为1的元素构成一个椭圆,为该矩阵对应长方形的内接椭圆。下图为一个5*5内接椭圆矩阵:

参数ksize:矩阵的大小,表示宽和高的二元组,(3,3)表示3行3列矩阵,(6,4)表示4行6列的核矩阵

anchor:矩阵锚点,当shape为MORPH_CROSS时需要使用锚点的坐标

返回值:构造的矩阵

3.4、关于borderType

在此直接以官网的表格来说明bordType取值的含义:

由于borderType不只是腐蚀和膨胀函数使用,在其他函数中也会使用,所以上述列表中的值并不能都在腐蚀和膨胀函数中使用:

cv2.BORDER_WRAP:不能在腐蚀和膨胀函数中使用,官方文档有明确说明cv2.BORDER_TRANSPARENT:该值官网上没有说明,但老猿测试时发现报错:cv2.error: OpenCV(4.3.0) C:projectsopencv-pythonopencvmodulescoresrccopy.cpp:1179: error: (-5:Bad argument) Unknown/unsupported border type in function 'cv::borderInterpolate',老猿没有找到c++源代码进行核实,但测试来看应该也是不支持的。

另外缺省值为None时,老猿进行验证发现与cv2.BORDER_ISOLATED 值含义值相同,与列表中的说明可以相互印证。

四、腐蚀和膨胀对矩阵的影响图解

在《数字图像处理:理解什么是卷积(滤波)、卷积核以及相关参考资料》介绍了卷积核对图像处理过程,腐蚀和膨胀时核矩阵在图像矩阵中的移动过程与卷积是一样的,在此不重复介绍。下面通过案例来介绍腐蚀和膨胀结果矩阵的图像元素的生成过程。

4.1、案例1 图像源矩阵和核矩阵

锚点为红色标记的缺省中心位置,则针对源矩阵的S11和S88两个位置腐蚀和膨胀计算过程如下:

以核矩阵锚点位置与S11、S88对齐,形成核矩阵和源矩阵的重叠,对源矩阵来说,重叠区域请见上面两个颜色标记区域,其中深蓝色标记位置为核矩阵锚点对齐位置

由于核矩阵全为1,则腐蚀后结果矩阵ED的两个对应位置元素值为:
ED11 = min(S00,S01,S02,S01,S11,S12,S20,S21,S22) = 0
ED88 = min(S77,S78,S79,S87,S88,S89,S97,S98,S99) = 49

膨胀后结果矩阵DD的两个对应位置元素值为:
DD11 = max(S00,S01,S02,S01,S11,S12,S20,S21,S22) = 4
DD88 = max(S77,S78,S79,S87,S88,S89,S97,S98,S99) = 81

完整腐蚀和膨胀后的结果矩阵

上述案例的实现代码如下: import cv2,sys import numpy as np img = np.zeros((10, 10),np.uint8) for row in range(10): for col in range(10): img[row,col] = row*col kernalInt = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3)) imgErode = cv2.erode(img, kernalInt, borderType=cv2.BORDER_CONSTANT, borderValue=0) imgDilate = cv2.dilate(img, kernalInt, borderType=cv2.BORDER_CONSTANT, borderValue=0) 4.2、案例2 图像源矩阵和核矩阵

本案例和案例1的区别主要体现在两方面:

核矩阵非全0,锚点非中心位置,核矩阵锚点元素值为0由于锚点位置的变化,导致计算S88的腐蚀和膨胀值时核矩阵覆盖范围超出了源矩阵

图像源矩阵案例1相同,核矩阵调整为了十字形,锚点为(0,0),还是以源矩阵的S11和S88为例,由于核的锚点与S88对齐时,核矩阵范围超出了源矩阵范围,在此采用扩充边界模式(扩充边界值固定为0),此时两个位置与核矩阵的重叠范围为下图浅蓝色标记区域:

针对源矩阵的S11和S88两个位置腐蚀和膨胀计算过程如下:

以核矩阵锚点位置与S11、S88对齐,形成核矩阵和源矩阵的重叠,对源矩阵来说,重叠区域请见上面两个颜色标记区域,其中深蓝色标记位置为核矩阵锚点对齐位置

取重叠区域核矩阵为1的源矩阵元素的最小值,则腐蚀后结果矩阵ED的两个对应位置元素值为:
ED11 = min(S12,S22,S32,S21,S23) = 2
ED88 = min(S89,S99,Sa9,S98,S9a) = 0

膨胀后结果矩阵DD的两个对应位置元素值为:
DD11 = max(S12,S22,S32,S21,S23) = 6
DD88 = max(S89,S99,Sa9,S98,S9a) = 81

完整腐蚀和膨胀后的结果矩阵

上述案例的实现代码如下: img = np.zeros((10, 10),np.uint8) for row in range(10): for col in range(10): img[row,col] = row*col kernalInt = cv2.getStructuringElement(cv2.MORPH_CROSS, (3, 3)) imgErode = cv2.erode(img, kernalInt, anchor=(0,0),borderType=cv2.BORDER_CONSTANT, borderValue=0) imgDilate = cv2.dilate(img, kernalInt, anchor=(0,0), borderType=cv2.BORDER_CONSTANT, borderValue=0) 五、形态变换博文传送门

下面是老猿博文中与形态变换相关的博文列表:

https://blog.csdn.net/LaoYuanPython/article/details/109441709 OpenCV-Python图像处理:腐蚀和膨胀原理及erode、dilate函数介绍https://blog.csdn.net/LaoYuanPython/article/details/109984045 OpenCV-Python图像运算变换处理:开运算和闭运算以及不同核矩阵的影响分析https://blog.csdn.net/LaoYuanPython/article/details/109556425 OpenCV-Python图像形态变换概述及morphologyEx函数介绍 https://blog.csdn.net/LaoYuanPython/article/details/109768675 OpenCV-Python图像运算变换处理:形态学梯度运算及分类https://blog.csdn.net/LaoYuanPython/article/details/110195287 OpenCV-Python中预览超大图的程序实现方法https://blog.csdn.net/LaoYuanPython/article/details/110223709 OpenCV-Python图形图像处理:利用TopHat顶帽获取背景色中的噪点https://blog.csdn.net/LaoYuanPython/article/details/110294445 OpenCV-Python图形图像处理:利用黑帽去除图像浅色水印https://blog.csdn.net/LaoYuanPython/article/details/110676764 OpenCV-Python击中击不中HITMISS形态变换详解 附:一些参考资料 《数字图像处理第九章——形态学图像处理》 《【OpenCV 图像形态学】1.膨胀与腐蚀》 《数字图像处理中的形态学操作》 《(四)OpenCV-Python学习—形态学处理》 《图像腐蚀与图像膨胀(Python篇)》 《Opencv python 锚点anchor位置及borderValue的改变对膨胀腐蚀的影响》,介绍原理的好文,不过写得还不是很透彻,看了至少5遍,反复测试之后才真正理解 《OpenCV学习(10) 图像的腐蚀与膨胀(1)》 《 图像腐蚀与图像膨胀(18)》 《腐蚀、膨胀,细化算法》或《第6章腐蚀,膨胀,细化算法》 写作不易,敬请支持:

如果阅读本文于您有所获,敬请点赞、评论、收藏,谢谢大家的支持!

小技巧: 可以通过点击博文下面的一键三连按钮实现对相关文章的点赞、收藏和对博客的关注,谢谢!

更多OpenCV-Python的介绍请参考专栏《OpenCV-Python图形图像处理 》
专栏网址:https://blog.csdn.net/laoyuanpython/category_9979286.html

关于老猿的付费专栏

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

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

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

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

跟老猿学Python、学OpenCV! ☞ ░ 前往老猿Python博文目录 https://blog.csdn.net/LaoYuanPython ░

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。