3. 特征提取方法:纹理特征、形状特征、灰度共生矩阵、LBP算子
特征提取,说白了就是把图像里的“缺陷信号”翻译成计算机能理解的数字语言。我做了这么多年缺陷检测,最深的体会就是:特征选对了,模型就成功了一半。选错了,再好的分类器也白搭。
这一章,我们重点聊四种最常用的特征提取方法。它们各有各的脾气,也各有各的用武之地。
3.1 纹理特征:缺陷的“皮肤”密码
纹理是什么?就是材料表面的“皮肤”。光滑的、粗糙的、有规律的、杂乱的——这些都属于纹理信息。很多缺陷,比如划痕、裂纹、腐蚀坑,都会改变局部纹理。
我个人习惯把纹理特征分成两类:
- 统计纹理:基于像素灰度值的分布规律,比如均值、方差、熵
- 结构纹理:基于纹理基元的排列规则,比如周期性、方向性
举个例子。我在检测金属拉丝表面时发现,正常区域的纹理方向很一致,一旦出现划痕,纹理方向就乱了。这时候用方向性特征,一抓一个准。
3.2 形状特征:缺陷的“骨架”信息
形状特征描述的是缺陷的几何属性。比如:
- 面积:缺陷像素总数
- 周长:缺陷边界长度
- 圆形度:4π×面积/周长²,越接近1越像圆
- 长宽比:最小外接矩形的长宽比
- 凸包面积比:缺陷面积/凸包面积
我记得有一次做PCB焊点检测。气泡缺陷和正常焊点,纹理上差别不大,但形状上——气泡是圆的,正常焊点是不规则的。用圆形度特征,一下就分开了。
| 形状特征 | 适用场景 | 典型缺陷 |
|---|---|---|
| 面积 | 区分大小缺陷 | 大裂纹 vs 小气孔 |
| 圆形度 | 区分规则/不规则 | 气泡 vs 划痕 |
| 长宽比 | 区分线状/块状 | 裂纹 vs 凹坑 |
| 凸包面积比 | 区分简单/复杂形状 | 规则孔洞 vs 不规则腐蚀 |
3.3 灰度共生矩阵(GLCM):纹理的“统计词典”
灰度共生矩阵,英文叫GLCM,是纹理分析里最经典的方法之一。它的核心思想很简单:统计图像中两个像素在某个方向和距离上同时出现的概率。
GLCM本身不是特征,而是个矩阵。我们需要从矩阵里再提取统计量,常用的有:
- 对比度:反映纹理的清晰度和沟纹深浅
- 相关性:反映纹理的方向性
- 能量:反映纹理的均匀性和粗细
- 同质性:反映纹理的局部变化程度
我建议你记住一个经验:对比度+能量这对组合,能解决大部分纹理缺陷问题。对比度抓变化,能量抓均匀度,互补性很好。
• 距离d:一般取1或2,太大容易丢失细节
• 方向θ:通常取0°、45°、90°、135°四个方向,然后取均值
• 灰度级:一般压缩到16或32级,太多计算量大,太少信息丢失
3.4 LBP算子:纹理的“局部指纹”
LBP,全称Local Binary Pattern,局部二值模式。它是我个人非常喜欢的一种纹理特征。为什么?因为它简单、快速、对光照变化不敏感。
LBP的原理很直观:
- 取一个中心像素,和它周围的邻居像素比较
- 邻居比中心大,记1;比中心小,记0
- 把这些0和1按顺序排成一串二进制数
- 转成十进制,就是这个像素的LBP值
举个例子。一个3×3的窗口,中心像素值是128,周围8个像素分别是[130, 125, 132, 120, 135, 118, 140, 122]。比较后得到[1, 0, 1, 0, 1, 0, 1, 0],二进制10101010,十进制170。这个170就是中心像素的LBP值。
把所有像素的LBP值统计成直方图,就是整幅图像的LBP特征向量。
3.5 四种方法对比与选择
说了这么多,到底该用哪个?我整理了一张对比表,你一看就明白:
| 方法 | 核心思想 | 优点 | 缺点 | 典型应用 |
|---|---|---|---|---|
| 纹理特征 | 统计像素分布 | 计算简单,直观 | 对光照敏感 | 表面粗糙度检测 |
| 形状特征 | 描述几何属性 | 物理意义明确 | 依赖分割质量 | 焊点、气泡检测 |
| GLCM | 统计像素对关系 | 纹理描述能力强 | 计算量大 | 织物、木材纹理分析 |
| LBP | 局部二值模式 | 光照鲁棒,速度快 | 对噪声敏感 | 实时在线检测 |
我的建议是:先用LBP快速验证可行性,再用GLCM做精细分析。如果缺陷有明显的几何特征,别忘了加上形状特征。纹理特征作为补充,锦上添花。
3.6 特征提取流程总览
下面这张图,是我自己总结的特征提取流程。每次做项目,我都会先走一遍这个流程,确保不遗漏关键步骤。
嗯,这里要注意:特征不是越多越好。我见过有人一口气提取了50多个特征,结果模型反而过拟合了。我的经验是,先选5-8个最有区分力的特征,效果不够再加。
3.7 实战避坑指南
最后,分享几个我踩过的坑:
- 特征尺度不一致:面积可能是几千,圆形度是0.几。不归一化的话,大数值特征会主导模型。我建议用Z-score或Min-Max归一化。
- 忽略特征相关性:GLCM的对比度和能量,其实高度负相关。两个都放进去,等于重复信息。用相关系数矩阵检查一下,去掉冗余特征。
- 特征提取参数固定:不同缺陷,最优的GLCM距离、LBP半径可能不同。我曾经用固定参数跑了一整批数据,结果效果很差。后来改成多尺度提取,问题就解决了。
• 纹理特征:描述表面“皮肤”,适合划痕、裂纹
• 形状特征:描述几何属性,适合气泡、凹坑
• GLCM:统计像素对关系,纹理分析经典方法
• LBP:局部二值模式,快速、光照鲁棒
• 组合使用,效果优于单一特征