《数字图像处理》-实验1

一、实验概述

1. 实验目标

  • 熟悉 MATLAB 基本运行环境与核心操作界面;
  • 掌握 MATLAB 中图像读取、显示、保存及格式转换的核心函数用法;
  • 学会使用 MATLAB 实现图像灰度处理、二值化处理及图像间四则运算;
  • 掌握图像处理过程与结果的可视化展示及文件保存方法。

2. 实验环境

  • 操作系统:Windows 8/10/11
  • 软件版本:MATLAB 2014 及以上版本

3. 核心原理

数字图像在 MATLAB 中以矩阵形式存储,所有图像处理操作本质上都是对矩阵数值的运算。本次实验主要运用 MATLAB 图像处理工具箱中的核心函数,包括图像读写函数(imread、imwrite)、格式转换函数(rgb2gray、im2bw)、图像运算函数(imadd、imsubtract 等)及可视化函数(figure、imshow、subplot),实现对彩色图、灰度图、二值图的处理与分析。

二、实验内容与完整代码实现

(一)彩色图转灰度图及矩阵特性对比

实验任务

读取彩色图像,转换为灰度图,截取指定区域,对比两者的矩阵维度、数据类型及数据内容差异,并可视化展示结果。

完整代码
复制代码
% 1. 读取彩色图像
image_path = 'ALi.jpg'; 
% A: 一个 m x n x 3 的三维矩阵,m是高度,n是宽度,3代表RGB三个颜色通道
A = imread(image_path);

% 2. 将彩色图像转换为灰度图像
% I_gray: 一个 m x n 的二维矩阵,每个元素代表一个像素的灰度值(0-255)
I_gray = rgb2gray(A);

% 3. 截取对应图像矩阵
% 定义要截取的区域
row_start = 100;
row_end   = 300;
col_start = 200;
col_end   = 400;

% 截取彩色图像的对应区域
A_crop = A(row_start:row_end, col_start:col_end, :);

% 截取灰度图像的对应区域
I_gray_crop = I_gray(row_start:row_end, col_start:col_end);

% 4. 比较异同并显示结果
% --- 显示原始图像和处理后的图像 ---
figure('Name', '图像显示与比较', 'NumberTitle', 'off');

% 子图1:显示原始彩色图像
subplot(2, 2, 1);
imshow(A);
title('1. 原始彩色图像');
axis on;

% 子图2:显示转换后的灰度图像
subplot(2, 2, 2);
imshow(I_gray);
title('2. 转换后的灰度图像');
axis on;

% --- 在命令行窗口打印矩阵信息进行比较 ---
fprintf('\n--- 矩阵信息比较 ---\n');

% 显示原始彩色图像矩阵 A 的信息
fprintf('1. 原始彩色图像矩阵 A:\n');
fprintf('   - 维度 (size): %s\n', mat2str(size(A)));
fprintf('   - 数据类型 (class): %s\n', class(A));
fprintf('   - 数据范围: [%d, %d]\n', min(A(:)), max(A(:)));

% 显示灰度图像矩阵 I_gray 的信息
fprintf('\n2. 灰度图像矩阵 I_gray:\n');
fprintf('   - 维度 (size): %s\n', mat2str(size(I_gray)));
fprintf('   - 数据类型 (class): %s\n', class(I_gray));
fprintf('   - 数据范围: [%d, %d]\n', min(I_gray(:)), max(I_gray(:)));

% --- 总结比较异同 ---
fprintf('\n--- 异同总结 ---\n');
fprintf('1. 维度不同:彩色图是三维矩阵 [高度, 宽度, 3],灰度图是二维矩阵 [高度, 宽度]。\n');
fprintf('2. 数据类型相同:通常都是 uint8 (8位无符号整数)。\n');
fprintf('3. 数据内容不同:彩色图每个像素点有三个值 (R, G, B),灰度图每个像素点只有一个亮度值。\n');
fprintf('4. 截取操作:截取的是相同空间位置的区域,但结果矩阵的维度依然保持各自的特性(彩色图截取后仍是三维,灰度图仍是二维)。\n');
实验结果与分析
  • 可视化结果:原始彩色图像与灰度图像在同一窗口中显示,彩色图保留丰富色彩信息,灰度图仅呈现亮度变化;

  • 矩阵特性对比:

    图像类型 维度 数据类型 数据内容
    彩色图 m×n×3 uint8 每个像素含 R、G、B 三个通道值(0-255)
    灰度图 m×n uint8 每个像素含一个亮度值(0-255)

