写点什么

OpenCV 形态学操作之腐蚀与膨胀,开运算与闭运算,顶帽与黑帽,图像梯度运算相关知识点回顾

发布于: 1 小时前

Python OpenCV 365 天学习计划,与橡皮擦一起进入图像领域吧。本篇博客是这个系列的第 45 篇。

基础知识铺垫

今天咱们对 OpenCV 形态学操作进行一下回顾,在之前的博客中已经进行了首次学习,如果你还没有看到,可以翻阅 本篇博客,当然还有这篇博客后面的那篇博客。

腐蚀与膨胀

先上结论,腐蚀就是吃掉边缘,膨胀就是扩展边缘。


这次测试前,橡皮擦提前准备了一张图片,测试起来就方便多了,下图的亮点是漂亮(注意这个图的背景色是纯白色)。



对其进行腐蚀操作的代码是:


import cv2 as cvimport numpy as npsrc = cv.imread("./t2.png")gray = cv.cvtColor(src, cv.COLOR_BGR2GRAY)
# 二值化ret, thresh = cv.threshold(gray, 127, 255, cv.THRESH_BINARY)# 腐蚀kernel = np.ones((5, 5), np.uint8)dst = cv.erode(thresh, kernel=kernel)
cv.imshow("dst", dst)cv.waitKey(0)cv.destroyAllWindows()
复制代码


运行时候,发现文字加粗加黑了,这里要记住,腐蚀是把白色像素吃掉,黑色像素区域越来越多。



如果我们只是单纯的想要去掉原图中的细线,在做二值化的时候,注意反向操作,修改代码如下:


# 二值化ret, thresh = cv.threshold(gray, 127, 255, cv.THRESH_BINARY_INV)# 腐蚀kernel = np.ones((3, 3), np.uint8)dst = cv.erode(thresh, kernel=kernel)
复制代码


卷积核调小一些,要不主要的文字都给腐蚀掉了。



膨胀操作,让白色像素区域变多。


import cv2 as cvimport numpy as npsrc = cv.imread("./t2.png")gray = cv.cvtColor(src, cv.COLOR_BGR2GRAY)
# 二值化ret, thresh = cv.threshold(gray, 127, 255, cv.THRESH_BINARY_INV)# 腐蚀kernel = np.ones((3, 2), np.uint8)dst1 = cv.erode(thresh, kernel=kernel)# 膨胀dst2 = cv.dilate(dst1, kernel=kernel)
image = np.vstack((dst1,dst2))cv.imshow("image", image)cv.waitKey(0)cv.destroyAllWindows()
复制代码


开闭操作

开运算与闭运算就是将腐蚀与膨胀合并到了一个函数中,详细说明在橡皮擦的博客 也有说明。


我们可以应用 cv2.morphologyEx 函数解决开闭运算,后面的顶帽与黑帽也是应用该函数。


不断的进行开运算,会看到黑色的区域一点点的被腐蚀掉了,白色区域逐渐扩大,因为开运算时先腐蚀后膨胀。


# 开操作kernel = np.ones((3, 3), np.uint8)dst1 = cv.morphologyEx(thresh, cv.MORPH_OPEN, kernel,iterations=1)dst2 = cv.morphologyEx(thresh, cv.MORPH_OPEN, kernel,iterations=2)dst5 = cv.morphologyEx(thresh, cv.MORPH_OPEN, kernel,iterations=5)dst10 = cv.morphologyEx(thresh, cv.MORPH_OPEN, kernel,iterations=10)
image = np.hstack((dst1,dst2,dst5,dst10))
复制代码



闭运算结果,黑色区域逐渐扩大。


顶帽与黑帽

顶帽也叫做礼帽顶帽:原图像与开运算结果图之差黑帽:闭运算结果图与原图像之差


这个地方细琢磨就有趣了,开运算结果可以去除噪声,顶帽是用原图像减去开运算结果,那岂不是为了获取噪声?实际测试之后还真就得到了噪声。


# 开操作kernel = np.ones((3, 3), np.uint8)open_img = cv.morphologyEx(thresh, cv.MORPH_OPEN, kernel, iterations=1)

# 顶帽运算dst = cv.morphologyEx(thresh, cv.MORPH_TOPHAT, kernel)image = np.hstack((gray, open_img, dst))
复制代码



黑帽操作,得到图像内部的小孔,或前景色的小黑点,下面的图像中在白色星星中可以获取一个笑脸,即前景色中的小黑点。


# 闭运算kernel = np.ones((5, 5), np.uint8)close_img = cv.morphologyEx(thresh, cv.MORPH_CLOSE, kernel, iterations=1)
# 黑帽运算dst = cv.morphologyEx(thresh, cv.MORPH_BLACKHAT, kernel)image = np.hstack((gray, close_img, dst))cv.imshow("image", image)
复制代码


形态学梯度(Gradient)

简单说就是用膨胀之后的图像,减去腐蚀后的图像,得到的就是梯度图像。形态学梯度的处理结果是图像中物体的边界。


kernel = np.ones((5, 5), np.uint8)# 闭运算close_img = cv.morphologyEx(thresh, cv.MORPH_CLOSE, kernel, iterations=1)# 开运算open_img = cv.morphologyEx(thresh, cv.MORPH_OPEN, kernel, iterations=1)# 梯度运算result = cv.morphologyEx(thresh, cv.MORPH_GRADIENT, kernel, iterations=1)
复制代码


橡皮擦的小节

希望今天的 1 个小时你有所收获,我们下篇博客见~


博主 ID:梦想橡皮擦,希望大家<font color="red">点赞</font>、<font color="red">评论</font>、<font color="red">收藏</font>。

发布于: 1 小时前阅读数: 3
用户头像

爬虫 100 例作者,蓝桥签约作者,博客专家 2021.02.06 加入

6 年产品经理+教学经验,3 年互联网项目管理经验; 互联网资深爱好者; 沉迷各种技术无法自拔,导致年龄被困在 25 岁; CSDN 爬虫 100 例作者。 个人公众号“梦想橡皮擦”。

评论

发布
暂无评论
OpenCV 形态学操作之腐蚀与膨胀,开运算与闭运算,顶帽与黑帽,图像梯度运算相关知识点回顾