☞ ░ 前往老猿Python博客 ░
一、引言
图像腐蚀后图像整体就会缩小,而膨胀就会扩大,用膨胀后的图像减去源图像或腐蚀后的图像,或者用源图像减去腐蚀后的图像,都会去除图像前景色中间的部分得到一个图像的轮廓,这些减法运算就是形态学梯度运算。
二、形态学梯度运算简介
按照减法运算参与对象不同,形态学梯度运算又分为基本梯度运算、内部梯度运算和外部梯度运算三种。
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()
3.3、结果图像
四、小结
本文介绍了图像形态学变换的梯度运算的概念、原理、类别,并举例介绍了几种梯度运算的OpenCV-Python实现以及对应图像效果,可以看到通过图像的梯度运算可以获得图像的轮廓,核的形状对图像梯度运算的影响比较大,当然核的大小同样也有比较大的影响。