OpenCV-Python图像运算变换处理:开运算和闭运算以及不同核矩阵的影响分析

☞ ░ 前往老猿Python博客 https://blog.csdn.net/LaoYuanPython

一、引言

在《OpenCV-Python图像处理:腐蚀和膨胀原理及erode、dilate函数介绍 https://blog.csdn.net/LaoYuanPython/article/details/109441709》等系列博文中老猿详细介绍了腐蚀和膨胀的原理、算法、Python的模拟实现以及OpenCV函数的详细语法及应用,具体应用时,如果核矩阵的有效元素范围大于图像黑色孔洞,则膨胀可以填充图像中的孔洞及图像边缘的小凹陷部分,而腐蚀可以消除图像边缘类似毛刺的小的亮色部分,并缩小前景图像。

腐蚀和膨胀是形态学运算的基本运算,二者在图像处理功用上有一定相反的效果,但是二者并不是逆运算,二者可以级联结合使用。通过腐蚀和膨胀的复合和集合运算组合,就构成了形态学运算簇。

使用同一个结构元素,先对图像进行腐蚀运算,再对图像进行膨胀运算,二者的组合成为开运算;反过来先对图像进行膨胀运算,再对图像进行腐蚀运算,称为闭运算。开运算和闭运算是形态学中最为重要的两个组合运算。

在《OpenCV-Python图像形态变换概述及morphologyEx函数介绍 https://blog.csdn.net/LaoYuanPython/article/details/109556425》介绍了OpenCV-Python形态学变换的函数morphologyEx,在本节不重复介绍开运算和闭运算的具体函数调用,仅直接使用。

二、开、闭运算简介

2.1、功能和作用

开运算就是先腐蚀后膨胀的过程,用来消除背景中的小点前景色噪声、平滑形状边界、断开物体之间的细小连接,当然不同的核矩阵效果会不同,有效元素为圆的核矩阵可以平滑边界、去除突刺。

闭运算有助于关闭前景物体上的小孔,或者小黑点。闭运算用来填充物体内的小空洞,连接邻近的物体,连接断开的轮廓线,平滑其边界的同时不改变面积。闭运算是先膨胀后腐蚀的过程。合理选择卷积核大小,太小了无法去除前景图的黑点。

2.2、特性

开运算特性
  • 开运算能够除去孤立的小点,毛刺和两个景物之间的细连接线,而总的位置和形状不变
  • 开运算是一个基于几何运算的滤波器。 结构元素大小的不同将导致滤波效果的不同
  • 不同的结构元素的选择导致了不同的分割,即提取出不同的特征。
闭运算特性
  • 闭运算能够填平小湖(即小孔),弥合小裂缝,而总的位置和形状不变
  • 闭运算是通过填充图像的凹角来滤波图像的
  • 结构元素大小的不同将导致滤波效果的不同
  • 不同结构元素的选择导致了不同的分割

三、案例

3.1、案例背景

  • 为了观察开运算和闭运算对图像变换的影响,老猿自己构造了一张包含多个小图片的复合图片《黑白多态图.png》,可以用于对比观察变换后图像的变化,图像内容如下:
    在这里插入图片描述

  • 由于OpenCV的图像展示一张图像一个窗口,且无法展现超出屏幕范围大小的图像,老猿自己实现了三个函数来实现多图同屏自动排列展示

  1. previewImg(img):调用操作系统缺省图像阅读器展示图像
  2. preparePreviewImg(imgTitle=None,img=None,firstImg=False):将要多图合并展现的图片加到展现列表,如果img为None,则图像换行展现,否则图像根据大小自动排列
  3. previewImgList():将展现列表中的图片合并进行展现,展现的图像下面增加图像说明的文字,展现后清空展现列表

相关函数详细内容请见《OpenCV-Python中预览超大图的程序实现方法:https://blog.csdn.net/LaoYuanPython/article/details/110195287》。

  • 为了研究不同核对图像变换的影响,会使用不同形状不同大小的的核进行变换对比
3.2、不同大小核案例

下面使用不同的大小的核进行开闭运算。

