一、实验概述
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');
实验结果与分析
- 转换效果:彩色图→灰度图丢失色彩信息,保留亮度细节;灰度图→二值图仅保留物体轮廓,细节进一步简化;
- 核心差异总结:
- 维度:彩色图为三维矩阵,灰度图和二值图均为二维矩阵;
- 数据类型:彩色图和灰度图为 uint8(0-255),二值图为 logical(0 或 1);
- 信息量:彩色图 > 灰度图 > 二值图,二值图仅适用于轮廓提取等简单场景。
(三)图像基本四则运算
实验任务
读取两张彩色图像,统一尺寸和数据类型后,执行加、减、乘、除四种基本运算,在同一窗口中展示原图及运算结果。
完整代码
% 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 数字图像处理的基础操作,为后续更复杂的图像处理(如滤波、边缘检测、图像分割)奠定了基础。