(二)彩色图→灰度图→二值图转换及矩阵差异分析

实验任务

读取彩色图像,依次转换为灰度图和二值图,分析三种图像的矩阵维度、数据类型及数据范围差异,并可视化展示转换过程。

完整代码
复制代码
% 1. 读取彩色图像
image_path = 'ALi2.jpg'; 
% A: 一个 m x n x 3 的三维矩阵,代表RGB彩色图像
A = imread(image_path);

% 2. 将彩色图像转换为灰度图像
% 使用 rgb2gray 函数,通过加权公式将RGB三个通道的亮度值合并为灰度值
I_gray = rgb2gray(A);

% 3. 将灰度图像转换为二值图像
% im2bw 函数根据阈值将灰度图转换为仅含0(黑)和1(白)的二值图
threshold_value = 0.5; % 阈值范围是 [0, 1]
I_bw = im2bw(I_gray, threshold_value);

% 4. 显示图像结果
figure('Name', '彩色图 -> 灰度图 -> 二值图', 'NumberTitle', 'off', 'Position', [100, 100, 900, 300]);

% 子图1:显示原始彩色图像
subplot(1, 3, 1); 
imshow(A);
title('1. 原始彩色图像 (RGB)');
axis on; 

% 子图2:显示转换后的灰度图像
subplot(1, 3, 2); 
imshow(I_gray);
title('2. 转换后的灰度图像 (Grayscale)');
axis on;

% 子图3:显示转换后的二值图像
subplot(1, 3, 3); 
imshow(I_bw);
title('3. 转换后的二值图像 (Binary)');
axis on;

% 5. 观察并比较对应图像矩阵的差异
fprintf('\n--- 图像矩阵信息比较 ---\n');

% 显示彩色图像矩阵 A 的信息
fprintf('1. 彩色图像矩阵 A:\n');
fprintf('   - 维度 (size): %s\n', mat2str(size(A)));
fprintf('   - 数据类型 (class): %s\n', class(A));
fprintf('   - 数据范围: [%d, %d]\n', min(A(:)), max(A(:)));
fprintf('   - 描述: 三维矩阵,第三维分别代表红(R)、绿(G)、蓝(B)三个颜色通道。\n');

% 显示灰度图像矩阵 I_gray 的信息
fprintf('\n2. 灰度图像矩阵 I_gray:\n');
fprintf('   - 维度 (size): %s\n', mat2str(size(I_gray)));
fprintf('   - 数据类型 (class): %s\n', class(I_gray));
fprintf('   - 数据范围: [%d, %d]\n', min(I_gray(:)), max(I_gray(:)));
fprintf('   - 描述: 二维矩阵,每个元素代表一个像素的亮度,值越大越亮。\n');

% 显示二值图像矩阵 I_bw 的信息
fprintf('\n3. 二值图像矩阵 I_bw:\n');
fprintf('   - 维度 (size): %s\n', mat2str(size(I_bw)));
fprintf('   - 数据类型 (class): %s\n', class(I_bw));
fprintf('   - 数据范围: [%d, %d]\n', min(I_bw(:)), max(I_bw(:)));
fprintf('   - 描述: 二维逻辑(logical)矩阵,只包含 0 (黑) 和 1 (白) 两个值。\n');