代码:
def morphologyExTest(imgObj,imgTitle=''):
    if isinstance(imgObj, str):
        img = cv2.imread(imgObj)#, cv2.IMREAD_GRAYSCALE)
        if img is None:
            img = cv2.imdecode(np.fromfile(imgObj, dtype=np.uint8), -1)
        imgTitle = imgTitle+imgObj+': '
    else:
        imgTitle = imgTitle + ': '
    kernal = cv2.getStructuringElement(cv2.MORPH_RECT ,(3,3))
  
    imgOpen = preparePreviewImg(imgTitle+'开运算,矩形核大小3*3',cv2.morphologyEx(img, cv2.MORPH_OPEN,kernal))
    imgClose = preparePreviewImg(imgTitle+'闭运算,矩形核大小3*3',cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernal))
    kernal = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))
    imgOpen = preparePreviewImg(imgTitle + '开运算,矩形核大小5*5', cv2.morphologyEx(img, cv2.MORPH_OPEN, kernal))
    imgClose = preparePreviewImg(imgTitle + '闭运算,矩形核大小5*5', cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernal))
    preparePreviewImg()
变换后图像:

在这里插入图片描述
从上面图像对比可以看到: 核越大,开运算被侵蚀的前景色越多,闭运算则背景色被填充越多。

3.3、不同形状核案例

下面分别使用横线和竖线的核进行开闭运算。

代码:
def morphologyExTest(imgObj,imgTitle=''):
    if isinstance(imgObj, str):
        img = cv2.imread(imgObj)#, cv2.IMREAD_GRAYSCALE)
        if img is None:
            img = cv2.imdecode(np.fromfile(imgObj, dtype=np.uint8), -1)
        imgTitle = imgTitle+imgObj+': '
    else:
        imgTitle = imgTitle + ': '
    kernal = np.ones((1,5),np.uint8)
    imgOpen = preparePreviewImg(imgTitle+'开运算,横线核大小5*5',cv2.morphologyEx(img, cv2.MORPH_OPEN,kernal))
    imgClose = preparePreviewImg(imgTitle+'闭运算,横线核大小5*5',cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernal))
    kernal = np.ones((5,1),np.uint8)
    imgOpen = preparePreviewImg(imgTitle + '开运算,竖线核大小5*5', cv2.morphologyEx(img, cv2.MORPH_OPEN, kernal))
    imgClose = preparePreviewImg(imgTitle + '闭运算,竖线核大小5*5', cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernal))
    preparePreviewImg()
变换后图像:

腐蚀膨胀
从上图可以看到,横线的核和竖线的核对开闭的影响非常明显,其实就是对腐蚀和膨胀的影响。

四、小结

本文简单介绍了形态变换中的开运算和闭运算,开运算和闭运算是形态学中最为重要的两个组合运算,这两个运算是不同形状不同大小的核对图像变换的影响比较大,开运算有助于断开一些图像间的细小连接或背景上的一些图像噪点、去除图像边缘的凸起,闭运算可以用于填充图像上的细小孔洞、填充图像轮廓上的凹陷。具体应用时需要根据处理图像的特征和需要达到的目标来设置核矩阵的形状和大小。

五、形态变换博文传送门

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

  1. https://blog.csdn.net/LaoYuanPython/article/details/109441709 OpenCV-Python图像处理:腐蚀和膨胀原理及erode、dilate函数介绍
  2. https://blog.csdn.net/LaoYuanPython/article/details/109984045 OpenCV-Python图像运算变换处理:开运算和闭运算以及不同核矩阵的影响分析
  3. https://blog.csdn.net/LaoYuanPython/article/details/109556425 OpenCV-Python图像形态变换概述及morphologyEx函数介绍
  4. https://blog.csdn.net/LaoYuanPython/article/details/109768675 OpenCV-Python图像运算变换处理:形态学梯度运算及分类
  5. https://blog.csdn.net/LaoYuanPython/article/details/110195287 OpenCV-Python中预览超大图的程序实现方法
  6. https://blog.csdn.net/LaoYuanPython/article/details/110223709 OpenCV-Python图形图像处理:利用TopHat顶帽获取背景色中的噪点
  7. https://blog.csdn.net/LaoYuanPython/article/details/110294445 OpenCV-Python图形图像处理:利用黑帽去除图像浅色水印
  8. https://blog.csdn.net/LaoYuanPython/article/details/110676764 OpenCV-Python击中击不中HITMISS形态变换详解

更多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基础但无相关知识的小白读者学习。

