MATLAB用于提取图像的HOG和GLCM特征,并使用SVM进行分类

技术路线概览

从原始图像到分类结果的完整流程:

flowchart LR A[“原始图像数据集”] --> B[“预处理<br>(统一尺寸/灰度化)”] B --> C[“特征提取”] C --> D[HOG特征提取<br>“捕捉形状和轮廓信息”] C --> E[GLCM特征提取<br>“捕捉纹理统计信息”] D --> F[“特征融合<br>(连接HOG与GLCM特征向量)”] E --> F F --> G[“数据集划分<br>(训练集/测试集)”] G --> H[“SVM模型训练”] H --> I[“模型评估与预测”]

MATLAB实现代码

%% 图像分类:HOG+GLCM特征与SVM分类器
clear; clc; close all;

%% 1. 参数设置
imageSize = [128, 128];      % 统一图像尺寸
hogCellSize = [8, 8];        % HOG单元格大小
hogNumBins = 9;              % HOG方向bin数量
glcmOffset = [0 1; -1 1; -1 0; -1 -1]; % GLCM偏移量(4个方向)
numClasses = 5;              % 类别数量(根据你的数据修改)
trainRatio = 0.7;            % 训练集比例

%% 2. 准备数据集
% 假设你的图像按类别存储在子文件夹中,如'dataset/class1/', 'dataset/class2/'
datasetPath = 'your_dataset_path/'; % 修改为你的数据集路径
categories = {'cat', 'dog', 'car', 'flower', 'plane'}; % 示例类别名称

% 读取图像文件列表
imageFiles = [];
imageLabels = [];
for i = 1:numClasses
    classFolder = fullfile(datasetPath, categories{i});
    files = dir(fullfile(classFolder, '*.jpg')); % 支持.jpg, .png等
    imageFiles = [imageFiles; files];
    imageLabels = [imageLabels; repmat(i, length(files), 1)];
end

%% 3. 特征提取
fprintf('开始提取特征...\n');
numImages = length(imageFiles);
hogFeatures = [];
glcmFeatures = [];

for i = 1:numImages
    % 读取并预处理图像
    imgPath = fullfile(imageFiles(i).folder, imageFiles(i).name);
    img = imread(imgPath);
    
    % 转换为灰度图
    if size(img, 3) == 3
        imgGray = rgb2gray(img);
    else
        imgGray = img;
    end
    
    % 调整尺寸
    imgResized = imresize(imgGray, imageSize);
    
    % 3.1 提取HOG特征
    [hogFeature, hogVisualization] = extractHOGFeatures(imgResized, ...
        'CellSize', hogCellSize, 'NumBins', hogNumBins);
    hogFeatures(i, :) = hogFeature;
    
    % 3.2 提取GLCM特征
    glcm = graycomatrix(imgResized, 'Offset', glcmOffset, 'Symmetric', true);
    
    % 从GLCM计算统计特征
    stats = graycoprops(glcm, {'Contrast', 'Correlation', 'Energy', 'Homogeneity'});
    
    % 计算4个方向的平均值作为特征
    glcmFeature = [
        mean(stats.Contrast), 
        mean(stats.Correlation), 
        mean(stats.Energy), 
        mean(stats.Homogeneity)
    ];
    glcmFeatures(i, :) = glcmFeature;
    
    % 显示进度
    if mod(i, 50) == 0
        fprintf('已处理 %d/%d 张图像\n', i, numImages);
    end
end

%% 4. 特征融合与数据集划分
% 融合HOG和GLCM特征
allFeatures = [hogFeatures, glcmFeatures];
labels = categorical(imageLabels, 1:numClasses, categories);

% 划分训练集和测试集
cv = cvpartition(labels, 'HoldOut', 1 - trainRatio);
trainIdx = training(cv);
testIdx = test(cv);

trainFeatures = allFeatures(trainIdx, :);
trainLabels = labels(trainIdx);
testFeatures = allFeatures(testIdx, :);
testLabels = labels(testIdx);

