小波纹理特征提取 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)
function featureVec = wavelet_texture_feature(I, waveletName, level)
if nargin < 2, waveletName = 'db4'; end
if nargin < 3, level = 3; end
% 转为灰度
if size(I,3)==3
I = rgb2gray(I);
end
I = im2double(I);
% ===== 1. 小波分解 =====
[C, S] = wavedec2(I, level, waveletName);
featureVec = [];
% ===== 2. 逐层提取细节子带特征 =====
for l = 1:level
% 提取 LH, HL, HH
[H, V, D] = detcoef2('all', C, S, l);
% 对每个子带计算特征
featureVec = [featureVec; ...
subband_features(H); ...
subband_features(V); ...
subband_features(D)];
end
end
%% --------------------------------------------------
%% 子带特征计算函数
function feat = subband_features(subband)
% 防止空矩阵
if isempty(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.m
clear; 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 on
subplot(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.m
I = imread('texture1.png');
if size(I,3)==3, I = rgb2gray(I); end
I = 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',[100 100 800 600])
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)
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);