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

Posted qianxia

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python+OpenCV图像处理之开闭操作相关的知识,希望对你有一定的参考价值。

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

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

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

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

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

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

python实现

import cv2


def 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图像处理之开闭操作的主要内容,如果未能解决你的问题,请参考以下文章

面向对象之开闭原则

七大设计原则之开闭原则应用

设计模式——六大原则之开闭原则

python+opencv图像形态学处理详细解释(膨胀腐蚀开闭运算礼帽和黑猫)

6大设计原则之开闭原则

面向对象设计原则之开闭原则