Python 图像处理 OpenCV (10):图像处理形态学之顶帽运算与黑帽运算

前文传送门:

「Python 图像处理 OpenCV (1):入门」

「Python 图像处理 OpenCV (2):像素处理与 Numpy 操作以及 Matplotlib 显示图像」

「Python 图像处理 OpenCV (3):图像属性、图像感兴趣 ROI 区域及通道处理」

「Python 图像处理 OpenCV (4):图像算数运算以及修改颜色空间」

「Python 图像处理 OpenCV (5):图像的几何变换」

「Python 图像处理 OpenCV (6):图像的阈值处理」

「Python 图像处理 OpenCV (7):图像平滑(滤波)处理」

「Python 图像处理 OpenCV (8):图像腐蚀与图像膨胀」

「Python 图像处理 OpenCV (9):图像处理形态学开运算、闭运算以及梯度运算」

引言

今天是图形处理形态学的最后一篇,我们介绍顶帽运算和黑帽运算。

建议先阅读前面两篇图像处理的内容:

「Python 图像处理 OpenCV (8):图像腐蚀与图像膨胀」

「Python 图像处理 OpenCV (9):图像处理形态学开运算、闭运算以及梯度运算」

形态学之顶帽运算

图像处理顶帽运算是一个获取图像噪声的运算,它是由原始图像减去图像开运算而得到的结果:

顶帽运算 = 原始图像 - 开运算

图像顶帽运算同样是使用形态学扩展函数 morphologyEx() ,它的参数是 MORPH_TOPHAT ,示例如下:

import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt

# 读取图片
source = cv.imread("demo_noise_white.jpg", cv.IMREAD_GRAYSCALE)

# 设置卷积核
kernel = np.ones((5, 5), np.uint8)

# 开运算
open = cv.morphologyEx(source, cv.MORPH_OPEN, kernel)

# 顶帽运算
dst = cv.morphologyEx(source, cv.MORPH_TOPHAT, kernel)

# 显示结果
titles = ['Source Img','Open Img', 'Tophat Img']
images = [source, open, dst]

# matplotlib 绘图
for i in range(3):
   plt.subplot(1, 3, i+1), plt.imshow(images[i],'gray')
   plt.title(titles[i])
   plt.xticks([]),plt.yticks([])

plt.show()

形态学之黑帽运算

图像处理顶帽运算是一个获取图像内部的小孔,或者前景色中的小黑点的运算。

它是由图像闭运算减去原始图像的操作:

黑帽运算 = 闭运算图像 - 原始图像

图像顶帽运算同样是使用形态学扩展函数 morphologyEx() ,它的参数是 MORPH_BLACKHAT ,示例如下:

import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt

# 读取图片
source = cv.imread("demo_noise_black.jpg", cv.IMREAD_GRAYSCALE)

# 设置卷积核
kernel = np.ones((5, 5), np.uint8)

# 黑帽运算
dst = cv.morphologyEx(source, cv.MORPH_BLACKHAT, kernel)

# 构造显示结果数组
titles = ['Source Img', 'Black Img']
images = [source, dst]

# matplotlib 绘图
for i in range(2):
   plt.subplot(1, 2, i+1), plt.imshow(images[i],'gray')
   plt.title(titles[i])
   plt.xticks([]),plt.yticks([])

plt.show()

今天的内容比较短,至此,图像形态学的几个基础的运算已经全部介绍完毕,希望各位同学能理解这几个运算的原理,而不是仅仅知道了几个参数或者说几个方法的调用。

示例代码

如果有需要获取源码的同学可以在公众号回复「OpenCV」进行获取。

posted @   极客挖掘机  阅读(2179)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
历史上的今天:
2016-06-15 EffectiveJava——接口优于抽象类
点击右上角即可分享
微信分享提示