Python+OpenCV图像处理之开闭操作,,开操作:图像形态学的


开操作:图像形态学的重要操纵之一,基于膨胀与腐蚀操作组合形成的;主要是应用在二值图像分析中,灰度图像亦可

开操作 = 腐蚀+膨胀 ,输入图像 + 结构元素

作用:用来消除小物体、平滑较大物体的边界的同时并不明显改变其面积,提取水平或竖直的线

闭操作:图像形态学的重要操纵之一,基于膨胀与腐蚀操作组合形成的;主要是应用在二值图像分析中,灰度图像亦可

闭操作 = 膨胀+腐蚀 ,输入图像 + 结构元素

作用:用来填充物体内细小空洞、连接邻近物体、平滑其边界的同时并不明显改变其面积

python实现

import cv2def open_demo(image):    print(image.shape)    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)    ret, binary = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)    cv2.imshow("binary", binary)    kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))    binary = cv2.morphologyEx(binary, cv2.MORPH_OPEN, kernel)    cv2.imshow("open result", binary)def close_demo(image):    print(image.shape)    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)    ret, binary = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)    cv2.imshow("binary", binary)    kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))    binary = cv2.morphologyEx(binary, cv2.MORPH_CLOSE, kernel)    cv2.imshow("close result", binary)if __name__ == "__main__":    img = cv2.imread("image/open.jpg")    cv2.namedWindow("input image",cv2.WINDOW_AUTOSIZE)    cv2.imshow("input image", img)    open_demo(img)    cv2.waitKey(0)    cv2.destroyAllWindows()

开操作结果,尽量保留其他结构元素不变,消除小物体

技术图片

技术图片

当我们改变内核的大小,就能达到不同的效果,比如我们设置ksize=(15,1),就可以提取图像中的水平直线

 kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (15, 1)) binary = cv2.morphologyEx(binary, cv2.MORPH_OPEN, kernel)

同理,我们让ksize=(1,15),就可以提取图像中的垂直直线。结果如下

技术图片技术图片

闭操作结果,填充封闭区域,其他保持不变

技术图片

当我们改变内核的形状,也能达到不同的效果,比如提取图像中的圆

 kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5, 5)) binary = cv2.morphologyEx(binary, cv2.MORPH_CLOSE, kernel)

结果如下

技术图片

技术图片

src参数:输入图像

op参数:操作类型

  MORTH_OPEN 函数做开运算

  MORTH_CLOSE 函数做闭运算

  MORTH_GRADIENT 函数做形态学梯度运算

  MORTH_TOPHAT 函数做顶帽运算

  MORTH_BLACKHAT 函数做黑帽运算

  MORTH_DILATE 函数做膨胀运算

  MORTH_ERODE 函数做腐蚀运算

kernel参数 :内核类型,用getStructuringElement函数得到

Python+OpenCV图像处理之开闭操作

评论关闭