付费专栏文章目录:《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
  • 4
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
### 回答1: 在图像处理中,膨胀、腐蚀、开运算运算是常用的基本操作,JavaCV提供了相关的方法实现。 1. 膨胀 膨胀是将目标物体的边界向外扩张,使它变宽变厚,可以用于填补空洞、连接断点等操作。 ```java int kernelSize = 5; // 卷积大小 Mat kernel = getStructuringElement(MORPH_RECT, new Size(kernelSize, kernelSize)); // 创建一个矩形卷积 Mat dilatedImage = new Mat(); dilate(image, dilatedImage, kernel); // 对图像进行膨胀操作 ``` 2. 腐蚀 腐蚀是将目标物体的边界向内收缩,使它变窄变细,可以用于消除小的干扰、分离物体等操作。 ```java int kernelSize = 5; // 卷积大小 Mat kernel = getStructuringElement(MORPH_RECT, new Size(kernelSize, kernelSize)); // 创建一个矩形卷积 Mat erodedImage = new Mat(); erode(image, erodedImage, kernel); // 对图像进行腐蚀操作 ``` 3. 开运算 开运算是先进行腐蚀操作,再进行膨胀操作,可以用于消除小的干扰、断开物体之间的细连接等操作。 ```java int kernelSize = 5; // 卷积大小 Mat kernel = getStructuringElement(MORPH_RECT, new Size(kernelSize, kernelSize)); // 创建一个矩形卷积 Mat openedImage = new Mat(); morphologyEx(image, openedImage, MORPH_OPEN, kernel); // 对图像进行开运算 ``` 4. 运算 运算是先进行膨胀操作,再进行腐蚀操作,可以用于填补小的空洞、连接物体之间的细连接等操作。 ```java int kernelSize = 5; // 卷积大小 Mat kernel = getStructuringElement(MORPH_RECT, new Size(kernelSize, kernelSize)); // 创建一个矩形卷积 Mat closedImage = new Mat(); morphologyEx(image, closedImage, MORPH_CLOSE, kernel); // 对图像进行运算 ``` 以上是JavaCV中实现膨胀、腐蚀、开运算的基本方法,需要根据实际需求选择适合的操作和参数。 ### 回答2: 膨胀和腐蚀是图像处理中常用的一对基本操作,用来改变图像的形状和结构。而开运算则是对膨胀和腐蚀的组合运算,用来改善图像的细节。 膨胀操作是将图像中的物体边缘进行扩张,使其变得更加粗壮。它是通过将图像中的每个像素与邻域内的像素进行比较,并选择其中最亮的像素作为结果像素来实现的。膨胀操作可以用来填充图像中的小缺口,连接图像中的不连续轮廓,以及扩大图像中的物体。 腐蚀操作与膨胀相反,它将图像中的物体边缘进行收缩,使其变得更加细化。腐蚀操作是通过将图像中的每个像素与邻域内的像素进行比较,并选择其中最暗的像素作为结果像素来实现的。腐蚀操作可以用来去除图像中的小噪点,分离图像中相连的物体,以及缩小图像中的物体。 开运算是先腐蚀后膨胀的组合操作,它可以用来去除图像中的毛刺和细小结构、平滑图像的边缘。运算则是先膨胀后腐蚀的组合操作,它可以用来填充图像中的小洞和断裂,平滑图像中物体的边界。开运算可以进一步强调图像中物体的形状和结构特征,提取出感兴趣的图像区域。 在JavaCV中,可以使用OpenCV库提供的函数来实现膨胀、腐蚀、开运算运算操作。这些函数可以直接在图像上操作,实现图像形态学处理。利用这些函数,我们可以对图像进行膨胀、腐蚀和开运算,从而改变图像的形状和结构,提取出我们感兴趣的图像内容。 ### 回答3: 膨胀和腐蚀是图像处理中常用的一对基本操作,可以通过改变图像形态特征来实现一些特定的图像处理任务。 膨胀操作是将图像中的亮像素扩张,使其周围的像素也变成亮像素。膨胀操作可以使目标物体变大,或者填充一些空洞。在javacv中,可以使用dilate函数实现膨胀操作。该函数接受图像矩阵和结构元素作为参数,返回经过膨胀操作后的图像。 腐蚀操作是将图像中的亮像素收缩,使其周围的像素也变成暗像素。腐蚀操作可以使目标物体变小,或者去除一些噪声。在javacv中,可以使用erode函数实现腐蚀操作。同样,该函数接受图像矩阵和结构元素作为参数,返回经过腐蚀操作后的图像开运算是先进行腐蚀操作,再进行膨胀操作。开运算可以去除小物体、平滑较大物体的边界,并且保留较大物体的形态特征。在javacv中,可以使用函数morphologyEx来实现开运算操作。 运算是先进行膨胀操作,再进行腐蚀操作。运算可以填充小空洞、平滑较小物体的边界,并且保留较小物体的形态特征。同样地,在javacv中,可以使用函数morphologyEx来实现运算操作。 总结来说,通过使用膨胀、腐蚀、开运算等操作,可以对图像进行形态学处理,改变其形态特征,实现一些特定的图像处理任务。在javacv中,可以使用相应的函数来进行这些操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

LaoYuanPython

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

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

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

打赏作者

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

抵扣说明:

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

余额充值