OpenCV-Python实现通用形态学函数

 更新时间:2021年06月11日 11:15:37   作者:一天一篇Python库  
本文将结合实例代码,介绍OpenCV-Python实现通用形态学函数,包含开运算,闭运算等复杂的形态学运算,需要的朋友们下面随着小编来一起学习学习吧

通用形态学函数

上篇博文,我们介绍了形态学的基础腐蚀与膨胀操作,而将腐蚀与膨胀结合起来进行组合,我们就能实现开运算,闭运算等复杂的形态学运算。

在OpenCV中,它给我们提供的通用形态学函数为cv2.morphologyEx(),其完整定义如下:

def morphologyEx(src, op, kernel, dst=None, anchor=None, iterations=None, borderType=None, borderValue=None): 

这些参数基本前面都介绍过,不过有一点需要说明,src原始图像必须是CV_8U,CV_16U,CV_16S,CV_32F,CV_64F中的一种。

当然,这里面还有一个陌生的参数就是op,它就是各种形态学的类别,具体类别如表所示:

类型 说明 意义 操作
cv2.MORPH_ERODE 腐蚀 腐蚀 erode()
cv2.MORPH_DILATE 膨胀 膨胀 dilate()
cv2.MORPH_OPEN 开运算 先腐蚀后膨胀 dilate(erode())
cv2.MORPH_CLOSE 闭运算 先膨胀后腐蚀 erode(dilate())
cv2.MORPH_GRADIENT 形态学梯度运算 膨胀图减腐蚀图 dilate()-erode()
cv2.MORPH_TOPHAT 顶帽运算 原始图像减开运算所得图像 src-open()
cv2.MORPH_BLACKHAT 黑帽运算 闭运算所得图像减原始图像 close()-src
cv2.MORPH_HITMISS 击中击不中 前景背景腐蚀运算的交集。仅仅支持CV8UC1二进制图像 intersection(erode(src),erode(src1))

开运算

如上表所示,开运算是将原图像腐蚀,再对其进行膨胀操作。主要用于去噪,计数等。去噪我们已经通过上面的腐蚀操作就可以完成,下面我们来实现有趣的计数操作。

import cv2
import numpy as np

img = cv2.imread("open.jpg",cv2.IMREAD_UNCHANGED)
kernel = np.ones((9,9), np.float32)
result = cv2.morphologyEx(img,cv2.MORPH_OPEN,kernel,iterations=5)
cv2.imshow("img", img)
cv2.imshow("result", result)
cv2.waitKey()
cv2.destroyAllWindows()

运行之后,我们能将不同区域划分开来,效果如下:

开运算

闭运算

闭运算是先膨胀后腐蚀的运算,它有助于关闭前景物体内部的小孔,或去除物体上的小黑点,还可以将不同的前景图像进行连接。下面,我们就将上图进行连接。

import cv2
import numpy as np

img = cv2.imread("close.jpg", cv2.IMREAD_UNCHANGED)
kernel = np.ones((10, 10), np.float32)
result = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel, iterations=7)
cv2.imshow("img", img)
cv2.imshow("result", result)
cv2.waitKey()
cv2.destroyAllWindows()

运行之后,两个方块就连接为一个整体了,效果如下所示:

闭运算

形态学梯度运算

形态学梯度运算是用图像膨胀后的图像减去腐蚀图像的运算,该操作可以获取原始图像中的前景图像的边缘。我们还是用上篇膨胀的图来测试,代码如下:

import cv2
import numpy as np

img = cv2.imread("8.jpg", cv2.IMREAD_UNCHANGED)
kernel = np.ones((5, 5), np.float32)
result = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel,iterations=2)
cv2.imshow("img", img)
cv2.imshow("result", result)
cv2.waitKey()
cv2.destroyAllWindows()

运行之后,我们的图像就中空了,效果如下:

形态学梯度运算

顶帽运算

顶帽运算是用原始图像减去其开运算图像的操作。它能够获取图像的噪声信息,或者得到比原图像的边缘更亮的边缘信息。也就是获取上图中的白色线条,具体代码如下:

import cv2
import numpy as np

img = cv2.imread("8.jpg", cv2.IMREAD_UNCHANGED)
kernel = np.ones((5, 5), np.float32)
result = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel,iterations=2)
cv2.imshow("img", img)
cv2.imshow("result", result)
cv2.waitKey()
cv2.destroyAllWindows()

