杰瑞科技汇

MATLAB图像处理教程如何入门?

MATLAB 图像处理教程

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

MATLAB图像处理教程如何入门?-图1
(图片来源网络,侵删)

第一部分:入门基础

什么是图像?在 MATLAB 中如何表示?

在 MATLAB 中,图像本质上是一个矩阵或数据集合。

  • 灰度图像: 一个二维矩阵 M x N,矩阵中的每个值代表一个像素的强度,通常在 [0, 255] 之间(8位无符号整数)。
  • 真彩色图像: 一个三维矩阵 M x N x 3,第三个维度代表颜色通道,通常是 红色绿色蓝色
  • 二值图像: 一个由 0 (黑) 和 1 (白) 组成的逻辑矩阵。

图像的读取、显示和保存

这是图像处理的第一步,也是最基本的三步操作。

函数:

  • imread: 读取图像文件。
  • imshow: 在新窗口中显示图像。
  • imwrite: 将图像写入文件。

示例代码:

MATLAB图像处理教程如何入门?-图2
(图片来源网络,侵删)
% 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 函数。

示例代码:

MATLAB图像处理教程如何入门?-图3
(图片来源网络,侵删)
% 读取一张低对比度的图像
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 的官方文档是最好的学习资料,它提供了每个函数的详细说明、语法和示例。

交互式教程

MATLAB 官网提供了大量免费的交互式在线教程,你可以直接在浏览器中运行代码。

书籍

  • 《数字图像处理》(冈萨雷斯著): 图像处理领域的“圣经”,理论非常扎实,可以结合 MATLAB 实现书中的算法。
  • 《MATLAB数字图像处理》(张德丰等著): 更侧重于 MATLAB 实现,有很多实例。

实践建议

  1. 从简单开始: 先掌握 imread, imshow, imwrite,然后逐步学习滤波、增强等基础操作。
  2. 勤用 dispwhos: disp 用于查看变量值,whos 用于查看当前工作区变量的详细信息(如大小、数据类型),这对调试非常有帮助。
  3. 可视化一切: 不要只看代码结果,多使用 imshow, imhist, surf 等函数将数据和图像可视化,这能帮助你直观地理解算法效果。
  4. 阅读源码: 对于感兴趣的工具箱函数,可以尝试阅读其源代码(在 MATLAB 中用 type function_name 查看),学习其实现逻辑。
  5. 尝试复现: 找一些经典的图像处理论文或算法,尝试用 MATLAB 实现它们。

希望这份教程能帮助你顺利入门 MATLAB 图像处理世界!祝你学习愉快!

分享:
扫描分享到社交APP
上一篇
下一篇