一、实验核心概述
1. 实验目标
- 理解图像特征提取的核心意义(提取区分性关键信息,支撑后续识别、分类任务);
- 掌握多维度特征提取方法:颜色空间通道、边缘、角点、SIFT 特征、纹理特征;
- 熟悉 MATLAB 相关工具函数的使用,对比不同特征提取算法的效果与适用场景。
2. 实验环境
- 操作系统:Windows 8/10/11
- 软件版本:MATLAB 2014 及以上版本(部分功能需安装 Computer Vision Toolbox)
3. 核心原理与关键函数
- 特征分类:颜色特征(RGB/HSV 通道)、边缘特征(基于灰度突变)、角点特征(局部灰度变化剧烈的点)、SIFT 特征(尺度不变特征)、纹理特征(基于灰度共生矩阵 GLCM);
- 关键函数:
rgb2hsv(颜色空间转换)、edge(边缘提取)、corner/detectHarrisFeatures(角点检测)、detectSIFTFeatures(SIFT 特征提取)、graycomatrix/graycoprops(灰度共生矩阵与纹理特征计算)。
二、完整实验内容与代码实现
(一)颜色空间通道提取
实验任务
读取彩色图像→提取 RGB 三通道→转换至 HSV 空间并提取 H、S、V 三通道→可视化所有通道。
完整代码
% 读取彩色图像
img = imread('1.png');
% 提取RGB颜色空间三通道
R = img(:,:,1); % 红色通道
G = img(:,:,2); % 绿色通道
B = img(:,:,3); % 蓝色通道
% 转换至HSV颜色空间并提取通道
hsv_img = rgb2hsv(img);
H = hsv_img(:,:,1); % 色调通道(0-1,代表颜色种类)
S = hsv_img(:,:,2); % 饱和度通道(0-1,代表颜色鲜艳程度)
V = hsv_img(:,:,3); % 明度通道(0-1,代表亮度)
% 可视化所有结果(3x3布局,居中显示原图)
figure('Name','图像通道提取结果', 'Position', [100, 100, 1200, 800]);
subplot(3,3,2); imshow(img); title('原始彩色图像', 'FontSize', 12);
subplot(3,3,4); imshow(R); title('R通道', 'FontSize', 12);
subplot(3,3,5); imshow(G); title('G通道', 'FontSize', 12);
subplot(3,3,6); imshow(B); title('B通道', 'FontSize', 12);
subplot(3,3,7); imshow(H); title('H通道', 'FontSize', 12);
subplot(3,3,8); imshow(S); title('S通道', 'FontSize', 12);
subplot(3,3,9); imshow(V); title('V通道', 'FontSize', 12);

实验结果
- RGB 通道:每个通道仅保留对应颜色信息,单通道呈灰度显示(亮度对应颜色强度);
- HSV 通道:H 通道反映颜色种类,S 通道反映颜色鲜艳度(值越高越鲜艳),V 通道反映亮度(与灰度图类似)。
(二)边缘特征提取(多算子对比)
实验任务
读取彩色图像→转换为灰度图→使用 Prewitt、Canny、LOG 算子提取边缘→对比边缘效果。
完整代码
% 读取彩色图像并转换为灰度图
img = imread('CSGO.jpg');
gray_img = rgb2gray(img);
% 三种算子提取边缘(edge函数直接调用)
edge_prewitt = edge(gray_img, 'prewitt'); % Prewitt算子(3x3模板,抑制噪声)
edge_canny = edge(gray_img, 'canny'); % Canny算子(多步骤,边缘连续平滑)
edge_log = edge(gray_img, 'log'); % LOG算子(高斯滤波+拉普拉斯,检测细边缘)
% 可视化结果
figure('Name','边缘特征提取结果', 'Position', [100, 100, 1000, 600]);
subplot(2,2,1); imshow(gray_img); title('原始灰度图', 'FontSize', 12);
subplot(2,2,2); imshow(edge_prewitt); title('Prewitt算子边缘', 'FontSize', 12);
subplot(2,2,3); imshow(edge_canny); title('Canny算子边缘', 'FontSize', 12);
subplot(2,2,4); imshow(edge_log); title('LOG算子边缘', 'FontSize', 12);

