服装跨界文创产品联动收益程序,服饰+包装+周边礼盒整套打包利润核算。
2026/7/7 17:41:15
形态学操作是OpenCV中处理二值图像的核心手段,常用于目标检测、图像降噪、轮廓提取等场景
形态学操作的前提是得到干净的二值图像,核心步骤为:灰度图 → 低通滤波 → 二值化。
彩色图像需先转为灰度图(单通道),减少计算量,聚焦像素亮度信息:
import cv2 import numpy as np # 读取灰度图(参数0表示灰度模式) path = r"/Users/yangjunhui/Desktop/lenaNoise.png" img = cv2.imread(path, 0)原始图像可能存在椒盐噪声,用高斯滤波(低通滤波的一种)平滑图像,保留主体的同时弱化噪点:
# 高斯滤波:(5,5)为滤波核尺寸,0为标准差(自动计算) blur = cv2.GaussianBlur(img,(5,5),0)作用:模糊图像边缘,减少后续二值化的噪点干扰。
将灰度图转为仅含0(黑)、255(白)的二值图像,突出目标区域:
# 二值化:阈值35,超过则设为255(白),否则0(黑) ret, ths1_img = cv2.threshold(blur, 35, 255, cv2.THRESH_BINARY)关键:阈值需根据图像调整,目标是让主体为白色,背景为黑色。
二值化后,通过腐蚀/膨胀调整目标区域的形态,解决“毛刺”“孔洞”等问题。
操作的“工具”是卷积核,决定腐蚀/膨胀的范围和形状:
# 自定义3×3全1核(常用尺寸,可根据需求调整为5×5、7×7等) kernel = np.ones((3,3), np.uint8)np.ones((3,3)):生成3行3列全1矩阵,代表以当前像素为中心,覆盖周围8个像素;np.uint8:像素值专用类型(0-255),保证计算兼容。OpenCV也提供预设核(无需手动定义):
# 矩形核(默认) kernel_rect = cv2.getStructuringElement(cv2.MORPH_RECT, (5,5)) # 椭圆核(更贴合圆形目标) kernel_ellipse = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5,5))用核扫描每个像素,仅当核覆盖的所有像素都是白色(255)时,中心像素才保留白色,否则设为黑色。
# 腐蚀操作:迭代1次(次数越多,腐蚀越强) erosion_img = cv2.erode(ths1_img, kernel, iterations = 1) # 显示结果(自定义显示函数) def show(img, title=''): cv2.imshow(title, img) cv2.waitKey(0) show(erosion_img, '腐蚀后')适用场景:去除二值图中的白色噪点、细化目标边缘。
与腐蚀相反,核扫描时只要覆盖区域内有至少一个白色像素,中心像素就设为白色。
# 膨胀操作:迭代1次 dilate_img = cv2.dilate(ths1_img, kernel, iterations=1) show(dilate_img, '膨胀后')适用场景:填补目标区域的黑色孔洞、连接断裂的轮廓。
通过“膨胀-腐蚀”“膨胀-原图”或“原图-腐蚀”,可提取目标的边缘像素,得到空心轮廓效果,常用于轮廓检测。
import cv2 import numpy as np # 自定义显示函数 def show(img, title=''): cv2.imshow(title, img) cv2.waitKey(0) cv2.destroyWindow(title) # 关闭窗口,避免占用内存 # 1. 读取灰度图 path = r"/Users/yangjunhui/Desktop/lenaNoise.png" img = cv2.imread(path, 0) show(img, '原始灰度图') # 2. 高斯滤波降噪 blur = cv2.GaussianBlur(img, (5,5), 0) show(blur, '高斯滤波后') # 3. 二值化 ret, ths1_img = cv2.threshold(blur, 35, 255, cv2.THRESH_BINARY) show(ths1_img, '二值化后') # 4. 定义形态学核 kernel = np.ones((3,3), np.uint8) # 5. 腐蚀操作 erosion_img = cv2.erode(ths1_img, kernel, iterations=1) show(erosion_img, '腐蚀后') # 6. 膨胀操作 dilate_img = cv2.dilate(ths1_img, kernel, iterations=1) show(dilate_img, '膨胀后')| 操作 | 核心效果 | 适用场景 |
|---|---|---|
| 腐蚀 | 去毛刺、瘦化目标 | 消除白色噪点、细化边缘 |
| 膨胀 | 填孔洞、加粗目标 | 填补黑色孔洞、连接断裂轮廓 |
| 梯度 | 提取边缘、生成空心轮廓 | 目标轮廓检测 |
形态学操作的关键是“先腐蚀去噪,再膨胀修复”(开运算),或“先膨胀填洞,再腐蚀还原”(闭运算),灵活组合可解决大部分二值图处理问题。