news 2026/5/26 8:11:35

在大模型班学算法的笔记记录-形态学

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
在大模型班学算法的笔记记录-形态学

形态学操作是OpenCV中处理二值图像的核心手段,常用于目标检测、图像降噪、轮廓提取等场景

一、核心流程:从原图到二值化

形态学操作的前提是得到干净的二值图像,核心步骤为:灰度图 → 低通滤波 → 二值化

1. 灰度图转换

彩色图像需先转为灰度图(单通道),减少计算量,聚焦像素亮度信息:

import cv2 import numpy as np # 读取灰度图(参数0表示灰度模式) path = r"/Users/yangjunhui/Desktop/lenaNoise.png" img = cv2.imread(path, 0)

2. 低通滤波:去除噪声

原始图像可能存在椒盐噪声,用高斯滤波(低通滤波的一种)平滑图像,保留主体的同时弱化噪点:

# 高斯滤波:(5,5)为滤波核尺寸,0为标准差(自动计算) blur = cv2.GaussianBlur(img,(5,5),0)

作用:模糊图像边缘,减少后续二值化的噪点干扰。

3. 二值化:黑白分离

将灰度图转为仅含0(黑)、255(白)的二值图像,突出目标区域:

# 二值化:阈值35,超过则设为255(白),否则0(黑) ret, ths1_img = cv2.threshold(blur, 35, 255, cv2.THRESH_BINARY)

关键:阈值需根据图像调整,目标是让主体为白色,背景为黑色。

二、形态学核心操作:腐蚀与膨胀

二值化后,通过腐蚀/膨胀调整目标区域的形态,解决“毛刺”“孔洞”等问题。

1. 先搞懂:形态学核(Kernel)

操作的“工具”是卷积核,决定腐蚀/膨胀的范围和形状:

# 自定义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))

2. 腐蚀(Erosion):去毛刺、瘦化目标

原理

用核扫描每个像素,仅当核覆盖的所有像素都是白色(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, '腐蚀后')

效果

  • 白色前景区域“收缩”,边缘被侵蚀,细小花絮/毛刺(噪点)被消除;
  • 孤立的白色小噪点(如单个像素)会被完全去掉;
  • 目标区域之间的窄连接可能被断开。

适用场景:去除二值图中的白色噪点、细化目标边缘。

3. 膨胀(Dilation):填孔洞、加粗目标

原理

与腐蚀相反,核扫描时只要覆盖区域内有至少一个白色像素,中心像素就设为白色

代码实现

# 膨胀操作:迭代1次 dilate_img = cv2.dilate(ths1_img, kernel, iterations=1) show(dilate_img, '膨胀后')

效果

  • 白色前景区域“扩张”,细小孔洞/断裂处被填充;
  • 目标边缘变粗,孤立的黑色小噪点被覆盖;
  • 断裂的线条可被重新连接。

适用场景:填补目标区域的黑色孔洞、连接断裂的轮廓。

4. 拓展:形态学梯度

通过“膨胀-腐蚀”“膨胀-原图”或“原图-腐蚀”,可提取目标的边缘像素,得到空心轮廓效果,常用于轮廓检测。

四、完整实战代码

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, '膨胀后')

五、总结

操作核心效果适用场景
腐蚀去毛刺、瘦化目标消除白色噪点、细化边缘
膨胀填孔洞、加粗目标填补黑色孔洞、连接断裂轮廓
梯度提取边缘、生成空心轮廓目标轮廓检测

形态学操作的关键是“先腐蚀去噪,再膨胀修复”(开运算),或“先膨胀填洞,再腐蚀还原”(闭运算),灵活组合可解决大部分二值图处理问题。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/26 6:30:28

windows的任务管理器中利用网络指标排除故障

Windows任务管理器中的网络指标是监控网络连接、诊断网速慢、排查异常网络活动的核心工具。一、如何找到网络指标? 打开任务管理器 (Ctrl Shift Esc)。切换到“性能”选项卡。点击左侧的“以太网”(有线网卡)或“Wi-Fi”(无线网…

作者头像 李华
网站建设 2026/5/25 12:09:37

流量控制和拥塞控制的步骤?流量控制和拥塞控制的步骤?

流量控制保护接收方,拥塞控制保护网络; 流量控制靠 接收窗口(rwnd),拥塞控制靠 (cwnd)拥塞窗口 及其四阶段算法 最终的发送窗口 min(rwnd, cwnd) 接收端在三次握手或每次 ACK 中,将当前可用缓冲大小 (rwnd) 通知发送端。发送端计…

作者头像 李华
网站建设 2026/5/25 17:54:49

【Dify 1.7.0音频质量突破】:如何用内置检测模块实现零误差语音识别

第一章:Dify 1.7.0音频质量检测的核心突破Dify 1.7.0版本在音频质量检测领域实现了关键性技术跃迁,显著提升了实时音频分析的精度与响应效率。该版本引入了基于深度学习的噪声识别模型,并优化了端到端的音频处理流水线,使得系统能…

作者头像 李华
网站建设 2026/5/26 6:39:02

C++20 std::atomic_ref 的核心实现细节解析

C20 std::atomic_ref 的核心实现细节解析核心结论std::atomic_ref 是 C20 引入的原子操作工具,通过引用现有变量实现线程安全操作。其关键实现细节包括:‌原子操作机制‌‌硬件支持‌:利用 CPU 的原子指令(如 CAS)实现…

作者头像 李华
网站建设 2026/5/26 6:35:31

Python积分与求导完全指南

📊 Python积分与求导完全指南 📑 目录 求导基础Python求导实战积分基础Python积分实战概率分布函数详解知识点 1. 求导基础 📐 1.1 知识点引入 想象你正在开车,速度表显示的数字就是你的瞬时速度,这个速度其实就是位…

作者头像 李华
网站建设 2026/5/26 7:41:22

SDUT Java 类和对象

6-7 sdut-oop-6-方形矩阵的运算&#xff08;类和对象&#xff09;class Matrix{int n;int[][] matrix;//带参构造方法public Matrix(int n, int[][] matrix) {this.n n;this.matrix matrix;}public Matrix add(Matrix other){int [][ ]resultnew int [n][n];for(int i0;i<…

作者头像 李华