计算机视觉--Opencv(图像形态学)

一、什么是形态学

图像形态学是一种处理图像形状特征的图像处理技术,主要用于描述和处理图像中的形状和结构。形态学可以用于提取图像中的特征、消除噪声、改变图像的形状等。

图像形态学的本质是利用结构元素(Kernel) 对图像中的像素集合进行遍历和运算,结构元素可以理解为一个固定大小的矩阵(常见 3×3、5×5),决定了形态学操作的作用范围和强度。在 OpenCV 中,我们通常使用np.ones()创建结构元素,数据类型需指定为np.uint8(8 位无符号整数,符合图像像素值的存储格式)。

形态学操作主要针对二值图像(像素值仅为 0 或 255)设计,但也可直接应用于彩色图像(对每个通道分别运算)。其核心逻辑是:用结构元素逐个扫描图像像素,根据结构元素覆盖区域内的像素值分布,按照特定规则更新中心像素值。

图像形态学包括:腐蚀,膨胀,开运算,闭运算,顶帽,黑帽

二、核心形态学操作

1. 腐蚀(Erosion):收缩图像中的亮区域

原理:腐蚀操作会遍历图像每个像素,仅当结构元素覆盖的所有像素均为前景(亮区域)时,中心像素才保留为前景,否则置为背景。直观来看,腐蚀会让图像中的亮区域 "收缩",能够去除小的亮噪声、细化轮廓。

代码如下:

python 复制代码
import numpy as np
sun = cv2.imread(r"C:\Users\LEGION\Desktop\e49744045d58d227e7b0e6fb6a78f40f.png")
cv2.imshow('src',sun)
cv2.waitKey(0)

# 创建3×3结构元素,迭代6次
kernel = np.ones((3,3),np.uint8) #设置kenenel大小,核改为5*5试试
erosion_1 = cv2.erode(sun,kernel,iterations=6) #iterations改为5试试t
cv2.imshow('erosion_1',erosion_1)
cv2.waitKey(0)

注释:iterations=6表示迭代6次,迭代次数越多,腐蚀越强

kernel:3×3 的全 1 矩阵,决定腐蚀的作用范围;若改为 5×5,腐蚀的 "力度" 会更大。

运行结果:

(左边为原图,右边为处理后的图)

2、膨胀(Dilation):扩张图像中的亮区域

原理:膨胀与腐蚀是逆操作,遍历像素时只要结构元素覆盖区域内有一个前景像素,中心像素就置为前景。膨胀会让亮区域 "扩张",可填补亮区域的孔洞、连接断裂的轮廓,常用来增强文字、线条等特征。

代码如下:

python 复制代码
wenzi = cv2.imread(r"C:\Users\LEGION\Desktop\020770f8a876cc367f6e4a9ecca16062.png")
cv2.imshow('src1',wenzi)
cv2.waitKey(0)

#2×2结构元素,迭代8次膨胀
kernel = np.ones((2,2),np.uint8) #设置kenenel大小
wenzi_new = cv2.dilate(wenzi,kernel,iterations=8)
cv2.imshow('wenzi_new',wenzi_new)
cv2.waitKey(0)

运行结果:

(左边为原图,右边为处理后的图)

对于模糊、细弱的文字,膨胀操作能让笔画变粗,提升文字的辨识度。

3. 开运算(MORPH_OPEN):先腐蚀后膨胀

原理 :开运算 = 腐蚀 + 膨胀,核心作用是去除亮噪声、保留主体轮廓。先通过腐蚀消除小的亮噪声点,再通过膨胀恢复主体区域的大小,不会显著改变主体的整体形状。

代码如下:

python 复制代码
zhiwen = cv2.imread(r"C:\Users\LEGION\Desktop\ac124e8ac55daae789ca66981fa85ba6.png")
cv2.imshow( 'src2',zhiwen)
cv2.waitKey(0)
kernel = np.ones((2,2),np.uint8)#设置kenenel大小
zhiwen_new = cv2.morphologyEx(zhiwen,cv2.MORPH_OPEN,kernel) #开f运算
cv2.imshow('zhiwen_new',zhiwen_new)
cv2.waitKey(0)

运行结果:

(左边为原图,右边为处理后的图)

指纹图像常存在细小的亮噪声点(如扫描杂质),开运算能精准去除这些噪声,同时保持指纹纹路的完整性,是指纹预处理的经典操作。

4. 闭运算(MORPH_CLOSE):先膨胀后腐蚀

原理 :闭运算 = 膨胀 + 腐蚀,核心作用是填补暗孔洞、连接断裂的亮区域。先通过膨胀填补亮区域中的小暗孔,再通过腐蚀恢复主体轮廓的原始大小。

代码如下:

python 复制代码
zhiwen_duan = cv2.imread(r"C:\Users\LEGION\Desktop\74f556d4bef606797b2cbcf72c00958e.png")
cv2.imshow( 'src3',zhiwen_duan)
cv2.waitKey(0)
kernel=np.ones( (4,4),np.uint8) #设置kenenel大小
zhiwen_new = cv2.morphologyEx(zhiwen_duan,cv2.MORPH_CLOSE,kernel) #闭运算
cv2.imshow('zhiwen_new1',zhiwen_new)
cv2.waitKey(0)

运行结果:

(左边为原图,右边为处理后的图)

