☞ ░ 前往老猿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”:

python算法实现图像融合 python图像处理算法_形态学变换

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、结果图像

python算法实现图像融合 python图像处理算法_python_02

四、小结

本文介绍了图像形态学变换的梯度运算的概念、原理、类别,并举例介绍了几种梯度运算的OpenCV-Python实现以及对应图像效果,可以看到通过图像的梯度运算可以获得图像的轮廓,核的形状对图像梯度运算的影响比较大,当然核的大小同样也有比较大的影响。