opencv学习记录之形态学操作

Posted miaorn

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了opencv学习记录之形态学操作相关的知识,希望对你有一定的参考价值。

 

腐蚀和膨胀是形态学运算的基础,将腐蚀和膨胀进行组合运算,通过不同的组合可以实现不同的效果,需要自行开发则可以实现开运算,闭运算,形态学梯度运算,礼帽运算

黑帽运算,击中击不中运算等不同形式的运算

函数形式

dst = cv2.morphologyEx( src , op , kernel [ , anchor [ , interations [, borderType [ , borderValue]]]])

dst 形态学操作之后的图像,与原图像类型大小相同

src需要操作的图像,与之腐蚀和膨胀操作一样要求深度

op代表操作类型

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

 

kernel  anchor  interations  borderType  borderValue与cv2.erode()参数含义一致

 

开运算

将图像先腐蚀后膨胀,可以用于去噪、计数等

1 import cv2                                                                       
2 import numpy as np 
3 img = cv2.imread("opening.bmp")
4 k = np.ones((10,10) , np.uint8)
5 r = cv2.morphologyEx(img , cv2.MORPH_OPEN , k) 
6 cv2.imshow("img" , img)
7 cv2.imshow("result" , r) 
8 cv2.waitKey()
9 cv2.destroyAllWindows()

原图

技术图片

 

 

 

效果图

技术图片

 

 

 

 

 

闭运算

先膨胀后腐蚀, 有助于关闭前景体内的小孔, 或者除去物体上的小黑点, 还可以用于不同前景图像进行连接

1 import cv2                                                                       
2 import numpy as np 
3 img = cv2.imread("closing.bmp")
4 k = np.ones((10,10) , np.uint8)
5 r = cv2.morphologyEx( img , cv2.MORPH_CLOSE , k , iterations = 3) 
6 cv2.imshow("img" , img)
7 cv2.imshow("result" , r) 
8 cv2.waitKey()
9 cv2.destroyAllWindows()

原图

技术图片

 

 

 效果图

技术图片

 

 

 

 

形态学梯度运算

用图像的膨胀图减去腐蚀图像   可以获取原始图像中前景图像的边缘

1 import cv2                                                                       
2 import numpy as np 
3 img = cv2.imread("gradient.bmp" , cv2.IMREAD_UNCHANGED)
4 k = np.ones((5,5) , np.uint8)
5 r = cv2.morphologyEx(img , cv2.MORPH_GRADIENT , k) 
6 cv2.imshow("img" , img)
7 cv2.imshow("result" , r) 
8 cv2.waitKey()
9 cv2.destroyAllWindows()

 

原图

 

 

 技术图片

 

 

 效果图

技术图片

 

 

 

 

顶帽运算

用原始图像减去其开运算图像的操作   该操作可以获取图像的噪声信息, 或者得到比原始图像的边缘更亮的边缘信息

1 import cv2                                                                       
2 import numpy as np
3 img = cv2.imread("tophat.bmp" , cv2.IMREAD_UNCHANGED)
4 k = np.ones((5,5) , np.uint8)
5 r = cv2.morphologyEx(img , cv2.MORPH_TOPHAT , k)
6 cv2.imshow("img", img)
7 cv2.imshow("result" , r)
8 cv2.waitKey()
9 cv2.destroyAllWindows()

原图

技术图片

 

 

效果图技术图片

 

 

 

 

 

黑帽运算

是用闭运算图像减去原始图像的操作, 黑猫运算能够获取图像内壁的小孔,或前景色中的小黑点, 或者得到比原始图像的边缘

更暗的边缘部分

1 import cv2                                                                       
2 import numpy as np 
3 img = cv2.imread("blackhat.bmp" , cv2.IMREAD_UNCHANGED)
4 k = np.ones((5,5) , np.uint8)
5 r = cv2.morphologyEx(img , cv2.MORPH_BLACKHAT , k) 
6 cv2.imshow("img" , img)
7 cv2.imshow("result" , r) 
8 cv2.waitKey()
9 cv2.destroyAllWindows()

原图

 技术图片

 

 效果图

技术图片

 

以上是关于opencv学习记录之形态学操作的主要内容,如果未能解决你的问题,请参考以下文章

youcans 的 OpenCV 例程200篇113. 形态学操作之腐蚀

youcans 的 OpenCV 例程200篇114. 形态学操作之膨胀

youcans 的 OpenCV 例程200篇117. 形态学操作之顶帽运算

youcans 的 OpenCV 例程200篇116. 形态学操作之闭运算

youcans 的 OpenCV 例程 200 篇118. 形态学操作之底帽运算

youcans 的 OpenCV 例程 200 篇118. 形态学操作之底帽运算