1. MATLAB图像处理环境搭建

在开始任何图像处理或机器视觉算法开发之前,第一步不是写算法,而是把“工作台”搭好。MATLAB 本身是一个通用数值计算环境,真正让图像处理变得高效的是两个官方工具箱:Image Processing Toolbox(IPT)负责图像的读取、滤波、形态学、几何变换、区域分析等基础处理;Computer Vision Toolbox(CVT)则提供特征检测、相机标定、立体视觉、目标检测与跟踪等更高层的视觉能力。本章的目标是让环境可用、可验证,并用最基础的三个函数完成一次完整的“读—显—存”闭环。

一、确认工具箱是否已安装

安装工具箱有两种常见方式:一是通过 MATLAB 安装器在安装时勾选;二是安装后通过“附加功能管理器(Add-On Explorer)”在线安装。无论哪种方式,安装完成后都应先验证,而不是直接开始写代码。最直接的验证命令是 ver,它会列出当前 MATLAB 已安装的所有工具箱及版本号:

ver
% 在输出中查找以下两行(版本号以实际安装为准):
% Image Processing Toolbox      Version 24.1 (R2024a)
% Computer Vision Toolbox       Version 24.1 (R2024a)

如果只想快速判断某个工具箱是否存在,可以用 license 或 exist 检查函数是否可用。例如 exist('imread','file') 返回 2 表示 imread 是可调用的函数文件;若返回 0,说明 IPT 未安装或路径未加载。更严谨的做法是检查工具箱根目录:

iptRoot = matlabshared.supportpkg.getSupportPackageRoot; % 仅示意
% 更常用的是直接查询工具箱信息
info = ver('images');   % Image Processing Toolbox
disp(info.Name);        % 若为空,说明未安装
infoCV = ver('vision'); % Computer Vision Toolbox
disp(infoCV.Name);

当 ver('images') 和 ver('vision') 都能返回非空名称时,环境基本就绪。若缺失,可在 MATLAB 主界面“主页 → 附加功能 → 获取附加功能”中搜索并安装,安装过程需要登录 MathWorks 账号并保持网络畅通。

二、图像读取:imread 的输入与输出

imread 是图像进入 MATLAB 世界的入口。它的基本调用形式是 I = imread(filename),返回的 I 是一个数值矩阵。理解这个矩阵的维度非常关键:

  • 灰度图:返回 M×N 的二维矩阵,元素类型常见为 uint8(0–255)或 uint16。
  • 彩色图:返回 M×N×3 的三维矩阵,第三维依次为 R、G、B 三个通道。
  • 索引图:返回 M×N 的索引矩阵,同时可用 [X, map] = imread(...) 取出调色板 map。

实际读取时,建议同时获取图像信息,便于后续判断位深和色彩空间:

filename = 'peppers.png';   % MATLAB 自带示例图像
I = imread(filename);
info = imfinfo(filename);
fprintf('尺寸: %d x %d, 通道: %d, 位深: %d, 类型: %s\n', ...
    info.Height, info.Width, size(I,3), info.BitDepth, class(I));

这里 imfinfo 返回的 Height、Width、BitDepth、ColorType 是判断图像属性的可靠依据。注意:size(I,3) 对灰度图返回 1,对彩色图返回 3,不要用固定值 3 去假设所有图像都是彩色。

三、图像显示:imshow 与图像查看器

imshow 与普通 image 函数的最大区别在于:它会自动根据图像数据类型设置显示范围,并保持像素的宽高比。对于 uint8 图像,默认按 0–255 映射;对于 double 图像,默认按 0–1 映射。如果 double 图像的数据范围是 0–255,直接 imshow 会几乎全白,此时应显式指定范围:

imshow(I);
title('原始彩色图像');

% 若 I 为 double 且范围是 0-255,应写:
% imshow(I, []);
% 或 imshow(I/255);

% 查看灰度版本
Igray = rgb2gray(I);
figure;
imshow(Igray);
title('灰度图像');

除了 imshow,MATLAB 还提供 imtool 打开交互式图像查看器,可以查看像素值、测量距离、调整对比度。对于调试阶段,imtool(I) 往往比 imshow 更有用,因为它能直接读出鼠标所在位置的像素坐标和灰度值。

提示:imshow 显示的是“图像”,坐标原点在左上角,x 向右、y 向下;而 plot 的坐标原点在左下角。后续做几何变换、特征点定位时,务必先明确这一坐标系约定,全文保持一致。