fprintf('\n--- 总结差异 ---\n');
fprintf('1. 维度变化: 彩色图(3D) -> 灰度图(2D) -> 二值图(2D)。\n');
fprintf('2. 数据类型变化: 通常是 uint8 -> uint8 -> logical。\n');
fprintf('3. 数据内容变化: 从三种颜色信息,到单一亮度信息,最后简化为只有两种状态(黑或白)。\n');
fprintf('4. 视觉信息: 信息量依次减少,图像细节也依次丢失。二值图只保留了物体的轮廓和形状信息。\n');
实验结果与分析
  • 转换效果:彩色图→灰度图丢失色彩信息,保留亮度细节;灰度图→二值图仅保留物体轮廓,细节进一步简化;
  • 核心差异总结:
    1. 维度:彩色图为三维矩阵,灰度图和二值图均为二维矩阵;
    2. 数据类型:彩色图和灰度图为 uint8(0-255),二值图为 logical(0 或 1);
    3. 信息量:彩色图 > 灰度图 > 二值图,二值图仅适用于轮廓提取等简单场景。

(三)图像基本四则运算

实验任务

读取两张彩色图像,统一尺寸和数据类型后,执行加、减、乘、除四种基本运算,在同一窗口中展示原图及运算结果。

完整代码
复制代码
% 1. 读取两张彩色图像
imgA = imread('aali2.jpg');  
imgB = imread('ALi4.jpg');  

% 2. 统一数据类型为uint8
imgA = im2uint8(imgA);
imgB = im2uint8(imgB);

% 3. 尺寸归一化:确保两张图像大小完全一致
if ~isequal(size(imgA), size(imgB))
    imgB = imresize(imgB, [size(imgA,1), size(imgA,2)]);  % 按imgA尺寸调整imgB
end

% 4. 再次确认数据类型一致(imresize可能改变类型)
imgA = im2uint8(imgA);
imgB = im2uint8(imgB);

% 5. 执行四种基本算术运算
imgAdd = imadd(imgA, imgB);       % 图像加法(亮度叠加)
imgSub = imsubtract(imgA, imgB);  % 图像减法(亮度相减)
imgMul = immultiply(imgA, imgB);  % 图像乘法(对比度增强)
imgDiv = imdivide(imgA, imgB + 1e-6);  % 图像除法(避免除零错误)

% 6. 在同一窗口显示所有图像
figure('Color','w');  % 新建白色背景窗口
subplot(2,3,1); imshow(imgA); title('原始图像A');
subplot(2,3,2); imshow(imgB); title('原始图像B');
subplot(2,3,3); imshow(imgAdd); title('加法结果');
subplot(2,3,4); imshow(imgSub); title('减法结果');
subplot(2,3,5); imshow(imgMul); title('乘法结果');
subplot(2,3,6); imshow(imgDiv); title('除法结果');
实验结果与分析
  • 运算效果说明:
    • 加法:图像整体亮度提升,色彩更鲜艳;
    • 减法:突出两张图像的亮度差异,可用于运动目标检测;
    • 乘法:增强图像对比度,暗处更暗、亮处更亮;
    • 除法:减弱图像亮度差异,可用于光照均衡化;
  • 注意事项:图像运算需满足 "同尺寸、同数据类型",除法需避免除零错误(本实验添加 1e-6 偏移量)。

(四)灰度值调整与结果保存

实验任务

读取彩色图像并转换为灰度图,将灰度值全局提升(提升幅度为学号尾号,本实验为 87),可视化展示原图、灰度图及调整后图像,并将调整结果保存至自定义文件夹。

完整代码
复制代码
% 1. 读取彩色图像
imgA = imread('aali2.jpg');  

% 2. 转换为灰度图
imgGray = rgb2gray(imgA);

% 3. 定义灰度提升幅度(学号尾号:87)
student_id_tail = 87;  

% 4. 灰度全局提升(使用imadd函数,超过255的值自动截断)
imgGrayEnhanced = imadd(imgGray, student_id_tail);

% 5. 在同一窗口显示所有图像
figure('Color','w', 'Position', [100, 100, 1200, 400]);  % 设置窗口位置和大小
subplot(1,3,1); 
imshow(imgA); 
title('原图');

