计算机视觉--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.操作组合

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

相关推荐
科技小花6 小时前
全球化深水区,数据治理成为企业出海 “核心竞争力”
大数据·数据库·人工智能·数据治理·数据中台·全球化
zhuiyisuifeng7 小时前
2026前瞻:GPTimage2镜像官网或将颠覆视觉创作
人工智能·gpt
徐健峰7 小时前
GPT-image-2 热门玩法实战(一):AI 看手相 — 一张手掌照片生成专业手相分析图
人工智能·gpt
weixin_370976358 小时前
AI的终极赛跑:进入AGI,还是泡沫破灭?
大数据·人工智能·agi
Slow菜鸟8 小时前
AI学习篇(五) | awesome-design-md 使用说明
人工智能·学习
冬奇Lab8 小时前
RAG 系列(五):Embedding 模型——语义理解的核心
人工智能·llm·aigc
深小乐8 小时前
AI 周刊【2026.04.27-05.03】:Anthropic 9000亿美元估值、英伟达死磕智能体、中央重磅定调AI
人工智能
码点滴8 小时前
什么时候用 DeepSeek V4,而不是 GPT-5/Claude/Gemini?
人工智能·gpt·架构·大模型·deepseek
狐狐生风8 小时前
LangChain 向量存储:Chroma、FAISS
人工智能·python·学习·langchain·faiss·agentai
波动几何8 小时前
CDA架构代码工坊技能cda-code-lab
人工智能