《数字图像处理》实验7-图像特征提取

一、实验核心概述

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 角点检测)

实验任务

读取彩色图像→转换为灰度图→使用cornerdetectHarrisFeatures两种方法提取角点→对比不同阈值下的检测效果。

完整代码
复制代码
% 读取图像并转换为灰度图
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 角点检测 cornerdetectHarrisFeatures 对旋转 / 缩放有一定鲁棒性 图像匹配、目标跟踪
SIFT 特征 尺度不变特征提取 detectSIFTFeatures 抗旋转、缩放、光照变化 图像拼接、目标识别
纹理特征 灰度共生矩阵(GLCM) graycomatrixgraycoprops 描述纹理粗糙度、规则性 纹理分类、材质识别

2. 关键注意事项

  • 工具包依赖:detectHarrisFeaturesdetectSIFTFeatures需安装 Computer Vision Toolbox;
  • 参数调节:角点检测的 QualityLevel、纹理特征的 ROI 大小,会直接影响提取结果;
  • 数据预处理:边缘、角点、纹理特征提取前,建议对图像去噪(如高斯滤波),提升特征准确性;
  • 特征选择:根据任务需求选择特征(如颜色区分选 RGB/HSV,尺度不变场景选 SIFT)。

3. 应用场景拓展

  • 图像检索:结合颜色特征 + 纹理特征,实现相似图像查找;
  • 目标识别:SIFT 特征 + 角点特征,实现复杂场景下的目标匹配;
  • 纹理分类:GLCM 纹理特征,实现布料、木材等材质分类;
  • 边缘检测:Canny 算子,实现医学图像边缘提取、工业零件缺陷检测。

通过本次实验,系统掌握了五大类图像特征的提取方法,理解了不同特征的核心优势与适用场景,为后续计算机视觉高级应用(如图像分类、目标检测)奠定了基础。

相关推荐
Elastic 中国社区官方博客2 小时前
Elasticsearch:2025年的企业搜索 - 是否需要进行抓取?
大数据·数据库·人工智能·elasticsearch·搜索引擎·ai·全文检索
澜莲花2 小时前
python图色之opencv基础
开发语言·图像处理·python·opencv
程序员学习Chat2 小时前
计算机视觉Transformer-1 基础结构
人工智能·计算机视觉·transformer
HyperAI超神经2 小时前
【vLLM 学习】Profiling
人工智能·深度学习·学习·cpu·gpu·编程语言·vllm
龙智DevSecOps解决方案2 小时前
研讨会回顾|Atlassian Cloud + Rovo AI 实战指南:Jira + Confluence + Bitbucket集成演示、龙智云迁移服务
人工智能·atlassian·devops·jira·rovo
可触的未来,发芽的智生2 小时前
新奇特:象棋与麻将,解析生成大模型的两种哲学
javascript·人工智能·python·程序人生·自然语言处理
星源~2 小时前
TensorFlow 开发环境搭建指南:Anaconda 与 Miniconda 抉择及环境搭建步骤
人工智能·python·tensorflow·嵌入式·mcu+ai
DisonTangor2 小时前
Mac Studio配备1.5 TB显存——基于雷电5的远程直接内存访问技术
人工智能·macos·开源·aigc
李子琪。2 小时前
基于大语言模型的设计创新方法研究
人工智能·经验分享