四、图像保存:imwrite 与格式选择

imwrite 负责把矩阵写回磁盘。它的基本形式是 imwrite(I, filename),格式由扩展名决定。常见选择如下:

格式特点适用场景
PNG无损压缩,支持透明通道需要保留精确像素值、中间结果
JPG有损压缩,体积小最终展示、网络传输
BMP无压缩,体积大对读取速度要求高的临时文件
TIF支持多页、高位深科学图像、医学图像

保存时要注意数据类型与格式的匹配。例如 uint8 图像可直接保存为 PNG;若图像是 double 且范围在 0–1,保存为 PNG 前应先转换为 uint8,否则会被截断或报错:

% 保存灰度图
imwrite(Igray, 'gray_result.png');

% double 转 uint8 后再保存
Idouble = im2double(I);
Iuint8 = im2uint8(Idouble);
imwrite(Iuint8, 'converted_result.jpg', 'Quality', 90);

其中 'Quality', 90 是 JPG 的可选参数,取值范围 0–100,数值越大质量越高、文件越大。对于需要反复读取处理的中间结果,建议统一使用 PNG,避免有损压缩引入不可逆误差。

五、一次完整的读—显—存实战

下面把上述函数串成一个可执行的最小任务:读取示例图像,转灰度,显示对比,保存结果,并验证保存文件可被重新读取。

% 1. 读取
I = imread('peppers.png');
info = imfinfo('peppers.png');

% 2. 处理:转灰度
Igray = rgb2gray(I);

% 3. 显示:并排对比
figure('Name','读显存实战');
subplot(1,2,1); imshow(I);     title('原始彩色');
subplot(1,2,2); imshow(Igray); title('灰度结果');

% 4. 保存
imwrite(Igray, 'peppers_gray.png');

% 5. 验证:重新读取并检查尺寸
Icheck = imread('peppers_gray.png');
fprintf('原图: %d x %d, 保存后: %d x %d\n', ...
    info.Height, info.Width, size(Icheck,1), size(Icheck,2));
assert(isequal(size(Igray), size(Icheck)), '保存前后尺寸不一致');

这段代码的关键验证点是 assert:它确保保存后再读取的图像尺寸与处理结果一致。如果尺寸不一致,通常说明保存时发生了缩放或格式转换问题。实际运行时,peppers.png 的尺寸为 384×512,灰度结果应为 384×512 的 uint8 矩阵。

图像读—显—存数据流与工具箱分工 Image Processing Toolbox imread / imshow / imwrite / imfinfo / rgb2gray Computer Vision Toolbox 特征检测 / 相机标定 / 目标检测 / 跟踪 磁盘图像文件 peppers.png imread uint8 矩阵 M×N 或 M×N×3 处理与显示 rgb2gray / imshow imtool 交互查看 imwrite 保存结果 验证回路:imread 重新读取保存文件,比对尺寸与类型 关键参数与判断依据 • 数据类型:uint8(0–255) / double(0–1) • 通道数:size(I,3)=1 灰度,=3 彩色 • 保存格式:PNG 无损 / JPG 有损(Quality 0–100) • 验证:assert(isequal(size(A),size(B)))

六、常见问题与排查

环境搭建阶段最容易遇到三类问题。第一类是函数未定义,报错 Undefined function 'imread',这几乎总是因为 IPT 未安装或未授权,用 ver('images') 确认即可。第二类是图像显示全白或全黑,通常是把 double 类型图像直接交给 imshow,而数据范围不是 0–1,解决方法是 imshow(I, []) 或先做 im2double 归一化。第三类是保存后图像失真,多因选择了 JPG 且质量参数过低,或把 double 图像未转换就写入,建议中间结果统一用 PNG。

注意:imshow 与 imagesc 的显示范围策略不同。imagesc 会自动缩放数据到当前色图范围,而 imshow 对 uint8 固定按 0–255 显示。混用两者会导致同一矩阵看起来亮度不同,排查显示问题时先确认用的是哪个函数。

完成本章后,应当能够独立完成:确认两个工具箱已安装、用 imread 读取图像并获取其尺寸与类型、用 imshow 或 imtool 正确显示、用 imwrite 按合适格式保存,并通过重新读取验证结果一致。这套“读—显—存”闭环是后续所有滤波、分割、特征提取与视觉算法实验的基础,务必在进入下一阶段前确保它稳定可复现。