☞ ░ 前往老猿Python博客 https://blog.csdn.net/LaoYuanPython ░
一、引言
在前面的《OpenCV-Python图像处理:腐蚀和膨胀原理及erode、dilate函数介绍》等系列博文中老猿详细介绍了腐蚀和膨胀的原理、算法、Python的模拟实现以及OpenCV函数的详细语法及应用。
图像腐蚀后图像整体就会缩小,而膨胀就会扩大,用膨胀后的图像减去源图像或腐蚀后的图像,或者用源图像减去腐蚀后的图像,都会去除图像前景色中间的部分得到一个图像的轮廓,这些减法运算就是形态学梯度运算。
二、形态学梯度运算简介
按照减法运算参与对象不同,形态学梯度运算又分为基本梯度运算、内部梯度运算和外部梯度运算三种。
2.1、基本梯度运算
基本梯度运算是用膨胀后的图像减去腐蚀后的图像得到差值图像,该图像就是原图像对应的轮廓,称为梯度图,因为该运算也是OpenCV中morphologyEx函数支持的唯一梯度运算(op参数=MORPH_GRADIENT),因此被称为基本梯度。一般说的梯度运算都是指基本梯度。
基本梯度图的计算方式为:dst = dilate (src, kernal) - erode(src, kernal)
使用morphologyEx来执行,则调用方法为:
morphologyEx(src, CV2.MORPH_GRADIENT, kernel, dst=None, anchor=None, iterations=None, borderType=None, borderValue=None)
当kernel核矩阵为一行的二阶矩阵代表X方向的直线时,得到的梯度图称为X方向梯度图,如果使用N行1列的二阶矩阵代表Y方向的直线时,得到的梯度图称为Y方向梯度图,这两种特例统称为方向梯度。
2.2、内部梯度运算
内部梯度就是用源图像减去腐蚀后的图像的运算,得到的目标图像称为内部梯度图,显然内部梯度图的轮廓一定包含在基本梯度图的轮廓中,其轮廓线也必包含在源图像中,因此称为内部梯度图。
内部梯度图的计算方式为:dst = src - erode(src, kernal)
2.3、外部梯度运算
外部梯度就是用膨胀后图像减去源图像的运算,得到的目标图像称为外部梯度图,相对源图像,外部梯度图的轮廓线都是原图像之外,因此称为外部梯度图。
外部梯度图的计算方式为:dst = dilate (src, kernal) - src
三、几种梯度图对比
3.1、源图
下面使用如下一副图来看几种梯度图的效果,图像文件名为“三角圆.jpg”:
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,(5, 5) )
imgGradientBasic = preparePreviewImg(imgTitle + '基本梯度,矩形核大小5*5', cv2.morphologyEx(img, cv2.MORPH_GRADIENT , kernal))
imgGradientExternal = preparePreviewImg(imgTitle + '外部梯度,矩形核大小5*5', cv2.dilate(img, kernal)-img)
preparePreviewImg()
imgGradientInternal = preparePreviewImg(imgTitle + '内部梯度,矩形核大小5*5',img - cv2.erode(img, kernal))
kernal = np.ones((5, 1), np.uint8)
imgGradientX = preparePreviewImg(imgTitle + 'X方向梯度,横线核大小5*1', cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernal))
preparePreviewImg()
kernal = np.ones((1, 5), np.uint8)
imgGradientY = preparePreviewImg(imgTitle + 'Y方向梯度,竖线核大小1*5', cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernal))
preparePreviewImg()
def morphologyTest():
morphologyExTest(r'f:pic三角圆.jpg') #
previewImgList()
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
上面代码中使用的图像预览的函数请见《OpenCV-Python图像运算变换处理:开运算和闭运算以及不同核矩阵的影响分析: http://iyenn.com/rec/324926.html》的介绍。
3.3、结果图像
四、小结
本文介绍了图像形态学变换的梯度运算的概念、原理、类别,并举例介绍了几种梯度运算的OpenCV-Python实现以及对应图像效果,可以看到通过图像的梯度运算可以获得图像的轮廓,核的形状对图像梯度运算的影响比较大,当然核的大小同样也有比较大的影响。
五、形态变换博文传送门
下面是老猿博文中与形态变换相关的博文列表:
- http://iyenn.com/rec/324890.html OpenCV-Python图像处理:腐蚀和膨胀原理及erode、dilate函数介绍
- http://iyenn.com/rec/324926.html OpenCV-Python图像运算变换处理:开运算和闭运算以及不同核矩阵的影响分析
- http://iyenn.com/rec/324891.html OpenCV-Python图像形态变换概述及morphologyEx函数介绍
- http://iyenn.com/rec/324927.html OpenCV-Python图像运算变换处理:形态学梯度运算及分类
- http://iyenn.com/rec/325150.html OpenCV-Python中预览超大图的程序实现方法
- http://iyenn.com/rec/324928.html OpenCV-Python图形图像处理:利用TopHat顶帽获取背景色中的噪点
- http://iyenn.com/rec/324929.html OpenCV-Python图形图像处理:利用黑帽去除图像浅色水印
- http://iyenn.com/rec/324533.html OpenCV-Python击中击不中HITMISS形态变换详解
写作不易,敬请支持:
如果阅读本文于您有所获,敬请点赞、评论、收藏,谢谢大家的支持!
参考博文:
【拜小白opencv】40-形态学滤波5——形态学梯度(基本梯度、内部梯度、外部梯度、方向梯度)
更多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 ░



评论记录:
回复评论: