3. 特征提取方法:纹理特征、形状特征、灰度共生矩阵、LBP算子

特征提取,说白了就是把图像里的“缺陷信号”翻译成计算机能理解的数字语言。我做了这么多年缺陷检测,最深的体会就是:特征选对了,模型就成功了一半。选错了,再好的分类器也白搭。

这一章,我们重点聊四种最常用的特征提取方法。它们各有各的脾气,也各有各的用武之地。

3.1 纹理特征:缺陷的“皮肤”密码

纹理是什么?就是材料表面的“皮肤”。光滑的、粗糙的、有规律的、杂乱的——这些都属于纹理信息。很多缺陷,比如划痕、裂纹、腐蚀坑,都会改变局部纹理。

我个人习惯把纹理特征分成两类:

  • 统计纹理:基于像素灰度值的分布规律,比如均值、方差、熵
  • 结构纹理:基于纹理基元的排列规则,比如周期性、方向性

举个例子。我在检测金属拉丝表面时发现,正常区域的纹理方向很一致,一旦出现划痕,纹理方向就乱了。这时候用方向性特征,一抓一个准。

实用技巧: 纹理特征对光照变化比较敏感。建议在采集图像时保持光源稳定,或者先做光照归一化。

3.2 形状特征:缺陷的“骨架”信息

形状特征描述的是缺陷的几何属性。比如:

  • 面积:缺陷像素总数
  • 周长:缺陷边界长度
  • 圆形度:4π×面积/周长²,越接近1越像圆
  • 长宽比:最小外接矩形的长宽比
  • 凸包面积比:缺陷面积/凸包面积

我记得有一次做PCB焊点检测。气泡缺陷和正常焊点,纹理上差别不大,但形状上——气泡是圆的,正常焊点是不规则的。用圆形度特征,一下就分开了。

形状特征 适用场景 典型缺陷
面积 区分大小缺陷 大裂纹 vs 小气孔
圆形度 区分规则/不规则 气泡 vs 划痕
长宽比 区分线状/块状 裂纹 vs 凹坑
凸包面积比 区分简单/复杂形状 规则孔洞 vs 不规则腐蚀
注意: 形状特征依赖分割结果。如果分割不准,形状特征就是“垃圾进,垃圾出”。我曾经吃过这个亏,后来养成了先验证分割质量再提取形状特征的习惯。

3.3 灰度共生矩阵(GLCM):纹理的“统计词典”

灰度共生矩阵,英文叫GLCM,是纹理分析里最经典的方法之一。它的核心思想很简单:统计图像中两个像素在某个方向和距离上同时出现的概率。

GLCM本身不是特征,而是个矩阵。我们需要从矩阵里再提取统计量,常用的有:

  • 对比度:反映纹理的清晰度和沟纹深浅
  • 相关性:反映纹理的方向性
  • 能量:反映纹理的均匀性和粗细
  • 同质性:反映纹理的局部变化程度

我建议你记住一个经验:对比度+能量这对组合,能解决大部分纹理缺陷问题。对比度抓变化,能量抓均匀度,互补性很好。

GLCM参数设置要点:
• 距离d:一般取1或2,太大容易丢失细节
• 方向θ:通常取0°、45°、90°、135°四个方向,然后取均值
• 灰度级:一般压缩到16或32级,太多计算量大,太少信息丢失

3.4 LBP算子:纹理的“局部指纹”

LBP,全称Local Binary Pattern,局部二值模式。它是我个人非常喜欢的一种纹理特征。为什么?因为它简单、快速、对光照变化不敏感。

LBP的原理很直观:

  1. 取一个中心像素,和它周围的邻居像素比较
  2. 邻居比中心大,记1;比中心小,记0
  3. 把这些0和1按顺序排成一串二进制数
  4. 转成十进制,就是这个像素的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特征向量。

进阶技巧: 实际项目中我常用的是“均匀模式LBP”(Uniform LBP)。它把二进制串中0/1跳变次数≤2的模式保留,其他归为一类。这样特征维度从256降到59,计算更快,效果反而更好。

3.5 四种方法对比与选择

说了这么多,到底该用哪个?我整理了一张对比表,你一看就明白:

方法 核心思想 优点 缺点 典型应用
纹理特征 统计像素分布 计算简单,直观 对光照敏感 表面粗糙度检测
形状特征 描述几何属性 物理意义明确 依赖分割质量 焊点、气泡检测
GLCM 统计像素对关系 纹理描述能力强 计算量大 织物、木材纹理分析
LBP 局部二值模式 光照鲁棒,速度快 对噪声敏感 实时在线检测

我的建议是:先用LBP快速验证可行性,再用GLCM做精细分析。如果缺陷有明显的几何特征,别忘了加上形状特征。纹理特征作为补充,锦上添花。

3.6 特征提取流程总览

下面这张图,是我自己总结的特征提取流程。每次做项目,我都会先走一遍这个流程,确保不遗漏关键步骤。

特征提取流程总览 输入图像 预处理(去噪/增强/归一化) 缺陷区域分割 纹理特征 形状特征 GLCM LBP算子 特征融合与降维 实际项目中,通常组合2-3种特征,避免维度爆炸

嗯,这里要注意:特征不是越多越好。我见过有人一口气提取了50多个特征,结果模型反而过拟合了。我的经验是,先选5-8个最有区分力的特征,效果不够再加。

3.7 实战避坑指南

最后,分享几个我踩过的坑:

  • 特征尺度不一致:面积可能是几千,圆形度是0.几。不归一化的话,大数值特征会主导模型。我建议用Z-score或Min-Max归一化。
  • 忽略特征相关性:GLCM的对比度和能量,其实高度负相关。两个都放进去,等于重复信息。用相关系数矩阵检查一下,去掉冗余特征。
  • 特征提取参数固定:不同缺陷,最优的GLCM距离、LBP半径可能不同。我曾经用固定参数跑了一整批数据,结果效果很差。后来改成多尺度提取,问题就解决了。
本章核心要点:
• 纹理特征:描述表面“皮肤”,适合划痕、裂纹
• 形状特征:描述几何属性,适合气泡、凹坑
• GLCM:统计像素对关系,纹理分析经典方法
• LBP:局部二值模式,快速、光照鲁棒
• 组合使用,效果优于单一特征