首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

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

  • 23-09-22 14:21
  • 2793
  • 10648
blog.csdn.net

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

一、引言

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

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

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

在《OpenCV-Python图像形态变换概述及morphologyEx函数介绍 http://iyenn.com/rec/324891.html》介绍了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中预览超大图的程序实现方法:http://iyenn.com/rec/325150.html》。

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

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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
变换后图像:

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

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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
变换后图像:

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

四、小结

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

五、形态变换博文传送门

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

  1. http://iyenn.com/rec/324890.html OpenCV-Python图像处理:腐蚀和膨胀原理及erode、dilate函数介绍
  2. http://iyenn.com/rec/324926.html OpenCV-Python图像运算变换处理:开运算和闭运算以及不同核矩阵的影响分析
  3. http://iyenn.com/rec/324891.html OpenCV-Python图像形态变换概述及morphologyEx函数介绍
  4. http://iyenn.com/rec/324927.html OpenCV-Python图像运算变换处理:形态学梯度运算及分类
  5. http://iyenn.com/rec/325150.html OpenCV-Python中预览超大图的程序实现方法
  6. http://iyenn.com/rec/324928.html OpenCV-Python图形图像处理:利用TopHat顶帽获取背景色中的噪点
  7. http://iyenn.com/rec/324929.html OpenCV-Python图形图像处理:利用黑帽去除图像浅色水印
  8. http://iyenn.com/rec/324533.html OpenCV-Python击中击不中HITMISS形态变换详解

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

关于老猿的付费专栏

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

付费专栏文章目录:《moviepy音视频开发专栏文章目录》(http://iyenn.com/rec/324326.html)、《使用PyQt开发图形界面Python应用专栏目录 》(http://iyenn.com/rec/324324.html)。

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

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

跟老猿学Python、学OpenCV!

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

文章已被收录至官方知识档案
OpenCV技能树二值图像处理开运算与闭运算20473 人正在系统学习中
老猿Python
微信公众号
专注Python相关语言、图像音视频处理、AI
注:本文转载自blog.csdn.net的LaoYuanPython的文章"https://blog.csdn.net/LaoYuanPython/article/details/109984045"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2024 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top