小波纹理特征提取 MATLAB 程序

📅 2026/7/8 6:35:13 👁️ 阅读次数 📝 编程学习
小波纹理特征提取 MATLAB 程序

小波纹理特征提取 MATLAB 程序。这套方法源自 Chang & Kuo (1993) 的“Texture Analysis with Tree-structured Wavelet Transform”,是 Brodatz 纹理分类、遥感影像、医学图像 中最常用的小波特征方案之一。


一、小波纹理特征的核心思想

  1. 对图像做多尺度小波分解(DWT)
  2. 在每个子带(LH, HL, HH)上提取统计量
  3. 将这些统计量拼接成特征向量

为什么用小波做纹理?

  • 空间局部性(比 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);