《数字图像处理》实验8-图像识别与分类

一、实验核心概述

1. 实验目标

  • 理解图像识别与分类的核心流程(数据准备→特征提取→模型训练→结果验证);
  • 掌握经典识别技术:模板匹配(目标定位)、HOG 特征 + SVM 分类(目标分类)、形态学运算(形状提取与计数);
  • 熟悉 MATLAB 形态学处理、特征提取及分类器训练相关函数,实现从简单目标识别到复杂分类的完整任务。

2. 实验环境

  • 操作系统:Windows 8/10/11
  • 软件版本:MATLAB 2014 及以上版本(部分功能需安装 Computer Vision Toolbox、Statistics and Machine Learning Toolbox)

3. 核心原理与关键函数

  • 模板匹配:基于归一化互相关系数计算模板与图像子区域的相似度,定位最匹配目标;
  • 图像分类:HOG 特征(描述目标形状梯度信息)+ SVM 分类器(线性核函数实现二分类);
  • 形态学运算:通过腐蚀、膨胀、开运算提取图像中特定形状(矩形、线段),结合连通区域标记实现目标计数;
  • 关键函数: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;
实验结果
  • 匹配结果:红色矩形框精准定位到与模板最相似的目标,最大相关系数接近 1(本例为 1.000),表示完全匹配;
  • 适用场景:适用于目标形状固定、背景简单的场景(如零件定位、特定目标检索)。

(二)HOG 特征 + SVM 实现汽车与自行车分类

实验任务

准备汽车 / 自行车两类训练样本→提取 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
实验结果
  • 特征提取:每个样本提取高维 HOG 特征,能有效描述目标形状梯度信息;
  • 分类效果:训练准确率较高(取决于样本数量与质量),测试图像能被正确分类,HOG 特征可视化呈现目标轮廓梯度分布;
  • 核心优势:HOG 特征对目标平移、缩放有一定鲁棒性,SVM 线性核能高效实现二分类。

(三)形态学运算提取矩形块与线段

实验任务

读取图像→二值化→通过不同结构元素的开运算→分别提取矩形块和 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');
实验结果
  • 形态学原理:开运算能平滑目标轮廓,保留与结构元素形状相似的区域,去除其他干扰;
  • 提取效果:正方形结构元素精准提取矩形块,45° 线段结构元素高效提取对应角度线段,目标与背景分离清晰。

(四)形态学处理 + 连通区域标记实现米粒计数

实验任务

读取米粒图像→形态学开运算降噪→背景去除→二值化→连通区域标记→计数并标注米粒。

完整代码
复制代码
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);
实验结果
  • 处理流程:开运算降噪→背景去除→二值化→连通区域标记,逐步分离米粒与背景;
  • 计数效果:能准确标记每个米粒的质心与编号,计数结果精准(本例为 94 颗);
  • 应用场景:适用于颗粒状目标计数(如粮食颗粒、细胞计数)。

三、实验总结与关键知识点

1. 核心技术梳理

实验任务 核心方法 关键函数 核心优势 适用场景
目标定位 模板匹配(归一化互相关) normxcorr2rectangle 实现简单、定位精准 固定形状目标检索、定位
二分类 HOG 特征 + SVM extractHOGFeaturesfitcsvm 形状描述能力强、分类高效 目标分类(如车辆、行人分类)
形状提取 形态学开运算 strelimopen 针对性提取特定形状 几何形状分割(矩形、线段提取)
目标计数 连通区域标记 bwlabelfind 计数精准、支持标注 颗粒状目标计数(米粒、细胞)

2. 关键注意事项

  • 路径设置:模板匹配、分类任务中需确保图像路径正确,避免文件读取失败;
  • 样本质量:SVM 分类效果依赖训练样本数量与多样性,样本过少易过拟合;
  • 结构元素选择:形态学运算中,结构元素的形状、大小需与目标形状匹配(如提取线段用线结构元素);
  • 连通域选择:颗粒计数时,8 连通域比 4 连通域更贴合实际(米粒边缘可能不规整)。

3. 应用场景拓展

  • 模板匹配:工业零件定位、印刷品目标检索、特定标志识别;
  • HOG+SVM:交通场景车辆 / 行人检测、安防监控目标分类;
  • 形态学运算:医学图像分割(如血管、肿瘤轮廓提取)、工业缺陷检测;
  • 连通区域计数:农业产量估算(粮食颗粒计数)、生物医学细胞计数。

通过本次实验,系统掌握了图像识别与分类的核心技术,从简单目标定位到复杂分类任务,覆盖了传统图像处理的经典应用场景,为后续深度学习图像识别(如 CNN)奠定了基础。

相关推荐
AndrewHZ2 小时前
【图像处理基石】图像处理领域还有哪些核心挑战与难题?
图像处理·人工智能·算法·计算机视觉·噪声·图像增强·画质增强
极客范儿2 小时前
从快手“12·22”事故出发:AI时代,如何构建对抗自动化攻击的动态免疫体系?
网络·人工智能·自动化
科技快报2 小时前
联想现场演示天禧AI 3.5多模态交互,YOGA Pro 16 Aura AI元启版提供坚实算力支撑
人工智能·microsoft
week_泽2 小时前
opencv特征检测、关键点、角点检测、特征点检测
人工智能·opencv·计算机视觉
月明长歌2 小时前
【码道初阶】Leetcode138:随机链表的复制:用 HashMap 做深拷贝的标准解法
java·数据结构·算法·leetcode·链表·哈希算法
Dev7z2 小时前
基于MATLAB的HSV颜色特征杂草图像识别系统设计与实现
人工智能
Ydwlcloud2 小时前
AWS国际版新账号注册隐藏优惠全解析:2026年实测避坑指南
大数据·服务器·人工智能·云计算·aws
————A2 小时前
从 RAG 走不通开始:设备运维场景下的一次诊断系统重构思考
大数据·数据库·人工智能
Coder个人博客2 小时前
Apollo VehicleState 车辆状态模块接口调用流程图与源码分析
人工智能·自动驾驶·apollo