计算机视觉--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 小时前
医药集团数智化转型,智能综合管理平台激活集团管理新效能
大数据·人工智能·oa协同办公
聆风吟º3 小时前
CANN runtime 实战指南:异构计算场景中运行时组件的部署、调优与扩展技巧
人工智能·神经网络·cann·异构计算
Codebee5 小时前
能力中心 (Agent SkillCenter):开启AI技能管理新时代
人工智能
聆风吟º6 小时前
CANN runtime 全链路拆解:AI 异构计算运行时的任务管理与功能适配技术路径
人工智能·深度学习·神经网络·cann
uesowys6 小时前
Apache Spark算法开发指导-One-vs-Rest classifier
人工智能·算法·spark
AI_56786 小时前
AWS EC2新手入门:6步带你从零启动实例
大数据·数据库·人工智能·机器学习·aws
User_芊芊君子6 小时前
CANN大模型推理加速引擎ascend-transformer-boost深度解析:毫秒级响应的Transformer优化方案
人工智能·深度学习·transformer
智驱力人工智能7 小时前
小区高空抛物AI实时预警方案 筑牢社区头顶安全的实践 高空抛物检测 高空抛物监控安装教程 高空抛物误报率优化方案 高空抛物监控案例分享
人工智能·深度学习·opencv·算法·安全·yolo·边缘计算
qq_160144877 小时前
亲测!2026年零基础学AI的入门干货,新手照做就能上手
人工智能
Howie Zphile7 小时前
全面预算管理难以落地的核心真相:“完美模型幻觉”的认知误区
人工智能·全面预算