图像处理核心 20% — 先问”我要改像素还是改结构”
一句话:传统图像处理就五个动作——看颜色、去掉噪、突出边、连成块、换个位置。90% 的前处理需求,都是这五个动作的组合。
🎯 这 20% 能解决哪些问题
| 常见困惑 | 本质 | 本页答案 |
|---|
| 为什么灰度图能做人脸检测,彩色反而不行 | 色彩空间与通道冗余 | 见「色彩空间怎么选」 |
| 边缘检测结果全是噪点 | 未先做平滑 | 见「边缘检测的先后顺序」 |
| 二值化后字符断成一节一节 | 阈值与形态学没配合 | 见「形态学:腐蚀与膨胀」 |
| 图片缩放后文字糊成一团 | 插值方法选错 | 见「几何变换与插值」 |
| 想用传统方法做缺陷检测,从哪下手 | 需要一条固定流水线 | 见「工业检测流水线」 |
一、色彩空间怎么选
| 空间 | 通道 | 适合 | 不适合 |
|---|
| BGR/RGB | 蓝绿红 | 显示、简单阈值 | 光照变化 |
| 灰度 | 亮度 | 边缘、模板匹配 | 依赖颜色的区分 |
| HSV | 色相/饱和度/明度 | 颜色分割(唯一推荐) | 直接做卷积 |
| Lab | 亮度 + 两轴色度 | 色差计算(ΔE) | 直观调参 |
关键直觉:在 HSV 里做”找红色”,只需对 H 通道设区间,不受亮度影响;在 RGB 里同一件事要写三个通道的复杂条件。
二、滤波:先决定”保边还是去掉”
| 滤波 | 作用 | 代价 |
|---|
| 均值/高斯 | 平滑高斯噪声 | 边缘模糊 |
| 中值 | 去椒盐噪声(最有效) | 慢,细线可能被吃掉 |
| 双边 | 保边平滑 | 慢 |
| 非局部均值 | 强去噪 | 很慢 |
顺序铁律:先去噪,再求梯度。直接对噪声图做 Sobel,得到的全是噪声的梯度。
三、边缘检测的先后顺序
graph LR
A["灰度化"] --> B["高斯平滑"]
B --> C["梯度<br/>Sobel"]
C --> D["非极大值抑制"]
D --> E["双阈值滞后<br/>Canny"]
| 方法 | 特点 | 场景 |
|---|
| Sobel / Scharr | 简单,给出方向 | 快速粗筛 |
| Laplacian | 对噪声敏感 | 需先强平滑 |
| Canny | 单像素宽边缘,需两个阈值 | 默认首选 |
| 霍夫变换 | 检测直线/圆 | 车道线、表格框 |
Canny 双阈值调参:低阈值 = 高阈值 × 0.4 是常用起点。低阈值过高 → 边缘断裂;过低 → 噪点增多。
四、形态学:腐蚀与膨胀
| 操作 | 效果 | 用途 |
|---|
| 腐蚀 | 前景缩小 | 去小噪点、断开粘连 |
| 膨胀 | 前景扩大 | 填补空洞、连接断裂 |
| 开运算(先腐后膨) | 去小噪点保留大块 | 最常用的清理 |
| 闭运算(先膨后腐) | 填小孔、连断裂 | 文字/条码修复 |
结构元(kernel)的选择:文字用 3×3 或 (1×3),粘连分离用较大的椭圆核。核越大,形态越”钝”。
五、几何变换与插值
| 操作 | 矩阵要素 | 注意 |
|---|
| 缩放 | 缩放因子 | 缩小用 INTER_AREA,放大用 INTER_CUBIC |
| 旋转 | 旋转矩阵 + 中心 | 先算新画布尺寸,避免裁掉四角 |
| 仿射 | 3 点对应 | 保留平行性 |
| 透视 | 4 点对应 | 文档矫正、车牌矫正 |
插值口诀:缩小用面积插值(避免摩尔纹),放大用三次插值(更平滑),掩膜与标签图一律用最近邻(禁止插值出中间值)。
六、工业检测流水线
| 步骤 | 动作 | 目的 |
|---|
| 1 | 定位 ROI(模板匹配/轮廓) | 消除位置偏移 |
| 2 | 光照归一化(CLAHE) | 抗光照波动 |
| 3 | 去噪(中值/双边) | 稳定后续阈值 |
| 4 | 分割(自适应阈值/HSV) | 得到候选区域 |
| 5 | 形态学清理 | 去掉碎块 |
| 6 | 特征判定(面积/长宽比/圆度) | 规则化判别 |
| 7 | 输出坐标与判定 | 与 PLC/MES 对接 |
务实建议:传统方法在稳定光照 + 单品类场景仍然是最优解,成本与可解释性远胜训练模型;但光照一变就要重调参数,这是它的天花板。
七、OpenCV 二十个必会操作
| # | 操作 | 函数 |
|---|
| 1–3 | 读/显示/写 | imread imshow imwrite |
| 4 | 转灰度 | cvtColor |
| 5 | 缩放 | resize |
| 6 | 裁剪 | 数组切片 |
| 7 | 旋转/仿射 | warpAffine |
| 8 | 透视变换 | warpPerspective |
| 9 | 高斯模糊 | GaussianBlur |
| 10 | 中值滤波 | medianBlur |
| 11 | 双边滤波 | bilateralFilter |
| 12 | 全局阈值 | threshold |
| 13 | 自适应阈值 | adaptiveThreshold |
| 14 | Otsu | threshold(..., THRESH_OTSU) |
| 15 | 边缘 | Canny |
| 16 | 形态学 | morphologyEx |
| 17 | 轮廓 | findContours / drawContours |
| 18 | 直方图均衡 | equalizeHist / createCLAHE |
| 19 | 模板匹配 | matchTemplate |
| 20 | 形态学距离/连通域 | connectedComponentsWithStats |
📋 一页速查
| 问题 | 答案 |
|---|
| 颜色分割用什么空间 | HSV |
| 椒盐噪声用什么 | 中值滤波 |
| 边缘检测前必做什么 | 高斯平滑 |
| 去小噪点用什么 | 开运算 |
| 缩小图片用什么插值 | INTER_AREA |
| 标签图缩放用什么 | 最近邻 |
🔗 相关链接