小波纹理特征提取 MATLAB 程序。这套方法源自 Chang & Kuo (1993) 的“Texture Analysis with Tree-structured Wavelet Transform”,是 Brodatz 纹理分类、遥感影像、医学图像 中最常用的小波特征方案之一。
一、小波纹理特征的核心思想
- 对图像做多尺度小波分解(DWT)
- 在每个子带(LH, HL, HH)上提取统计量
- 将这些统计量拼接成特征向量
为什么用小波做纹理?
- 空间局部性(比 Fourier 好)
- 多分辨率(捕捉粗细纹理)
- 方向选择性(水平 / 垂直 / 对角)
二、小波分解结构(3 层为例)
LL3 LH3 HL3 HH3- LL:低频(近似)
- LH:水平边缘(垂直纹理)
- HL:垂直边缘(水平纹理)
- HH:对角边缘(点状/角状纹理)
纹理信息主要集中在 LH / HL / HH 子带
三、纹理特征定义(最常用 8 维)
对每个子带(LH, HL, HH),计算:
| 特征 | 含义 |
|---|---|
| 均值(Mean) | 能量水平 |
| 标准差(Std) | 对比度 |
| 能量(Energy) | 均匀性 |
| 熵(Entropy) | 复杂性 |
共3 子带 × 4 特征 = 12 维(论文常用 8~24 维)
四、MATLAB 实现(自包含)
主程序:wavelet_texture_feature.m
%% wavelet_texture_feature.m% 基于小波变换的纹理特征提取% 输入: 灰度图像 I% 输出: featureVec (N×1)functionfeatureVec=wavelet_texture_feature(I,waveletName,level)ifnargin<2,waveletName='db4';endifnargin<3,level=3;end% 转为灰度ifsize(I,3)==3I=rgb2gray(I);endI=im2double(I);% ===== 1. 小波分解 =====[C,S]=wavedec2(I,level,waveletName);featureVec=[];% ===== 2. 逐层提取细节子带特征 =====forl=1:level% 提取 LH, HL, HH[H,V,D]=detcoef2('all',C,S,l);% 对每个子带计算特征featureVec=[featureVec;...subband_features(H);...subband_features(V);...subband_features(D)];endend%% --------------------------------------------------%% 子带特征计算函数functionfeat=subband_features(subband)% 防止空矩阵ifisempty(subband)feat=zeros(4,1);return;end% 1. 均值mu=mean(subband(:));% 2. 标准差sigma=std(subband(:));% 3. 能量energy=sum(subband(:).^2);% 4. 熵p=abs(subband(:));p=p/(sum(p)+eps);% 归一化entropy=-sum(p.*log2(p+eps));feat=[mu;sigma;energy;entropy];end五、使用示例(纹理分类 / Brodatz)
%% demo_wavelet_texture.mclear;clc;close all;% 读取纹理图像(Brodatz / 自建)I1=imread('texture1.png');% 如 D16 (wood)I2=imread('texture2.png');% 如 D17 (water)% 提取特征f1=wavelet_texture_feature(I1,'db4',3);f2=wavelet_texture_feature(I2,'db4',3);fprintf('特征维度: %d\n',length(f1));% 可视化特征figure('Color','white')subplot(1,2,1)bar(f1);title('Texture 1 Features');xlabel('Feature Index');grid onsubplot(1,2,2)bar(f2);title('Texture 2 Features');xlabel('Feature Index');grid on%% 相似度比较(欧氏距离)dist=norm(f1-f2);fprintf('纹理特征欧氏距离: %.4f\n',dist);六、特征可视化(小波子带)
%% visualize_wavelet_decomp.mI=imread('texture1.png');ifsize(I,3)==3,I=rgb2gray(I);endI=im2double(I);[C,S]=wavedec2(I,3,'db4');% 重构各子带A3=wrcoef2('a',C,S,'db4',3);H3=wrcoef2('h',C,S,'db4',3);V3=wrcoef2('v',C,S,'db4',3);D3=wrcoef2('d',C,S,'db4',3);figure('Color','white','Position',[100100800600])subplot(2,2,1),imshow(A3),title('LL3 (Approximation)')subplot(2,2,2),imshow(H3),title('LH3 (Horizontal)')subplot(2,2,3),imshow(V3),title('HL3 (Vertical)')subplot(2,2,4),imshow(D3),title('HH3 (Diagonal)')参考代码 基于小波的纹理特征提取代码www.youwenfan.com/contentcsw/82760.html
七、特征增强方案
1. 多尺度能量比(MSE)
Eratio=ELH(l)ELL(l)E_{ratio} = \frac{E_{LH}^{(l)}}{E_{LL}^{(l)}}Eratio=ELL(l)ELH(l)
2. 小波包特征(更精细)
wp=wpdec(I,3,'db4');E=wenergy(wp);3. 旋转不变特征
- 对 LH/HL/HH 取能量 + 熵的平均
- 或做复数小波(DT-CWT)
八、与 GLCM / LBP 的对比
| 方法 | 优点 | 缺点 |
|---|---|---|
| GLCM | 统计意义明确 | 计算慢、对尺度敏感 |
| LBP | 旋转不变、快 | 对噪声敏感 |
| 小波纹理 | 多尺度、方向性强 | 需选小波基 |
工程经验:
- 医学影像 →小波 + GLCM
- 工业缺陷 →小波 + LBP
- 遥感分类 →小波包 + SVM
九、SVM / KNN 分类接口
%% 训练分类器features=[f1';f2'];labels=[1;2];model=fitcecoc(features,labels);% SVM% 预测新样本f_test=wavelet_texture_feature(testImg,'db4',3)';pred=predict(model,f_test);