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光片分类
- 工业检测:产品缺陷检测
- 遥感图像:地物分类
- 生物识别:人脸、指纹识别
浙公网安备 33010602011771号