实验结果
- 算子特性:
- Prewitt 算子:边缘较粗,抗噪性一般,对水平 / 垂直边缘敏感;
- Canny 算子:边缘连续、无断裂,抗噪性最强(综合效果最优);
- LOG 算子:边缘细腻,能检测细边缘,但对噪声较敏感。
(三)角点特征提取(Harris 角点检测)
实验任务
读取彩色图像→转换为灰度图→使用corner和detectHarrisFeatures两种方法提取角点→对比不同阈值下的检测效果。
完整代码
% 读取图像并转换为灰度图
I = imread('阿狸2.jpg');
gray_img = rgb2gray(I);
% 可视化窗口设置
figure('Position', [100, 100, 1800, 900], 'Name', 'Harris角点检测对比');
% 子图1:原始灰度图
subplot(1,3,1); imshow(gray_img); title('原始灰度图', 'FontSize', 14);
% 子图2:基础corner函数检测(QualityLevel=0.01)
subplot(1,3,2); imshow(gray_img); hold on;
% 检测角点并过滤近距离重复点
corners1 = corner(gray_img, 'QualityLevel', 0.01);
min_dist = 5; % 最小角点间距
if ~isempty(corners1)
[~, idx] = sort(sum(corners1.^2, 2), 'descend');
corners1 = corners1(idx, :);
keep = true(size(corners1, 1), 1);
for i = 1:size(corners1, 1)
if keep(i)
dists = sqrt(sum((corners1(i,:) - corners1(i+1:end,:)).^2, 2));
keep(i+1:end) = keep(i+1:end) & (dists > min_dist);
end
end
corners1 = corners1(keep, :);
end
% 绘制角点(绿色)
plot(corners1(:, 1), corners1(:, 2), 'go', 'MarkerSize', 6, 'LineWidth', 1.5);
title(['基础corner函数检测 (', num2str(size(corners1, 1)), '个角点)'], 'FontSize', 12);
hold off;
% 子图3:detectHarrisFeatures函数检测(MinQuality=0.01)
subplot(1,3,3); imshow(gray_img); hold on;
points = detectHarrisFeatures(gray_img, 'MinQuality', 0.01);
corners2 = points.Location;
% 绘制角点(红色)
plot(corners2(:, 1), corners2(:, 2), 'ro', 'MarkerSize', 6, 'LineWidth', 1.5);
title(['detectHarrisFeatures检测 (', num2str(size(corners2, 1)), '个角点)'], 'FontSize', 12);
hold off;
% 输出统计信息
sgtitle('Harris角点检测方法对比', 'FontSize', 14, 'FontWeight', 'bold');
fprintf('基础corner函数检测角点数量:%d\n', size(corners1, 1));
fprintf('detectHarrisFeatures检测角点数量:%d\n', size(corners2, 1));

实验结果
- 检测差异:
detectHarrisFeatures检测到的角点更多(本例 1075 个),corner函数经去重后角点更少(本例 168 个); - 角点分布:主要集中在图像边缘、纹理丰富或灰度突变的区域;
- 阈值影响:QualityLevel/MinQuality 值越小,检测到的角点越多,灵敏度越高。
(四)SIFT 特征点提取
实验任务
读取彩色图像→转换为灰度图→使用detectSIFTFeatures提取特征点→选择前 10 个最强特征点可视化。
完整代码
clear, clc, close all;
% 读取彩色图像
I = imread('阿狸.jpg');
% 转换为灰度图
gray_img = rgb2gray(I);
% 检测SIFT特征点(尺度不变特征,抗旋转、缩放)
points = detectSIFTFeatures(gray_img);
% 选择前10个最强特征点(按强度排序)
strongestPoints = points.selectStrongest(10);
% 可视化结果
figure('Position', [100, 100, 1000, 400], 'Name', 'SIFT特征点检测');
subplot(1, 2, 1); imshow(I); title('原始彩色图像', 'FontSize', 12);
subplot(1, 2, 2); imshow(gray_img); hold on;
plot(strongestPoints, 'ShowScale', false); % 绘制特征点
title(sprintf('SIFT特征点检测\n前10个最强特征点'), 'FontSize', 12);
hold off;
% 输出特征点信息
fprintf('检测到 %d 个SIFT特征点\n', points.Count);
fprintf('显示了前10个最强的特征点\n');

