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. 形态学操作之闭运算