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 通用形态学函数内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • opencv 形态学变换(开运算,闭运算,梯度运算)

    形态学里把腐蚀和膨胀单独拿了出来,其他操作(保括膨胀和腐蚀的组合操作)都叫形态学变换. opencv里有包:cv2.morphologyEx() morphology :译文 形态学 使用python +opencv讲解 开运算 开运算:对图像先进行腐蚀,然后对腐蚀后的图进行膨胀 morphologyEx 运算结果=cv2.morphologyEx(源图像img,cv2.MORPH_OPEN,卷积核k) cv2.MORPH_OPEN:开运算 import cv2 import numpy as

  • opencv检测直线方法之形态学方法

    在阅读文献中,偶然发现使用使用形态学方法也可以检测直线,故做实验并记录. 使用该方法,需要定义一个长度为L的结构元素element,其大小应足够大以保留图像中的字符笔划,然而又恰好能检测出图像中最短的表格线. 定义如下两个结构element用以检测图中水平.竖直的表格线: Mat element1 = getStructuringElement(MORPH_RECT, Size(70, 1));// size的width应大于图像中的横向笔划 Mat element3 = getStructur

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

    通用形态学函数 上篇博文,我们介绍了形态学的基础腐蚀与膨胀操作,而将腐蚀与膨胀结合起来进行组合,我们就能实现开运算,闭运算等复杂的形态学运算. 在OpenCV中,它给我们提供的通用形态学函数为cv2.morphologyEx(),其完整定义如下: def morphologyEx(src, op, kernel, dst=None, anchor=None, iterations=None, borderType=None, borderValue=None): 这些参数基本前面都介绍过,不过有

  • Python OpenCV学习之图像形态学

    目录 背景 一.图像二值化 二.自适应阈值 三.腐蚀 四.卷积核获取 五.膨胀 六.开运算 七.闭运算 八.形态学梯度 九.顶帽运算 十.黑帽运算 总结 背景 形态学处理方法是基于对二进制图像进行处理的,卷积核决定图像处理后的效果:形态学的处理哦本质上相当于对图像做前处理,提取出有用的特征,以便后续的目标识别等任务: 一.图像二值化 定义:将图像的每个像素变成两种值,如0和255: 全局二值化的函数原型: threshold(img,thresh,maxVal,type) img:最好是灰度图像

  • OpenCV学习记录python实现连通域处理函数

    目录 1.两个函数介绍 1.1什么是连通域 1.2 cv2.connectedComponents() 1.3 cv2.connectedComponentsWithStats() 2.代码实践 3.总结 1.两个函数介绍 总得来说,connectedComponents()仅仅创建了一个标记图(图中不同连通域使用不同的标记,和原图宽高一致),connectedComponentsWithStats()可以完成上面任务,除此之外,还可以返回每个连通区域的重要信息–bounding box, ar

  • opencv python在视屏上截图功能的实现

    OpenCV简介 OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux.Windows.Android和Mac OS操作系统上.它轻量级而且高效--由一系列 C 函数和少量 C++ 类构成,同时提供了Python.Ruby.MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法. OpenCV用C++语言编写,它的主要接口也是C++语言,但是依然保留了大量的C语言接口.该库也有大量的Python.Java and MATLAB/OCTAVE(版本

  • opencv python简易文档之图像处理算法

    目录 将图片转为灰度图 HSV 图像阈值 图像平滑 形态学-腐蚀操作 形态学-膨胀操作 开运算与闭运算 梯度运算 礼帽与黑帽 图像梯度处理 Canny边缘检测 图像金字塔 图像轮廓 直方图 直方图均衡化: 自适应均衡化: 傅里叶变换 模板匹配 总结 上一篇已经给大家介绍了opencv python图片基本操作的相关内容,这里继续介绍图像处理算法,下面来一起看看吧 将图片转为灰度图 import cv2 #opencv读取的格式是BGR img=cv2.imread('cat.jpg') # 将图

  • Opencv+Python实现图像运动模糊和高斯模糊的示例

    运动模糊:由于相机和物体之间的相对运动造成的模糊,又称为动态模糊 Opencv+Python实现运动模糊,主要用到的函数是cv2.filter2D(): # coding: utf-8 import numpy as np import cv2 def motion_blur(image, degree=12, angle=45): image = np.array(image) # 这里生成任意角度的运动模糊kernel的矩阵, degree越大,模糊程度越高 M = cv2.getRotat

  • OpenCV+python手势识别框架和实例讲解

    基于OpenCV2.4.8和 python 2.7实现简单的手势识别. 以下为基本步骤 1.去除背景,提取手的轮廓 2. RGB->YUV,同时计算直方图 3.进行形态学滤波,提取感兴趣的区域 4.找到二值化的图像轮廓 5.找到最大的手型轮廓 6.找到手型轮廓的凸包 7.标记手指和手掌 8.把提取的特征点和手势字典中的进行比对,然后判断手势和形状 提取手的轮廓 cv2.findContours() 找到最大凸包cv2.convexHull(),然后找到手掌和手指的相对位置,定位手型的轮廓和关键点

  • opencv python如何实现图像二值化

    这篇文章主要介绍了opencv python如何实现图像二值化,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 代码如下 import cv2 as cv import numpy as np import matplotlib.pyplot as plt # 二值图像就是将灰度图转化成黑白图,没有灰,在一个值之前为黑,之后为白 # 有全局和局部两种 # 在使用全局阈值时,我们就是随便给了一个数来做阈值,那我们怎么知道我们选取的这个数的好坏呢?答

  • 解决Opencv+Python cv2.imshow闪退问题

    Opencv+Python cv2.imshow闪退 # 读入原始图像 origineImage = cv2.imread('./pic/6.jpeg') # 图像灰度化 # image = cv2.imread('test.jpg',0) image = cv2.cvtColor(origineImage, cv2.COLOR_BGR2GRAY) #image.save('./pic/gray.jpg') cv2.imshow('gray', image) # 将图片二值化 retval, i

  • opencv python 图片读取与显示图片窗口未响应问题的解决

    显示图像是 Opencv最基本的操作之一, imshow()函数可以实现该操作.如果使用过其他GUI框架背景,就会很自然地调用 imshow来显示一幅图像.但这个观点并不完全正确,因为图像确实会显示出来,但随即会消失. 例如下面代码: import cv2 import numpy as np img = cv2.imread('C://Users/yefci/Pictures/0.2.jpg') cv2.imshow('C://Users/yefci/Pictures/0.2.jpg',img

随机推荐