实验结果
- SIFT 特征点:具有尺度不变性和旋转不变性,最强特征点集中在图像纹理最丰富、灰度变化最剧烈的区域;
- 应用场景:适用于图像匹配、目标识别(如物体追踪、图像拼接)。
(五)纹理特征提取(基于灰度共生矩阵 GLCM)
实验任务
读取彩色图像→转换为灰度图→选择多个 ROI 区域→计算不同方向(0°、45°、90°、135°)的 GLCM→提取对比度、相关性、能量、同质性 4 种纹理特征→对比区域差异。
完整代码
% 交互式选择图像文件
[fname, pname] = uigetfile({ ...
'*.jpg;*.jpeg;*.png;*.bmp;*.tif;*.tiff', ...
'图像文件 (*.jpg, *.jpeg, *.png, *.bmp, *.tif, *.tiff)'; ...
'*.*', '所有文件 (*.*)'}, ...
'请选择要分析的图像文件');
% 处理文件选择(取消则使用默认图像)
if isequal(fname, 0) || isequal(pname, 0)
fprintf('用户取消了文件选择,使用默认示例图像...\n');
I = imread('peppers.png');
else
imagePath = fullfile(pname, fname);
fprintf('读取图像: %s\n', imagePath);
I = imread(imagePath);
end
% 转换为灰度图
if size(I, 3) == 3
gray_img = rgb2gray(I);
else
gray_img = I;
end
% 可视化原图与灰度图
figure('Position', [100, 100, 1000, 400]);
subplot(1,2,1); imshow(I); title('原始彩色图像', 'FontSize', 12);
subplot(1,2,2); imshow(gray_img); title('灰度图像', 'FontSize', 12);
% 定义3个感兴趣区域(ROI)
[height, width] = size(gray_img);
if height > 300 && width > 300
roi_size = 100;
roi1 = gray_img(50:50+roi_size-1, 50:50+roi_size-1); % 左上角
roi2 = gray_img(round(height/2)-50:round(height/2)+49, round(width/2)-50:round(width/2)+49); % 中心
roi3 = gray_img(height-roi_size-49:height-50, width-roi_size-49:width-50); % 右下角
else
roi_size = min(floor(height/4), floor(width/4));
roi1 = gray_img(10:10+roi_size-1, 10:10+roi_size-1);
roi2 = gray_img(round(height/2)-round(roi_size/2):round(height/2)+round(roi_size/2)-1, ...
round(width/2)-round(roi_size/2):round(width/2)+round(roi_size/2)-1);
roi3 = gray_img(height-roi_size-9:height-10, width-roi_size-9:width-10);
end
% 可视化ROI区域
figure('Position', [100, 200, 1200, 400]);
subplot(1,3,1); imshow(roi1); title(sprintf('ROI1 - 左上角区域\n(%d x %d)', size(roi1,2), size(roi1,1)), 'FontSize', 10);
subplot(1,3,2); imshow(roi2); title(sprintf('ROI2 - 中心区域\n(%d x %d)', size(roi2,2), size(roi2,1)), 'FontSize', 10);
subplot(1,3,3); imshow(roi3); title(sprintf('ROI3 - 右下角区域\n(%d x %d)', size(roi3,2), size(roi3,1)), 'FontSize', 10);
% 定义GLCM计算参数(方向:0°、45°、90°、135°,距离d=1)
offsets = [0 1; -1 1; -1 0; -1 -1];
directions = {'0°', '45°', '90°', '135°'};
rois = {roi1, roi2, roi3};
roi_names = {'ROI1', 'ROI2', 'ROI3'};
% 初始化特征存储
features = struct();
% 计算每个ROI在不同方向的纹理特征
for roi_idx = 1:length(rois)
fprintf('\n=== %s 纹理特征分析 ===\n', roi_names{roi_idx});
for dir_idx = 1:size(offsets, 1)
% 计算灰度共生矩阵
glcm = graycomatrix(rois{roi_idx}, 'Offset', offsets(dir_idx, :), 'NumLevels', 32, 'Symmetric', true);
% 提取4种核心纹理特征
stats = graycoprops(glcm, {'Contrast', 'Correlation', 'Energy', 'Homogeneity'});
% 存储特征
features(roi_idx, dir_idx).contrast = stats.Contrast;
features(roi_idx, dir_idx).correlation = stats.Correlation;
features(roi_idx, dir_idx).energy = stats.Energy;
features(roi_idx, dir_idx).homogeneity = stats.Homogeneity;
% 输出特征值
fprintf('方向 %s:\n', directions{dir_idx});
fprintf(' 对比度: %.4f\n 相关性: %.4f\n 能量: %.4f\n 同质性: %.4f\n', ...
stats.Contrast, stats.Correlation, stats.Energy, stats.Homogeneity);
end
end
% 可视化特征对比
figure('Position', [100, 300, 1400, 800], 'Name', '纹理特征对比');
feature_fields = {'contrast', 'correlation', 'energy', 'homogeneity'};
feature_titles = {'对比度 (Contrast)', '相关性 (Correlation)', '能量 (Energy)', '同质性 (Homogeneity)'};
for feat_idx = 1:length(feature_fields)
subplot(2, 2, feat_idx);
% 提取特征数据
feat_data = zeros(length(rois), length(directions));
for roi_idx = 1:length(rois)
for dir_idx = 1:length(directions)
feat_data(roi_idx, dir_idx) = features(roi_idx, dir_idx).(feature_fields{feat_idx});
end
end
% 绘制柱状图
bar(feat_data');
xlabel('方向'); ylabel('特征值'); title(feature_titles{feat_idx}, 'FontSize', 12);
legend(roi_names, 'Location', 'best');
set(gca, 'XTickLabel', directions); grid on;
end
sgtitle('不同区域和方向的纹理特征比较', 'FontSize', 14, 'FontWeight', 'bold');




实验结果
- 纹理特征含义:
- 对比度:反映像素灰度差异(值越大,纹理越粗糙);
- 相关性:反映相邻像素灰度相关性(值越接近 1,纹理越规则);
- 能量:反映纹理均匀性(值越大,纹理越均匀);
- 同质性:反映纹理平滑度(值越大,纹理越平滑);
- 区域差异:不同 ROI 的纹理特征差异明显(如中心区域纹理丰富,对比度高;边缘区域纹理简单,能量高)。
三、实验总结与关键知识点
1. 核心技术梳理
| 特征类型 | 提取方法 | 关键函数 | 核心优势 | 适用场景 |
|---|---|---|---|---|
| 颜色特征 | RGB/HSV 通道提取 | rgb2hsv |
简单直观,计算量小 | 颜色分类、图像检索 |
| 边缘特征 | Prewitt/Canny/LOG 算子 | edge |
快速提取轮廓 | 目标边缘检测、缺陷识别 |
| 角点特征 | Harris 角点检测 | corner、detectHarrisFeatures |
对旋转 / 缩放有一定鲁棒性 | 图像匹配、目标跟踪 |
| SIFT 特征 | 尺度不变特征提取 | detectSIFTFeatures |
抗旋转、缩放、光照变化 | 图像拼接、目标识别 |
| 纹理特征 | 灰度共生矩阵(GLCM) | graycomatrix、graycoprops |
描述纹理粗糙度、规则性 | 纹理分类、材质识别 |
2. 关键注意事项
- 工具包依赖:
detectHarrisFeatures、detectSIFTFeatures需安装 Computer Vision Toolbox; - 参数调节:角点检测的 QualityLevel、纹理特征的 ROI 大小,会直接影响提取结果;
- 数据预处理:边缘、角点、纹理特征提取前,建议对图像去噪(如高斯滤波),提升特征准确性;
- 特征选择:根据任务需求选择特征(如颜色区分选 RGB/HSV,尺度不变场景选 SIFT)。
3. 应用场景拓展
- 图像检索:结合颜色特征 + 纹理特征,实现相似图像查找;
- 目标识别:SIFT 特征 + 角点特征,实现复杂场景下的目标匹配;
- 纹理分类:GLCM 纹理特征,实现布料、木材等材质分类;
- 边缘检测:Canny 算子,实现医学图像边缘提取、工业零件缺陷检测。
通过本次实验,系统掌握了五大类图像特征的提取方法,理解了不同特征的核心优势与适用场景,为后续计算机视觉高级应用(如图像分类、目标检测)奠定了基础。