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

本文详细介绍了Python使用OpenCV进行图像处理中的形态学操作,包括腐蚀、膨胀、开运算、闭运算以及顶帽和黑帽的概念和应用。通过实例代码展示了如何使用这些操作去除噪声、提取边界和细节,对于理解和实践OpenCV的图像处理非常有帮助。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Python OpenCV 365 天学习计划,与橡皮擦一起进入图像领域吧。本篇博客是这个系列的第 45 篇。
该系列文章导航参考:https://blog.youkuaiyun.com/hihell/category_10688961.html

基础知识铺垫

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

腐蚀与膨胀

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

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

OpenCV 形态学操作之腐蚀与膨胀,开运算与闭运算,顶帽与黑帽,图像梯度运算相关知识点回顾
对其进行腐蚀操作的代码是:

import cv2 as cv
import numpy as np
src = 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()

运行时候,发现文字加粗加黑了,这里要记住,腐蚀是把白色像素吃掉,黑色像素区域越来越多。
OpenCV 形态学操作之腐蚀与膨胀,开运算与闭运算,顶帽与黑帽,图像梯度运算相关知识点回顾
如果我们只是单纯的想要去掉原图中的细线,在做二值化的时候,注意反向操作,修改代码如下:

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

卷积核调小一些,要不主要的文字都给腐蚀掉了。
OpenCV 形态学操作之腐蚀与膨胀,开运算与闭运算,顶帽与黑帽,图像梯度运算相关知识点回顾
膨胀操作,让白色像素区域变多。

import cv2 as cv
import numpy as np
src = 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()

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

开闭操作

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

我们可以应用 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))

OpenCV 形态学操作之腐蚀与膨胀,开运算与闭运算,顶帽与黑帽,图像梯度运算相关知识点回顾
闭运算结果,黑色区域逐渐扩大。
OpenCV 形态学操作之腐蚀与膨胀,开运算与闭运算,顶帽与黑帽,图像梯度运算相关知识点回顾

顶帽与黑帽

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

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

# 开操作
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))

OpenCV 形态学操作之腐蚀与膨胀,开运算与闭运算,顶帽与黑帽,图像梯度运算相关知识点回顾
黑帽操作,得到图像内部的小孔,或前景色的小黑点,下面的图像中在白色星星中可以获取一个笑脸,即前景色中的小黑点。

# 闭运算
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)

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

形态学梯度(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)

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

橡皮擦的小节

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

相关阅读


技术专栏

  1. Python 爬虫 100 例教程,超棒的爬虫教程,立即订阅吧
  2. Python 爬虫小课,精彩 9 讲

今天是持续写作的第 87 / 100 天。
如果你想跟博主建立亲密关系,可以关注同名公众号 梦想橡皮擦,近距离接触一个逗趣的互联网高级网虫。
博主 ID:梦想橡皮擦,希望大家点赞评论收藏

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梦想橡皮擦

如有帮助,来瓶可乐

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值