subplot(1,3,2); 
imshow(imgGray); 
title('灰度图');

subplot(1,3,3); 
imshow(imgGrayEnhanced); 
title(['灰度改变结果 (+', num2str(student_id_tail), ')']);

% 6. 创建自定义文件夹并保存灰度改变结果
% 定义文件夹路径(根据实际情况修改)
customFolder = 'C:\Users\王炳\Desktop\实验一\Matlab代码\结果截图';

% 若文件夹不存在则创建
if ~exist(customFolder, 'dir')
    mkdir(customFolder);
end

% 构建保存文件的完整路径
savePath = fullfile(customFolder, 'gray_enhanced_image.jpg');

% 保存图像
imwrite(imgGrayEnhanced, savePath, 'jpg');
fprintf('图像已保存至: %s\n', savePath);
实验结果与分析
  • 调整效果:灰度值提升后,图像整体亮度明显增加,暗部细节更清晰;
  • 保存说明:使用 imwrite 函数将结果保存为 JPG 格式,通过 fullfile 函数构建跨平台文件路径,确保代码兼容性;
  • 关键函数:imadd 自动处理溢出(超过 255 的像素值截断为 255),无需手动干预。

三、实验总结

1. 核心函数梳理

函数用途 关键函数 功能说明
图像读写 imread、imwrite 读取图像文件、保存图像结果
格式转换 rgb2gray、im2bw 彩色图转灰度图、灰度图转二值图
图像运算 imadd、imsubtract、immultiply、imdivide 图像加、减、乘、除运算
可视化 figure、imshow、subplot 创建窗口、显示图像、分割子窗口
辅助功能 size、class、min/max、imresize 获取矩阵尺寸、数据类型、极值、调整图像尺寸

2. 实验关键知识点

  • 图像在 MATLAB 中的存储本质:彩色图(三维矩阵)、灰度图(二维矩阵)、二值图(二维逻辑矩阵);
  • 图像运算的前提:同尺寸、同数据类型,避免运算溢出和除零错误;
  • 结果可视化技巧:使用 subplot 在同一窗口展示多幅图像,通过 title 和 axis on 增强可读性;
  • 文件保存注意事项:确保保存路径存在,使用 fullfile 函数构建标准文件路径。

3. 问题与解决方法

  • 问题 1:图像读取失败→解决方案:检查文件路径是否正确(相对路径需将图像放在当前工作目录,绝对路径需完整填写);
  • 问题 2:图像运算报错→解决方案:使用 isequal (size (imgA), size (imgB)) 检查尺寸,用 im2uint8 统一数据类型;
  • 问题 3:保存路径不存在→解决方案:使用 exist 函数判断文件夹是否存在,不存在则用 mkdir 创建。

通过本次实验,系统掌握了 MATLAB 数字图像处理的基础操作,为后续更复杂的图像处理(如滤波、边缘检测、图像分割)奠定了基础。

相关推荐
*星星之火*2 小时前
【大白话 AI 答疑】第10篇 数学可视化网站汇总
人工智能
糖炒狗子2 小时前
Textin模型加速器+火山引擎打造商业计划书智能体
人工智能·火山引擎
谅望者2 小时前
数据分析笔记15:Python模块、包与异常处理
开发语言·人工智能·python
小徐Chao努力2 小时前
【Langchain4j-Java AI开发】05-对话记忆管理
android·java·人工智能
lbb 小魔仙2 小时前
FP8魔力解锁:SD3.5 图像编辑、修复与增强全栈实战
人工智能·python·ai
一招定胜负2 小时前
计算机视觉入门:opencv基本操作
人工智能·opencv·计算机视觉
董厂长2 小时前
温度设为 0 仍然不完全确定:LLM 推理非确定性从哪来、怎么测、如何缓解
人工智能·llm·agent
wenzhangli72 小时前
深度解析Ooder架构:A2UI时代全栈设计的四大核心思考
大数据·人工智能