fprintf('特征提取完成!\n');
fprintf('特征维度: HOG(%d) + GLCM(%d) = %d\n', ...
    size(hogFeatures, 2), size(glcmFeatures, 2), size(allFeatures, 2));
fprintf('训练集: %d 样本, 测试集: %d 样本\n', ...
    sum(trainIdx), sum(testIdx));

%% 5. 训练SVM分类器
fprintf('开始训练SVM分类器...\n');

% 使用一对一的多分类SVM
t = templateSVM('KernelFunction', 'linear', 'Standardize', true);
svmModel = fitcecoc(trainFeatures, trainLabels, 'Learners', t, ...
    'Coding', 'onevsone', 'Verbose', 0);

fprintf('SVM训练完成!\n');

%% 6. 测试与评估
% 预测
[predictions, scores] = predict(svmModel, testFeatures);

% 计算准确率
accuracy = sum(predictions == testLabels) / length(testLabels);
fprintf('测试集准确率: %.2f%%\n', accuracy * 100);

% 混淆矩阵
figure('Position', [100, 100, 800, 600]);
cm = confusionmat(testLabels, predictions);
confusionchart(cm, categories);
title(sprintf('混淆矩阵 (准确率: %.2f%%)', accuracy * 100));

% 计算各类别精确率、召回率和F1分数
for i = 1:numClasses
    TP = cm(i, i);
    FP = sum(cm(:, i)) - TP;
    FN = sum(cm(i, :)) - TP;
    
    precision = TP / (TP + FP + eps);
    recall = TP / (TP + FN + eps);
    f1Score = 2 * precision * recall / (precision + recall + eps);
    
    fprintf('%s - 精确率: %.2f%%, 召回率: %.2f%%, F1分数: %.2f%%\n', ...
        categories{i}, precision*100, recall*100, f1Score*100);
end

%% 7. 可视化特征(PCA降维)
figure('Position', [100, 100, 1200, 500]);

% 对特征进行PCA降维
[coeff, score] = pca(allFeatures);
pc1 = score(:, 1);
pc2 = score(:, 2);

% 可视化训练集和测试集
subplot(1, 2, 1);
gscatter(pc1(trainIdx), pc2(trainIdx), trainLabels);
title('训练集特征分布 (PCA降维)');
xlabel('第一主成分'); ylabel('第二主成分');
grid on;

subplot(1, 2, 2);
gscatter(pc1(testIdx), pc2(testIdx), testLabels);
title('测试集特征分布 (PCA降维)');
xlabel('第一主成分'); ylabel('第二主成分');
grid on;

%% 8. 保存模型和特征(可选)
% save('image_classification_model.mat', 'svmModel', 'categories', ...
%      'hogCellSize', 'hogNumBins', 'imageSize');
% fprintf('模型已保存到 image_classification_model.mat\n');

参考代码 对图片提取HOG、GLCM特征,利用SVM进行分类 www.3dddown.com/cnb/60101.html

代码关键点解释与参数调整

1. HOG特征参数

  • hogCellSize:单元格大小,值越小捕捉的细节越多,但特征维度越高
  • hogNumBins:方向bins数量,通常9-18之间

2. GLCM特征参数

  • glcmOffset:定义了计算共生矩阵的方向
  • 提取的4个统计量:
    • 对比度(Contrast):测量局部灰度变化
    • 相关性(Correlation):测量灰度线性依赖性
    • 能量(Energy):测量均匀性
    • 同质性(Homogeneity):测量局部均匀性

3. SVM分类器参数

  • KernelFunction:核函数,'linear'(线性)适合高维特征,'rbf'(高斯)适合复杂决策边界
  • Standardize:标准化特征,强烈建议设为true

应用扩展

这个框架可以轻松扩展到各种应用:

  • 医学图像分析:病理切片、X光片分类
  • 工业检测:产品缺陷检测
  • 遥感图像:地物分类
  • 生物识别:人脸、指纹识别
posted @ 2026-02-03 16:00  yu8yu7  阅读(0)  评论(0)    收藏  举报