MATLAB 图像处理教程
MATLAB 是进行图像处理、分析和算法开发的强大工具,其 Image Processing Toolbox™ 提供了大量的函数,使得复杂的图像操作变得简单直观。

第一部分:入门基础
什么是图像?在 MATLAB 中如何表示?
在 MATLAB 中,图像本质上是一个矩阵或数据集合。
- 灰度图像: 一个二维矩阵
M x N,矩阵中的每个值代表一个像素的强度,通常在[0, 255]之间(8位无符号整数)。 - 真彩色图像: 一个三维矩阵
M x N x 3,第三个维度代表颜色通道,通常是 红色、绿色 和 蓝色。 - 二值图像: 一个由
0(黑) 和1(白) 组成的逻辑矩阵。
图像的读取、显示和保存
这是图像处理的第一步,也是最基本的三步操作。
函数:
imread: 读取图像文件。imshow: 在新窗口中显示图像。imwrite: 将图像写入文件。
示例代码:

% 1. 读取图像
% 确保 'cameraman.tif' 文件在你的 MATLAB 当前工作目录下
% 如果不在,请提供完整路径,'C:/MyImages/cameraman.tif'
original_img = imread('cameraman.tif');
% 2. 显示图像
figure; % 创建一个新的图形窗口
imshow(original_img);'原始图像'); % 添加标题
% 3. 保存图像
% 将图像保存为 PNG 格式
imwrite(original_img, 'cameraman_copy.png');
disp('图像已保存为 cameraman_copy.png');
代码解释:
figure: 创建一个独立的图像显示窗口,避免覆盖之前的图像。: 为当前图像窗口添加标题,方便识别。imread会根据文件类型自动将图像存储为合适的格式(如uint8)。
第二部分:核心图像处理操作
图像增强
图像增强的目的是改善图像的视觉效果,或将图像转换成更适合人眼或机器分析的形式。
A. 灰度变换
通过改变像素的强度值来调整图像的对比度。
- 调整对比度:
imadjust函数。 - 直方图均衡化: 自动增强图像对比度,使像素值分布更均匀。
histeq函数。
示例代码:

% 读取一张低对比度的图像
low_contrast_img = imread('pout.tif');
% 显示原始图像及其直方图
figure;
subplot(2, 2, 1);
imshow(low_contrast_img);'原始低对比度图像');
subplot(2, 2, 2);
imhist(low_contrast_img);'原始直方图');
% 使用 imadjust 调整对比度
adjusted_img = imadjust(low_contrast_img);
% 显示调整后的图像及其直方图
subplot(2, 2, 3);
imshow(adjusted_img);'imadjust 调整后');
subplot(2, 2, 4);
imhist(adjusted_img);'调整后直方图');
% 使用直方图均衡化
equalized_img = histeq(low_contrast_img);
% 另开一个窗口显示均衡化结果
figure;
imshow(equalized_img);'直方图均衡化后');
B. 去噪
图像在获取和传输过程中常常会受到噪声的干扰。
- 均值滤波: 简单平均,有效去除高斯噪声,但会使图像变模糊。
- 中值滤波: 非常有效,尤其对于“椒盐噪声”(salt-and-pepper noise),且能较好地保持图像边缘。
- 高斯滤波: 使用高斯函数作为加权平均,平滑效果比均值滤波更自然。
示例代码:
% 读取图像并添加椒盐噪声
noisy_img = imread('cameraman.tif');
noisy_img = imnoise(noisy_img, 'salt & pepper', 0.05); % 5% 的噪声
% 显示带噪图像
figure;
subplot(1, 3, 1);
imshow(noisy_img);'带椒盐噪声的图像');
% 使用中值滤波去噪
denoised_median = medfilt2(noisy_img, [3 3]); % 3x3 的滤波窗口
subplot(1, 3, 2);
imshow(denoised_median);'中值滤波后');
% 使用均值滤波去噪
denoised_mean = imgaussfilt(noisy_img, 1); % sigma=1 的高斯滤波
subplot(1, 3, 3);
imshow(denoised_mean);'高斯滤波后');
图像滤波与边缘检测
A. 空间滤波
通过一个卷积核(或称为滤波器)在图像上滑动,对每个像素及其邻域进行运算。
imfilter: 通用滤波函数。fspecial: 创建预定义的滤波器,如高斯滤波器、拉普拉斯滤波器、Sobel/Prewitt 边缘检测算子等。
示例代码:
% 读取图像
img = imread('cameraman.tif');
% 创建一个 5x5 的高斯滤波器
h = fspecial('gaussian', [5 5], 2); % [尺寸 sigma]
% 应用滤波器
filtered_img = imfilter(double(img), h, 'replicate'); % 转换为 double 类型进行滤波
filtered_img = uint8(filtered_img); % 转换回 uint8 显示
% 显示结果
figure;
subplot(1, 2, 1);
imshow(img);'原始图像');
subplot(1, 2, 2);
imshow(filtered_img);'高斯滤波后 (模糊化)');
B. 边缘检测
边缘是图像中亮度发生剧烈变化的区域,是图像的重要特征。
edge: 专门的边缘检测函数,支持多种算子(如 Sobel, Prewitt, Canny, Laplacian of Gaussian (LoG))。
示例代码:
% 读取图像
img = imread('cameraman.tif');
% 使用 Sobel 算子检测边缘
edge_sobel = edge(img, 'sobel');
% 使用 Canny 算子检测边缘 (通常效果更好)
edge_canny = edge(img, 'canny');
% 显示结果
figure;
subplot(1, 3, 1);
imshow(img);'原始图像');
subplot(1, 3, 2);
imshow(edge_sobel);'Sobel 边缘检测');
subplot(1, 3, 3);
imshow(edge_canny);'Canny 边缘检测');
图像变换
A. 几何变换
改变图像的大小、位置或形状。
imresize: 改变图像大小。imrotate: 旋转图像。imcrop: 裁剪图像。
示例代码:
% 读取图像
img = imread('cameraman.tif');
% 调整大小为原来的一半
resized_img = imresize(img, 0.5);
% 旋转 30 度
rotated_img = imrotate(img, 30);
% 显示结果
figure;
subplot(1, 3, 1);
imshow(img);'原始图像');
subplot(1, 3, 2);
imshow(resized_img);'缩小一半');
subplot(1, 3, 3);
imshow(rotated_img);'旋转 30 度');
B. 傅里叶变换
将图像从空间域转换到频率域,便于分析频率成分(如高频对应边缘和噪声,低频对应平滑区域)。
fft2: 二维快速傅里叶变换。ifft2: 二维逆快速傅里叶变换。fftshift: 将零频率分量移到频谱中心。
示例代码:
% 读取图像并转换为灰度
img_rgb = imread('peppers.png');
img_gray = rgb2gray(img_rgb);
% 进行二维傅里叶变换
f = fft2(double(img_gray));
% 将零频率移到中心
fshift = fftshift(f);
% 计算频谱的幅度谱,并对数变换以便显示
magnitude_spectrum = log(1 + abs(fshift));
% 显示结果
figure;
subplot(1, 2, 1);
imshow(img_gray);'原始图像');
subplot(1, 2, 2);
imshow(magnitude_spectrum, []);'对数幅度谱');
第三部分:进阶主题
形态学处理
基于图像形状(或“形态”)的处理,主要用于二值图像,但也适用于灰度图像。
imbinarize: 将灰度图像转换为二值图像。strel: 创建结构元素(形态学操作的基本单元)。imerode: 腐蚀,去除小的白色对象。imdilate: 膨胀,填充对象内部的小孔或连接邻近对象。bwareaopen: 移除二值图像中面积小于指定值的对象。
示例代码:
% 读取图像并转换为二值图像
img = imread('circles.png');
binary_img = imbinarize(img);
% 添加一些噪声
noisy_binary_img = imnoise(binary_img, 'salt & pepper', 0.1);
% 创建一个圆形结构元素
se = strel('disk', 3);
% 使用腐蚀和膨胀去除噪声
cleaned_img = imopen(noisy_binary_img, se); % 先腐蚀后膨胀,即开运算
% 显示结果
figure;
subplot(1, 3, 1);
imshow(binary_img);'原始二值图像');
subplot(1, 3, 2);
imshow(noisy_binary_img);'带噪声的二值图像');
subplot(1, 3, 3);
imshow(cleaned_img);'形态学去噪后');
图像分割
将图像划分为若干个有意义的区域。
regionprops: 测量二值图像中区域的属性(如面积、质心、边界框等)。
示例代码:
% 读取图像并处理
img = imread('rice.png');
gray_img = rgb2gray(img);
% 使用阈值法进行分割
binary_img = imbinarize(gray_img);
% 去除小噪声区域
cleaned_binary_img = bwareaopen(binary_img, 50); % 移除面积小于50像素的区域
% 标记连通区域
labeled_img = bwlabel(cleaned_binary_img);
% 测量每个米粒的属性
stats = regionprops(labeled_img, 'Area', 'Centroid', 'BoundingBox');
% 显示分割结果
figure;
imshow(cleaned_binary_img);'分割后的二值图像');
% 在图像上绘制每个米粒的边界框
hold on; % 保持当前图像,以便在其上绘图
for i = 1:length(stats)
rectangle('Position', stats(i).BoundingBox, 'EdgeColor', 'r', 'LineWidth', 1.5);
end
hold off;
% 显示米粒数量
num_rice = length(stats);
fprintf('检测到的米粒数量: %d\n', num_rice);
第四部分:学习资源与建议
官方文档 (最重要!)
MATLAB 的官方文档是最好的学习资料,它提供了每个函数的详细说明、语法和示例。
- Image Processing Toolbox 文档: https://www.mathworks.com/help/images/
- 直接在 MATLAB 命令行中: 输入
doc function_name(doc imread) 即可打开该函数的文档。
交互式教程
MATLAB 官网提供了大量免费的交互式在线教程,你可以直接在浏览器中运行代码。
- MATLAB Onramp: https://www.mathworks.com/learn/tutorials/matlab-onramp.html (学习 MATLAB 基础)
- Image Processing Onramp: https://www.mathworks.com/learn/tutorials/image-processing-onramp.html (专门针对图像处理的入门教程)
书籍
- 《数字图像处理》(冈萨雷斯著): 图像处理领域的“圣经”,理论非常扎实,可以结合 MATLAB 实现书中的算法。
- 《MATLAB数字图像处理》(张德丰等著): 更侧重于 MATLAB 实现,有很多实例。
实践建议
- 从简单开始: 先掌握
imread,imshow,imwrite,然后逐步学习滤波、增强等基础操作。 - 勤用
disp和whos:disp用于查看变量值,whos用于查看当前工作区变量的详细信息(如大小、数据类型),这对调试非常有帮助。 - 可视化一切: 不要只看代码结果,多使用
imshow,imhist,surf等函数将数据和图像可视化,这能帮助你直观地理解算法效果。 - 阅读源码: 对于感兴趣的工具箱函数,可以尝试阅读其源代码(在 MATLAB 中用
type function_name查看),学习其实现逻辑。 - 尝试复现: 找一些经典的图像处理论文或算法,尝试用 MATLAB 实现它们。
希望这份教程能帮助你顺利入门 MATLAB 图像处理世界!祝你学习愉快!