运行之后,效果如下:

顶帽运算

黑帽运算

黑帽运算是用闭运算图像减去原始图像的操作。它能够获取内部的小孔,或前景色中的小黑点,亦或者得到比原始图像的边缘更暗的边缘部分。这里,我们用前面的人物图像,代码如下:

import cv2
import numpy as np

img = cv2.imread("4.jpg", cv2.IMREAD_UNCHANGED)
kernel = np.ones((5, 5), np.float32)
result = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel,iterations=2)
cv2.imshow("img", img)
cv2.imshow("result", result)
cv2.waitKey()
cv2.destroyAllWindows()

运行之后,效果如下:

黑帽运算

结构元函数

前面我们介绍过,结构元可以自定义,也可以通过cv2.getStructuringElement()函数生成。这里,我们来看看其完整的定义:

def getStructuringElement(shape, ksize, anchor=None): 

shape:形状类型,取值如下表:

类型 意义
cv2.MORPH_RECT 矩形结构元,所有元素值为1
cv2.MORPH_CROSS 十字形结构元,对角线元素值为1
cv2.MORPH_ELLIPSE 椭圆形结构元素

ksize:结构元的大小

anchor:结构元的锚点位置,默认值(-1,1),是形状的中心。只有十字星型的形状与锚点位置紧密联系。在其他情况下,锚点位置仅用于形态学运算结果的调整。

下面,我们将这三种形状类型都实现一遍,具体代码如下:

import cv2

img = cv2.imread("open.jpg", cv2.IMREAD_UNCHANGED)
kernel1 = cv2.getStructuringElement(cv2.MORPH_RECT,(50,50))
kernel2 = cv2.getStructuringElement(cv2.MORPH_CROSS,(50,50))
kernel3 = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(50,50))
result1 = cv2.dilate(img,kernel1)
result2 = cv2.dilate(img,kernel2)
result3 = cv2.dilate(img,kernel3)
cv2.imshow("img", img)
cv2.imshow("result1", result1)
cv2.imshow("result2", result2)
cv2.imshow("result3", result3)
cv2.waitKey()
cv2.destroyAllWindows()

运行之后,效果如下所示:

结构元函数

到此这篇关于OpenCV-Python实现通用形态学函数的文章就介绍到这了,更多相关OpenCV 通用形态学函数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python实现迪杰斯特拉算法过程解析

    Python实现迪杰斯特拉算法过程解析

    这篇文章主要介绍了Python实现迪杰斯特拉算法过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09
  • pydev debugger: process 10341 is connecting无法debu的解决

    pydev debugger: process 10341 is co

    这篇文章主要介绍了pydev debugger: process 10341 is connecting无法debu的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-04-04
  • python人工智能tensorflow构建卷积神经网络CNN

    python人工智能tensorflow构建卷积神经网络CNN

    学习神经网络已经有一段时间,从普通的BP神经网络到LSTM长短期记忆网络都有一定的了解,但是从未系统的把整个神经网络的结构记录下来,我相信这些小记录可以帮助我更加深刻的理解神经网络
    2022-05-05
  • Django QuerySet查询集原理及代码实例

    Django QuerySet查询集原理及代码实例

    这篇文章主要介绍了Django QuerySet查询集原理及代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-06-06
  • Python Requests安装与简单运用

    Python Requests安装与简单运用

    requests是python的一个HTTP客户端库,跟urllib,urllib2类似,那为什么要用requests而不用urllib2呢?带着这个问题来一起学习本教程吧
    2016-04-04
  • 对python 多个分隔符split 的实例详解

    对python 多个分隔符split 的实例详解

    今天小编就为大家分享一篇对python 多个分隔符split 的实例详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-12-12
  • Python tkinter实现日期选择器

    Python tkinter实现日期选择器

    这篇文章主要为大家详细介绍了Python tkinter实现日期选择器,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-02-02
  • jupyter notebook运行代码没反应且in[ ]没有*

    jupyter notebook运行代码没反应且in[ ]没有*

    本文主要介绍了jupyter notebook运行代码没反应且in[ ]没有*,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • PyQt5每天必学之组合框

    PyQt5每天必学之组合框

    这篇文章主要为大家详细介绍了PyQt5每天必学之组合框,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-04-04
  • python pygame入门教程

    python pygame入门教程

    pygame是python的游戏编程模块,今天我们就来一起简单的学习如何使用该模块
    2021-06-06

最新评论