指纹纹路若因磨损、扫描问题出现断裂,闭运算可通过先膨胀连接断裂处,再腐蚀还原纹路粗细,有效修复指纹的完整性。

三、进阶形态学操作

1. 形态学梯度(MORPH_GRADIENT):提取图像边缘

原理 :形态学梯度 = 膨胀图像 - 腐蚀图像,能精准提取图像中亮区域的边缘轮廓。因为膨胀会让亮区域向外扩张,腐蚀会让亮区域向内收缩,两者的差值恰好是边缘部分。

代码如下:

python 复制代码
wenzi = cv2.imread('wenzi.png')
cv2.imshow('wenzi',wenzi)
cv2.waitKey(0)
kernel = np.ones((2,2),np.uint8)
#膨胀
pz_wenzi = cv2.dilate(wenzi,kernel,iterations=1)
cv2.imshow('pz_wenzi',pz_wenzi)
cv2.waitKey(0)
#腐蚀
fs_wenzi = cv2.erode(wenzi,kernel,iterations=1)
cv2.imshow('fs_wenzi',fs_wenzi)
cv2.waitKey(0)
#膨胀加腐蚀
bianyuan = cv2.morphologyEx(wenzi,cv2.MORPH_OPEN,kernel)
cv2.imshow('dianyuan',bianyuan)
cv2.waitKey(0)
cv2.destroyAllWindows()

运行结果:

2. 顶帽(MORPH_TOPHAT):提取亮细节

原理:顶帽 = 原始图像 - 开运算结果,开运算会去除亮噪声,因此顶帽操作能突出原始图像中比周围区域亮的细节(如小的亮斑点)。

代码如下:

python 复制代码
sun = cv2.imread(r"C:\Users\LEGION\Desktop\e49744045d58d227e7b0e6fb6a78f40f.png")
cv2.imshow( 'sun_yuantu',sun)
cv2.waitKey(0)
kernel = np.ones((2,2),np.uint8) #设置kenenel大/小
#开运算
open_sun=cv2.morphologyEx(sun,cv2.MORPH_OPEN,kernel)
cv2.imshow( 'open_sun',open_sun)
cv2.waitKey(0)
#顶帽
tophat = cv2.morphologyEx(sun,cv2.MORPH_TOPHAT, kernel)
cv2.imshow('TOPHAT',tophat)
cv2.waitKey(0)

运行结果:

3. 黑帽(MORPH_BLACKHAT):提取暗细节

原理:黑帽 = 闭运算结果 - 原始图像,闭运算会填补暗孔洞,因此黑帽操作能突出原始图像中比周围区域暗的细节(如小的暗斑点、孔洞)

代码如下:

python 复制代码
sun = cv2.imread(r"C:\Users\LEGION\Desktop\e49744045d58d227e7b0e6fb6a78f40f.png")
cv2.imshow( 'sun_yuantu',sun)
cv2.waitKey(0)
kernel = np.ones((2,2),np.uint8) #设置kenenel大/小
 #闭运算
close_sun=cv2.morphologyEx(sun,cv2.MORPH_CLOSE, kernel)
cv2.imshow('close_sun',close_sun)
cv2.waitKey(0)
#黑帽
blackhat = cv2.morphologyEx(sun,cv2.MORPH_BLACKHAT,kernel)
cv2.imshow('BLACKHAT',blackhat)
cv2.waitKey(0)

运行结果:

四、形态学操作的参数选择技巧

1.结构元素大小

小结构元素(2×2、3×3)适合精细操作(如提取文字边缘),大结构元素(4×4、5×5)适合粗粒度处理(如修复断裂的指纹)。

2.迭代次数

迭代次数越多,操作强度越大。腐蚀 / 膨胀的迭代次数需根据图像特征调整,避免过度处理导致主体特征丢失。

3.操作组合

实际应用中常组合多种操作,如先开运算去噪声,再形态学梯度提取边缘,能大幅提升处理效果。

相关推荐
懈尘2 小时前
基于Spring Boot与LangChain4j的AI驱动新闻系统设计与工程实现
java·大数据·人工智能·spring boot·后端·langchain
倔强的石头1062 小时前
假设空间与版本空间 —— 机器学习是 “猜规律” 的过程
人工智能·机器学习
flying_13142 小时前
图神经网络分享系列-GGNN(GATED GRAPH SEQUENCE NEURAL NETWORKS)(三)
人工智能·深度学习·神经网络·图神经网络·ggnn·门控机制·图特征学习
cooldream20092 小时前
Agent Skill:新一代 AI 设计模式的原理、实践与 MCP 协同应用解析
人工智能·mcp·agent skill
言無咎2 小时前
传统财务RPA陷入性能瓶颈?AI财务机器人用LLM重构智能财税
人工智能·机器人·rpa
一休哥助手2 小时前
2026年1月25日人工智能早间新闻
人工智能
小圣贤君2 小时前
在 Electron 应用中优雅接入 DeepSeek AI:从零到一的完整实践指南
人工智能·electron·vue3·ai写作·deepseek
小程故事多_802 小时前
AI Agent架构革命,Skills模式为何能颠覆传统Workflow?
人工智能·架构·aigc
sali-tec2 小时前
C# 基于OpenCv的视觉工作流-章15-多边形逼近
图像处理·人工智能·opencv·算法·计算机视觉