简介这份资源是面向Matlab初学者与图像处理入门者的基础实例文档围绕图像读取显示、预处理、边缘检测、区域选择与掩膜、滤波变换、FFT与DCT、Radon投影等常见操作展开帮助读者快速建立Matlab图像处理的实操框架。压缩包内共1个pdf文件大小约5.94MB内容以代码示例与函数讲解为主涵盖imread、imshow、rgb2gray、edge、imcrop、roipoly、roifilt2、fft2、dct2、radon等常用函数的调用方式与参数说明便于对照练习。已有2004人学习适合课程实验、自学入门与课堂演示参考。文档将零散函数串联为可运行的示例流程读者可据此理解图像处理的基本步骤与结果验证方法并在此基础上扩展自己的实验脚本。1. 零基础也能上手的 MATLAB 图像处理从一张图片开始很多人第一次听到“图像处理”四个字脑子里浮现的是电影里那种把模糊监控画面一键变清晰的魔法。结果打开软件一看满屏函数名和矩阵瞬间就怂了。其实换个角度想图像在 MATLAB 眼里就是一堆数字排成的表格每个格子代表一个像素的亮度或颜色。所谓图像处理就是拿这些数字做加减乘除、筛选排序再把结果画出来。这份《matlab图像处理基础实例.pdf》就是带你从“读一张图、看一眼”开始一步步摸到边缘检测、滤波、傅里叶变换这些听起来唬人的操作。它适合完全没碰过图像处理、但想用 MATLAB 快速跑出结果的新手不需要你先把数学啃透跟着敲几行就能看到图变了。2. 先搞懂图像在 MATLAB 里长什么样读图、看图、查信息2.1 一张图就是一个矩阵别被“三维”吓到打开 MATLAB第一件事不是背函数而是建立直觉你读进来的图片在变量区里就是一个矩阵。灰度图是二维矩阵每个元素是 0 到 255 之间的亮度值彩色图是三维矩阵第三维分别存红、绿、蓝三个通道。你可以把它想成三张半透明的彩色纸叠在一起每张纸都是一个二维表格。这个直觉一旦建立后面所有操作你都能翻译成“对表格里的数字做了什么”。先跑通第一个例子把一张图读进来、显示出来、看看它的尺寸和类型% 读取一张示例图片MATLAB 自带图片不用自己找文件 f imread(onion.png); % 显示图片 imshow(f); % 查看图片尺寸行数、列数、通道数 size(f) % 查看图片信息位深、颜色类型、文件大小等 info imfinfo(onion.png)imread负责把图片文件变成矩阵imshow负责把矩阵画成图。size(f)返回三个数比如[135 198 3]意思是高 135 像素、宽 198 像素、3 个颜色通道。imfinfo不读像素只读文件头信息适合快速确认图片格式和位深。第一次跑的时候如果图片显示不出来先检查当前文件夹里有没有这张图——MATLAB 自带图库在安装目录下直接写文件名通常能读到读不到就换成你电脑里任意一张.jpg或.png的完整路径。2.2 彩色转灰度为什么几乎所有操作都从这一步开始你翻这份实例会发现大量例子第一行都是rgb2gray。原因很实在灰度图只有一个通道矩阵是二维的处理起来简单、快、不容易出错。彩色图三个通道各算一遍再合并新手很容易在维度上翻车。所以入门阶段建议养成习惯先转灰度把核心逻辑跑通再考虑彩色。a imread(onion.png); i rgb2gray(a); % 彩色转灰度 subplot(121); imshow(a); title(原彩色图); subplot(122); imshow(i); title(灰度图);subplot(121)的意思是“把画布分成 1 行 2 列当前在第 1 个位置画”。subplot(122)切到第 2 个位置。这样两张图并排对比一眼就能看出灰度图丢掉了颜色、只保留明暗。rgb2gray内部按人眼对红绿蓝的敏感度加权平均不是简单取三个通道的平均值所以转出来的灰度更接近你肉眼感受到的亮度。2.3 裁剪、缩放、旋转三个最常用的“改图”动作读图之后最常干的事就是截一块、放大缩小、转个角度。这三个操作对应imcrop、imresize、imrotate参数都不复杂但有几个细节新手容易忽略。a imread(onion.png); % 裁剪矩形参数是 [xmin ymin width height] b imcrop(a, [75 68 130 112]); % 缩放按比例放大 2 倍 c imresize(a, 2); % 旋转逆时针转 45 度bilinear 是插值方法crop 表示保持原图尺寸 d imrotate(a, 45, bilinear, crop); subplot(221); imshow(a); title(原图); subplot(222); imshow(b); title(裁剪); subplot(223); imshow(c); title(放大 2 倍); subplot(224); imshow(d); title(旋转 45 度);imcrop的矩形参数顺序是[左上角 x, 左上角 y, 宽度, 高度]不是[x1 y1 x2 y2]这一点和很多绘图软件的习惯不同第一次用很容易把宽高写成右下角坐标。imresize第二个参数给一个数就是按比例缩放给[行数 列数]就是强制到指定尺寸。imrotate不加crop时画布会变大以容纳旋转后的完整图像加了crop则保持原尺寸、裁掉转出去的部分。插值方法入门先用bilinear就够它比最近邻平滑又比双三次快。3. 让图像“说话”边缘检测、区域选择与滤波3.1 边缘检测找出画面里“变化最猛”的地方边缘检测的原理一句话能说清像素亮度突然剧烈变化的地方就是边缘。edge函数封装了多种算子新手先用canny它抗噪好、边缘细适合大多数场景。注意edge要求输入是灰度图彩色图直接扔进去会报错或结果诡异。f imread(lbxx.bmp); a rgb2gray(f); % 先转灰度 [g, t] edge(a, canny); % g 是二值边缘图t 是自动算出的阈值 subplot(121); imshow(a); title(灰度图); subplot(122); imshow(g); title(Canny 边缘);edge返回两个值第一个是只含 0 和 1 的二值图白色代表边缘第二个是算法自动确定的阈值你可以手动调这个阈值来控制边缘多少——阈值调低边缘变多但噪点也多调高边缘变少但可能漏掉弱边。想换算子就把canny改成prewitt或sobel对比一下效果差异这是理解不同算子特性最直观的方式。3.2 区域选择只处理你想处理的那一块整张图处理有时候没必要你只想改某个多边形区域。roipoly让你用坐标圈出一块区域并生成掩膜roifilt2则只对掩膜内的像素做滤波。这套组合在“局部修图”场景里非常实用。a imread(onion.png); i rgb2gray(a); % 用列坐标 c 和行坐标 r 定义一个多边形 c [200 250 278 248 199 172]; r [21 21 75 121 121 75]; b roipoly(i, c, r); % b 是二值掩膜多边形内为 1 % 只对掩膜区域做锐化滤波 h fspecial(unsharp); j roifilt2(h, i, b); subplot(121); imshow(i); title(灰度原图); subplot(122); imshow(j); title(仅多边形区域锐化);roipoly的c和r分别是多边形顶点的列坐标和行坐标两个向量长度必须一致按顺序连起来就是多边形边界。fspecial(unsharp)生成一个锐化滤波器roifilt2把它只作用在掩膜为 1 的位置掩膜外保持原样。如果你不想手写坐标直接调roipoly(i)不带坐标参数会用鼠标交互式点选多边形回车确认适合快速试。3.3 滤波入门均值、中值、维纳先跑再理解滤波是图像处理里出现频率最高的操作之一作用是平滑噪声或增强某些特征。这份实例里给了均值滤波、中值滤波、维纳滤波几个例子入门阶段不用纠结数学推导先把三种跑一遍看效果差别。a imread(onion.png); i rgb2gray(a); % 均值滤波3x3、5x5、7x7 三种窗口 k1 filter2(fspecial(average, 3), i) / 255; k2 filter2(fspecial(average, 5), i) / 255; k3 filter2(fspecial(average, 7), i) / 255; % 中值滤波对椒盐噪声特别有效 m medfilt2(i, [3 3]); subplot(221); imshow(i); title(原图); subplot(222); imshow(k1); title(均值 3x3); subplot(223); imshow(k2); title(均值 5x5); subplot(224); imshow(m); title(中值 3x3);fspecial(average, n)生成一个 n×n 的均值核filter2做二维卷积结果除以 255 是因为卷积后数值范围变了需要归一化回 0 到 1 才能正确显示。窗口越大越模糊这是均值滤波的固有特性。medfilt2取邻域中位数而不是平均值所以对孤立的亮斑暗斑椒盐噪声去除效果更好同时边缘保留得比均值滤波清楚。维纳滤波wiener2适合噪声类型未知的情况入门先知道有这么个函数、需要时查一下参数即可。4. 避坑指南新手最容易翻车的五个地方4.1 图片读不进来报“文件不存在”现象imread报错Cannot open file或返回空矩阵。原因MATLAB 当前工作目录不是你图片所在的文件夹或者文件名大小写、扩展名写错。解决用pwd看当前目录用cd切到图片所在文件夹或者直接写绝对路径。另一个常见原因是图片格式不被支持先用imfinfo确认文件能读再往下走。4.2 显示出来一片黑或者一片白现象imshow之后图像全黑或全白但矩阵里明明有数。原因数据类型和显示范围不匹配。double类型默认按 0 到 1 显示如果你的数据是 0 到 255 的double超过 1 的部分全被截成白色uint8类型按 0 到 255 显示如果你把 0 到 1 的double直接转uint8大部分变成 0 显示为黑。解决imshow第二个参数指定显示范围比如imshow(k, [0 255])或者用mat2gray把数据归一化到 0 到 1 再显示。4.3 彩色图直接做运算结果维度对不上现象对彩色图直接调edge、medfilt2等函数报错提示输入必须是二维。原因这些函数设计上只接受灰度图或二值图彩色图是三维矩阵。解决先rgb2gray转灰度再处理。如果确实要处理彩色需要对三个通道分别处理再cat(3, ...)合并这份实例里彩色边缘检测的例子就是这么做的但新手阶段建议先绕开。4.4 滤波后图像整体变暗或变亮现象filter2做完均值滤波图像明显偏暗。原因卷积核元素之和不为 1导致整体亮度被缩放。fspecial(average, n)生成的核元素之和是 1但如果你自己手写核或者用了其他核需要检查sum(k(:))是否等于 1。解决卷积后除以核元素之和或者直接用imfilter并配合replicate边界处理它不会自动归一化但边界填充更合理。4.5 旋转、缩放后坐标对不上现象imrotate旋转后想取某个点发现坐标和原图对不上。原因旋转默认会扩大画布图像原点位置变了。解决加crop参数保持原尺寸或者接受画布变化、用imtransform配合空间参考对象做精确坐标映射。入门阶段先用crop把尺寸稳住避免后续裁剪、掩膜操作时坐标错位。5. 下一步学什么从跑通例子到能改能调跑完上面这些例子你已经摸到了 MATLAB 图像处理的主干读图、转灰度、裁剪缩放旋转、边缘检测、区域选择、滤波。接下来不用急着啃大部头按下面这条路径走每一步都落在“能动手改”上。先花时间把imread、imshow、subplot、size、imfinfo这五个函数用熟它们是所有例子的地基。然后挑这份实例里你最感兴趣的一个方向深入想做缺陷检测就多跑边缘检测和形态学腐蚀膨胀想做图像增强就把imadjust、直方图均衡、锐化滤波串起来对比想理解频域就先把 FFT 和 DCT 的例子跑通看补零和fftshift对频谱图的影响。每个方向不需要看太多理论先把实例里的代码改参数——改窗口大小、改阈值、改旋转角度——观察输出怎么变这种“改一个数看一次结果”的循环比读十页公式管用。下面这张表可以当作你接下来两周的练习清单每行对应一个可独立跑通的小目标练习目标涉及函数检验标准读图并并排显示原图与灰度图imreadrgb2graysubplot两张图同时出现且标题正确裁剪指定区域并放大显示imcropimresize裁剪区域坐标与预期一致对比三种边缘算子效果edge能说出 canny 与 sobel 的差异对指定多边形区域做滤波roipolyroifilt2掩膜外像素不变对比均值与中值滤波去噪fspecialfilter2medfilt2中值滤波对椒盐噪声更干净观察 FFT 频谱并补零fft2fftshiftlog能解释频谱中心亮斑的含义我第一次学的时候总想着把每个函数的数学原理搞明白再动手结果卡在公式里半个月没跑出几张图。后来逼自己反过来先让代码跑出结果再回头查“为什么这个参数是这个值”。从那以后我每次学新函数都强制走一遍“最小可运行例子 → 改一个参数 → 观察变化 → 查文档补原理”的循环再也没被玄学报错卡住过。这份实例里的代码你不需要一次全跑完挑今天能跑通的三段改改参数看看图怎么变比通读一遍有用得多。希望帮到你。本文还有配套的精品资源点击获取
阅读完成 · 觉得有帮助?