
normxcorr2(模板匹配)、extractHOGFeatures(HOG 特征提取)、fitcsvm(SVM 训练)、strel/imopen(形态学处理)、bwlabel(连通区域标记)。读取包含多目标的图像→截取单个目标作为模板→计算归一化互相关系数→定位最匹配目标并标记。
clear, clc, close all;
% 读取原始图像和模板(模板为待检测目标,如单个硬币)
img = imread('Coins.png'); % 包含多枚硬币的原始图像
template = imread('Coin.png'); % 单独截取的硬币模板
% 转换为灰度图(消除颜色干扰,简化计算)
img_gray = rgb2gray(img);
template_gray = rgb2gray(template);
% 可视化原图与模板
figure('Name', '模板与原始图像', 'NumberTitle', 'off');
subplot(1,2,1); imshow(img_gray); title('原始图像');
subplot(1,2,2); imshow(template_gray); title('模板图像');
% 计算归一化互相关系数(相似度矩阵)
corr_map = normxcorr2(template_gray, img_gray);
% 找到相似度最高的位置(相关系数最大值对应的坐标)
[max_corr, max_idx] = max(corr_map(:));
[rows, cols] = ind2sub(size(corr_map), max_idx);
% 计算目标在原始图像中的左上角坐标
t_rows = size(template_gray, 1); % 模板高度
t_cols = size(template_gray, 2); % 模板宽度
top_left_row = rows - t_rows + 1; % 目标左上角行坐标
top_left_col = cols - t_cols + 1; % 目标左上角列坐标
% 标记并显示识别结果
figure('Name', '模板匹配结果', 'NumberTitle', 'off');
imshow(img_gray); hold on;
% 红色矩形框标记匹配目标
rectangle('Position', [top_left_col, top_left_row, t_cols, t_rows], ...
'EdgeColor', 'r', 'LineWidth', 2);
title(['模板匹配结果(最大相关系数:', num2str(max_corr, '%.3f'), ')']);
hold off;
准备汽车 / 自行车两类训练样本→提取 HOG 特征→训练 SVM 分类器→对测试图像进行分类并可视化 HOG 特征。
clear, clc, close all;
% 步骤1:设置数据集路径(根据实际路径修改)
car_dir = 'C:\Users\xinxixueyuan\Desktop\数字图像处理\实验八\Matlab\dataSet\Car';
bike_dir = 'C:\Users\xinxixueyuan\Desktop\数字图像处理\实验八\Matlab\dataSet\Bike';
% 步骤2:读取训练集文件(支持jpg、png格式)
car_files = [dir(fullfile(car_dir, '*.jpg')); dir(fullfile(car_dir, '*.png'))];
bike_files = [dir(fullfile(bike_dir, '*.jpg')); dir(fullfile(bike_dir, '*.png'))];
% 步骤3:提取HOG特征(统一图像尺寸为128x64,HOG特征常用尺寸)
img_size = [128, 64];
features = []; % 存储所有样本特征
labels = []; % 标签:1=汽车,-1=自行车
% 提取汽车样本HOG特征
for i = 1:length(car_files)
try
img_path = fullfile(car_dir, car_files(i).name);
img = imread(img_path);
% 彩色图转灰度图
img_gray = size(img, 3) == 3 ? rgb2gray(img) : img;
% 统一图像尺寸
img_resized = imresize(img_gray, img_size);
% 提取HOG特征
[hog_feat, ~] = extractHOGFeatures(img_resized);
features = [features; hog_feat];
labels = [labels; 1];
fprintf('已处理汽车图像 %d/%d\n', i, length(car_files));
catch ME
fprintf('处理汽车图像 %s 失败:%s\n', car_files(i).name, ME.message);
end
end
% 提取自行车样本HOG特征
for i = 1:length(bike_files)
try
img_path = fullfile(bike_dir, bike_files(i).name);
img = imread(img_path);
img_gray = size(img, 3) == 3 ? rgb2gray(img) : img;
img_resized = imresize(img_gray, img_size);
[hog_feat, ~] = extractHOGFeatures(img_resized);
features = [features; hog_feat];
labels = [labels; -1];
fprintf('已处理自行车图像 %d/%d\n', i, length(bike_files));
catch ME
fprintf('处理自行车图像 %s 失败:%s\n', bike_files(i).name, ME.message);
end
end
% 检查特征提取有效性
if size(features, 1) == 0
error('未提取到有效特征,请检查数据集路径或图像格式');
end
fprintf('\n特征提取完成:共 %d 个样本,每个样本 %d 维特征\n', size(features, 1), size(features, 2));
% 步骤4:训练SVM分类器(线性核函数,标准化特征)
fprintf('开始训练SVM分类器...\n');
svm_model = fitcsvm(features, labels, 'KernelFunction', 'linear', 'Standardize', true);
% 计算训练准确率
train_pred = predict(svm_model, features);
train_accuracy = sum(train_pred == labels) / length(labels);
fprintf('训练准确率:%.2f%%\n', train_accuracy * 100);
% 步骤5:测试分类
test_img_path = 'XiaomiSu7.png'; % 测试图像路径
try
test_img = imread(test_img_path);
test_gray = size(test_img, 3) == 3 ? rgb2gray(test_img) : test_img;
test_resized = imresize(test_gray, img_size);
test_hog = extractHOGFeatures(test_resized); % 提取测试图像HOG特征
% 预测类别
pred = predict(svm_model, test_hog);
% 可视化结果
figure('Name', 'SVM分类结果', 'NumberTitle', 'off');
% 显示测试图像及分类结果
subplot(1,2,1); imshow(test_img);
title(pred == 1 ? '分类结果:汽车' : '分类结果:自行车', ...
'Color', pred == 1 ? 'blue' : 'red', 'FontSize', 14);
% 可视化HOG特征
subplot(1,2,2); imshow(test_resized); hold on;
plot(test_hog, 'LineWidth', 2, 'Color', 'green');
title('HOG特征可视化', 'FontSize', 12); hold off;
% 输出分类详情
fprintf('\n=== 测试分类结果 ===\n');
fprintf('测试图像:%s\n', test_img_path);
fprintf('预测类别:%s\n', pred == 1 ? '汽车' : '自行车');
fprintf('决策函数值:%.4f\n', svm_model.Beta' * test_hog' + svm_model.Bias);
catch ME
fprintf('测试图像处理失败:%s\n', ME.message);
end
读取图像→二值化→通过不同结构元素的开运算→分别提取矩形块和 45° 线段→可视化结果。
% 读取图像
Image = imread('3.png');
% 二值化(OTSU自动计算阈值)
Th = graythresh(Image);
OriginBW = im2bw(Image, Th);
% 图像反转(便于形态学处理)
BW1 = 1 - OriginBW;
% 定义结构元素:正方形(提取矩形块)、45°线段(提取线段)
se_square = strel('square', 3); % 3x3正方形结构元素
se_line45 = strel('line', 25, 45); % 长度25、角度45°的线段结构元素
% 开运算(先腐蚀后膨胀)提取目标形状
BW_rect = 1 - imopen(BW1, se_square); % 提取矩形块
BW_line = 1 - imopen(BW1, se_line45); % 提取45°线段
% 可视化结果
figure('Name', '形态学形状提取', 'NumberTitle', 'off');
subplot(1,3,1); imshow(OriginBW); title('原始二值图像');
subplot(1,3,2); imshow(BW_rect); title('矩形块提取');
subplot(1,3,3); imshow(BW_line); title('线段提取');
% 保存结果
imwrite(OriginBW, 'pattern1.bmp');
imwrite(BW_rect, 'rectang1.bmp');
imwrite(BW_line, 'line1.bmp');
读取米粒图像→形态学开运算降噪→背景去除→二值化→连通区域标记→计数并标注米粒。
clc; clear; close all;
% 步骤1:读取图像并转为灰度图
g = imread('rice.png');
if size(g, 3) == 3
g = rgb2gray(g); % 彩色图转灰度图
end
% 步骤2:形态学开运算(先腐蚀后膨胀),平滑轮廓、去除小噪声
SE = strel('disk', 4); % 圆盘形结构元素(半径4)
I = imopen(g, SE);
% 步骤3:背景去除(提取背景并从原图中减去)
BG = imopen(I, strel('disk', 15)); % 大圆盘提取背景
I2 = imsubtract(I, BG); % 图像减背景,突出米粒目标
% 步骤4:二值化(OTSU最优阈值)
level = graythresh(I2);
bw2 = imbinarize(I2, level);
% 步骤5:连通区域标记(8连通域,标记每个米粒)
[labeled, numObjects] = bwlabel(bw2, 8);
[L, n] = bwlabel(bw2, 8); % n为米粒总数
% 步骤6:可视化处理流程与计数结果
figure('Name', '米粒计数与标注', 'Position', [100, 100, 1200, 800]);
subplot(2,3,1); imshow(g); title('原图');
subplot(2,3,2); imshow(I); title('开运算后');
subplot(2,3,3); imshow(BG); title('背景');
subplot(2,3,4); imshow(I2); title('消除背景');
subplot(2,3,5); imshow(bw2); title('二值化');
% 标注米粒质心与编号
subplot(2,3,6); imshow(bw2); title(['米粒计数:', num2str(n)]);
hold on;
for k = 1:n
[r, c] = find(L == k); % 找到第k个米粒的所有像素坐标
rbar = mean(r); % 质心行坐标
cbar = mean(c); % 质心列坐标
% 白色圆圈标记质心
plot(cbar, rbar, 'Marker', 'o', 'MarkerEdgeColor', 'k', 'MarkerFaceColor', 'w', 'MarkerSize', 8);
% 红色编号标注
text(cbar, rbar, num2str(k), 'Color', 'red', 'FontSize', 12, 'FontWeight', 'bold');
end
hold off;
% 单独显示编号标注结果
figure('Name', '米粒编号标注', 'NumberTitle', 'off');
imshow(bw2); title('米粒编号');
hold on;
for k = 1:n
[r, c] = find(L == k);
rbar = mean(r);
cbar = mean(c);
plot(cbar, rbar, 'Marker', '*', 'MarkerEdgeColor', 'w', 'MarkerSize', 10);
text(cbar, rbar, num2str(k), 'Color', 'blue', 'FontSize', 14);
end
hold off;
% 输出计数结果
fprintf('米粒总数:%d\n', n);
实验任务 | 核心方法 | 关键函数 | 核心优势 | 适用场景 |
|---|---|---|---|---|
目标定位 | 模板匹配(归一化互相关) | normxcorr2、rectangle | 实现简单、定位精准 | 固定形状目标检索、定位 |
二分类 | HOG 特征 + SVM | extractHOGFeatures、fitcsvm | 形状描述能力强、分类高效 | 目标分类(如车辆、行人分类) |
形状提取 | 形态学开运算 | strel、imopen | 针对性提取特定形状 | 几何形状分割(矩形、线段提取) |
目标计数 | 连通区域标记 | bwlabel、find | 计数精准、支持标注 | 颗粒状目标计数(米粒、细胞) |
通过本次实验,系统掌握了图像识别与分类的核心技术,从简单目标定位到复杂分类任务,覆盖了传统图像处理的经典应用场景,为后续深度学习图像识别(如 CNN)奠定了基础。