小波纹理特征提取 MATLAB 程序

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


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

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

为什么用小波做纹理?


二、小波分解结构(3 层为例)

LL3
LH3  HL3
HH3

纹理信息主要集中在 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. 旋转不变特征


八、与 GLCM / LBP 的对比

方法 优点 缺点
GLCM 统计意义明确 计算慢、对尺度敏感
LBP 旋转不变、快 对噪声敏感
小波纹理 多尺度、方向性强 需选小波基

工程经验


九、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);

 

专注于matlab/simulink,电子电路,编程