【Opencv3+Python3入门(19)膨胀腐蚀开闭运算等形态学操作】

版权声明:本文为博主原创文章,转载时须注明出处 https://blog.csdn.net/KID_yuan/article/details/89575350

膨胀腐蚀操作:

图像的形态学是图像处理中可以化为一个单独的分支,主要是由数学的集合论中的相关理论发展而来,用于处理灰度图像与二值化图像中的重要手段。

膨胀(Dilate):n*n模板(矩形或十字交叉等)对图像所有像素进行窗口滑动,用窗口内最大值替换中心像素(即锚点)的值。

腐蚀(Erode):n*n模板对图像所有像素进行窗口滑动,用窗口内最小值替换中心像素(即锚点)的值。

#19,形态学处理

import cv2 as cv
import numpy as np
##膨胀
def image_Dilate(image):
    print(image.shape)
    #将图像转化为灰度图像
    gray=cv.cvtColor(image,cv.COLOR_BGR2GRAY)
    #对灰度图像进行二值化处理
    ret,binary=cv.threshold(gray,0,255,cv.THRESH_BINARY_INV | cv.THRESH_OTSU)
    #将二值化图像显示
    cv.imshow("binary",binary)
    #设置形态学结构处理的核
    kernel=cv.getStructuringElement(cv.MORPH_RECT,(5,5))
    #对二值图像进行膨胀操作
    dst=cv.dilate(binary,kernel)
    cv.imshow("dilate_demo",dst)
##腐蚀
def image_Erode(image):
    print(image.shape)
    #将图像转化为灰度图像
    gray=cv.cvtColor(image,cv.COLOR_BGR2GRAY)
    #对灰度图像进行二值化处理
    ret,binary=cv.threshold(gray,0,255,cv.THRESH_BINARY_INV | cv.THRESH_OTSU)
    #将二值化图像显示
    cv.imshow("binary",binary)
    #设置形态学结构处理的核
    kernel=cv.getStructuringElement(cv.MORPH_RECT,(3,3))
    #对二值图像进行腐蚀操作
    dst=cv.erode(binary,kernel)
    cv.imshow("erode_demo",dst)
src = cv.imread(r'F:\OutputResult\SrcImage\digits1.jpg')
cv.namedWindow("src",0)
cv.imshow("src",src)
image_Dilate(src)
cv.waitKey(0)
cv.destroyAllWindows()

下面是矩形模板结构对图像的膨胀与腐蚀效果:

 

开闭运算操作:

开运算(Open):图像形态学重要的操作之一,是基于膨胀和腐蚀操作组合而成。主要应用在二值图像中,灰度图像亦可。

过程:开运算=先腐蚀+后膨胀   输入图像+结构元素

闭运算(Close):同样是图像形态学重要的操作之一,是基于膨胀和腐蚀操作组合而成。主要应用在二值图像中,灰度图像亦可。

过程:闭运算=先膨胀+后腐蚀   输入图像+结构元素

开闭操作作用:

  • 开操作:去除小的干扰块,以及水平或垂直线的提取。
  • 闭操作:填充闭合区域

下面是对有噪声点的图像的开操作,可以发现可以将噪声点去除。

下面是对封闭区域有黑色斑点的图像进行闭运算操作,可以发现可以将其进行填充。

开操作提取水平线:

即需要将结构元素换成如下:

kernel=cv.getStructuringElement(cv.MORPH_RECT,(15,1))

由于根据我新选取的图像背景灰度值更大,因此将二值化阈值参数取反:

ret,binary=cv.threshold(gray,0,255,cv.THRESH_BINARY_INV | cv.THRESH_OTSU)

代码如下:

import cv2 as cv
import numpy as np
##开运算
def image_Open(image):
    print(image.shape)
    #将图像转化为灰度图像
    gray=cv.cvtColor(image,cv.COLOR_BGR2GRAY)
    #对灰度图像进行二值化处理,第四个参数取反即INV
    ret,binary=cv.threshold(gray,0,255,cv.THRESH_BINARY_INV | cv.THRESH_OTSU)
    #将二值化图像显示
    cv.imshow("binary",binary)
    #设置形态学结构处理的核,修改为长条矩形核
    kernel=cv.getStructuringElement(cv.MORPH_RECT,(15,1))
    #对二值图像进行开运算操作
    dst=cv.morphologyEx(binary,cv.MORPH_OPEN,kernel)
    cv.imshow("open_demo",dst)
src = cv.imread(r'F:\OutputResult\SrcImage\morph3.jpg')
cv.imshow("src",src)
image_Open(src)
cv.waitKey(0)
cv.destroyAllWindows()

效果如下:可以发现垂直方向的线以及被消除。 根据不同的需求,开操作可以进行不同的消除干扰块操作。

其他一些形态学操作:

只需要调用下面的函数,将参数op选择为需要的操作即可:

cv.morphologyEx(src, op, kernel[, dst[, anchor[, iterations[, borderType[, borderValue]]]]])

顶帽:

过程=原图像与开操作图像之间的差值图像

黑帽:

过程=闭操作图像与原图像之间的差值图像

形态学梯度:

基本梯度:膨胀后图像减去腐蚀后图像得到的差值图像。

外部梯度:原图像减去腐蚀后的图像得到的差值图像。

内部梯度:膨胀后的图像减去原图像得到的差值图像。

猜你喜欢

转载自blog.csdn.net/KID_yuan/article/details/89575350