Matlab图像处理实例集:从函数速查到工程封装实战

发布时间:2026/11/3 20:21:52
Matlab图像处理实例集:从函数速查到工程封装实战 简介这份资源是面向Matlab图像处理初学者与工程实践者的基础实例文档围绕图像读取显示、预处理、边缘检测、区域选择与掩膜、滤波变换、FFT与DCT、Radon投影等常见任务给出可直接运行的代码示例与参数说明帮助读者快速建立从函数调用到效果验证的完整认知。压缩包内共1个pdf文件约5.94MB内容以实例代码、注释与结果展示为主便于对照练习和查阅。目前已有2004人学习下载说明其在入门与课堂实验场景中具有一定参考价值。读者可从中获得图像灰度转换、裁剪与子图显示、roipoly与roifilt2区域处理、fspecial滤波、fft2与dct2变换、imfinfo信息读取等具体操作思路适合作为课程实验、自学练手和项目预研的速查材料。1. 从一份 PDF 实例集说起Matlab 图像处理到底能跑出什么很多人第一次接触 Matlab 图像处理不是从教材第一章开始而是从一份别人整理好的实例 PDF 开始。这份《matlab图像处理基础实例.pdf》就是典型它没有长篇理论推导而是把边缘检测、区域选择、频域变换、形态学操作、彩色空间转换这些高频操作用一段段可直接粘贴进命令窗口的代码串起来。你拿到它最直接的用途不是“学完图像处理”而是把它当成一个可执行的实验手册——想验证某个算子效果翻到对应小节改两个参数就能看到图。适合谁适合已经装好 Matlab、能看懂矩阵索引、但面对edge、roipoly、watershed这些函数不知道从哪下手的人。它更像一个“图像处理函数速查 效果对照”的落地包而不是从零讲起的课程。2. 实例集的技术骨架函数分组与执行链路2.1 这份实例集的组织方式从正文内容看这份 PDF 并不是按“第几章第几节”严格编排的教材而是按操作主题松散分组图像读取与显示、预处理与裁剪、区域选择与掩膜、滤波与变换、形态学与分割、彩色空间处理。每个主题下给出一段或多段 Matlab 命令多数以imread开头、以imshow或subplot收尾。这种组织方式的好处是“即查即用”坏处是缺少统一的工程封装——所有代码都跑在脚本或命令窗口里变量名随意图像路径写死。如果你打算把它变成可复用的项目第一步不是逐段跑通而是先理解它背后的函数分组逻辑再决定哪些片段值得封装成函数。从技术栈角度看它完全依赖 Matlab 基础环境加 Image Processing Toolbox。核心函数可以归成几类读写显示类imread、imshow、imfinfo、subimage、subplot、几何与区域类imcrop、imresize、imrotate、roipoly、roicolor、poly2mask、roifilt2、roifill、滤波与变换类fspecial、filter2、wiener2、medfilt2、fft2、fftshift、dct2、idct2、radon、形态学与分割类strel、imerode、imdilate、watershed、imregionalmin、彩色处理类rgb2gray、cat、mat2gray、HSI 手工转换。这些函数构成了整份实例集的“词汇表”后面所有代码都是它们的组合。2.2 一条典型执行链路从读图到边缘图拿正文里最靠前的边缘检测片段看它其实已经隐含了一条最小执行链路f imread(lbxx.bmp); % 读入原始图像可能是彩色或灰度 a rgb2gray(f); % 统一转灰度后续算子大多按单通道处理 [g, t] edge(a, canny); % Canny 边缘检测g 是二值边缘图t 是阈值 imshow(g); % 显示结果这段代码只有四行但把图像处理实例的通用节奏说清楚了读入 → 格式归一 → 算子处理 → 显示验证。rgb2gray这一步不是可有可无的因为edge对彩色图像的处理方式在不同版本里行为不完全一致先转灰度能避免很多“为什么我的结果和 PDF 不一样”的翻车。edge返回两个值第二个t是实际使用的阈值调试时把它打印出来比盲目调参数有用得多。同样的链路在区域选择里变成“读入 → 转灰度 → 构造掩膜 → 应用掩膜 → 分屏显示”。比如roipoly那段a imread(onion.png); c [200 250 278 248 199 172]; % 多边形顶点的列坐标x r [21 21 75 121 121 75]; % 多边形顶点的行坐标y b roipoly(a, c, r); % 生成二值掩膜区域内为 1 subplot(121); imshow(a); subplot(122); imshow(b);这里最容易踩的坑是c和r的顺序。roipoly的签名是roipoly(I, c, r)c是列坐标、r是行坐标和日常说的“x, y”对应但和矩阵索引“先行后列”相反。写反了不会报错只会得到一个位置偏移的掩膜肉眼还不一定立刻发现。我的习惯是先在图上用impixelinfo确认几个点的行列值再填进c、r。2.3 频域与形态学片段的依赖关系频域部分fft2、fftshift、dct2和形态学部分strel、imerode、imdilate、watershed对前置步骤的依赖更强。FFT 片段里先构造一个 100×100 的零矩阵、在中间挖一个矩形区域置 1再变换这是为了得到一个频谱特征清晰的合成图像方便观察补零和象限搬移的效果。如果你直接拿真实照片跑频谱会复杂到看不出规律。形态学片段则依赖二值化graythresh自动求阈值、im2bw转二值、再用不同尺寸的strel(square, n)做腐蚀膨胀。这里的顺序不能乱先二值再形态学否则imerode对灰度图的行为是另一套逻辑。提示这份实例集里大量使用figure、subplot做结果对照跑的时候建议一个主题一个脚本文件不要全部堆在命令窗口历史里否则变量互相覆盖排查起来很痛苦。3. 把实例跑起来环境准备与逐段复现3.1 环境与图像素材的准备运行这份实例集不需要额外安装包但需要确认两件事Matlab 版本带有 Image Processing Toolbox以及示例图像文件存在。正文里出现的lbxx.bmp、onion.png、football.jpg、kids.tif、trees.tif并不都是 Matlab 自带样例onion.png和football.jpg在部分版本的安装目录里能找到lbxx.bmp则明显是作者自己的文件。最稳妥的做法是建一个工作目录把 PDF 里提到的图像统一放进去没有的用同类图像替代但要注意替代图的尺寸会影响imcrop、roipoly里写死的坐标。% 建议在每个脚本开头统一设置工作路径和清理环境 clear; close all; clc; imgDir fullfile(pwd, images); % 图像统一放在 images 子目录 addpath(imgDir);clear; close all; clc这三件套看着老套但在逐段复现实例时非常必要上一段的figure不关下一段的subplot编号会接着排显示结果和 PDF 对不上。addpath把图像目录加进搜索路径后面imread(onion.png)就不用写全路径。3.2 区域选择与掩膜操作的复现顺序区域选择这一组函数建议按roipoly → poly2mask → roifilt2 → roifill的顺序跑因为它们共享同一套“多边形顶点 掩膜”的概念连着跑能看清每个函数在掩膜基础上多做了什么。先跑roipoly得到交互式或坐标式掩膜再用poly2mask理解“顶点坐标如何变成二值矩阵”然后roifilt2把滤波器只作用在掩膜内最后roifill做区域填充。a imread(onion.png); i rgb2gray(a); c [200 250 278 248 199 172]; r [21 21 75 121 121 75]; b roipoly(i, c, r); % 掩膜 h fspecial(unsharp); % 锐化滤波器 j roifilt2(h, i, b); % 只在掩膜区域滤波 subplot(121), imshow(i); subplot(122), imshow(j);roifilt2的关键参数是第二个滤波器核。fspecial(unsharp)生成一个 3×3 的锐化核你也可以换成fspecial(average, 5)做区域均值模糊对比效果更明显。注意roifilt2要求输入图像和掩膜尺寸一致roipoly生成的b默认和i同尺寸但如果中途对图像做了imresize掩膜必须同步缩放否则直接报维度错误。poly2mask那段是纯坐标到掩膜的转换不依赖原图x [63 186 54 190 63]; y [60 60 209 204 60]; bw poly2mask(x, y, 256, 256); % 在 256×256 画布上生成多边形掩膜 imshow(bw); hold on; plot(x, y, b, LineWidth, 2); % 把顶点画上去核对位置poly2mask的后两个参数是输出掩膜的行数和列数写死 256×256 是为了和示例画布匹配。实际项目里应该用size(I,1)和size(I,2)动态取避免换图就错位。3.3 频域变换与滤波的对照实验FFT 和 DCT 这两组适合放在一起跑因为它们都在回答“变换后能量怎么分布”。FFT 片段先看补零前后的频谱差异f zeros(100, 100); f(20:70, 40:60) 1; % 合成一个矩形亮块 subplot(121); imshow(f); F fft2(f, 256, 256); % 补零到 256×256 再做变换 F2 fftshift(F); % 把零频搬到中心 subplot(122); imshow(log(abs(F2)), []);fft2(f, 256, 256)的补零不是为了“提高分辨率”而是为了在频域获得更密的采样点让频谱图看起来更平滑。fftshift只是显示上的搬移不改变频谱内容。log(abs(F2))取对数是因为频谱动态范围太大直接imshow基本一片黑。DCT 片段则演示了“丢弃小系数再重建”a imread(onion.png); i rgb2gray(a); j dct2(i); j(abs(j) 10) 0; % 把小系数置零模拟压缩 k idct2(j); subplot(131); imshow(log(abs(j)), []), colorbar; subplot(132); imshow(i); subplot(133); imshow(k, [0, 255]);阈值 10 是示例值改大图像更糊、改小更接近原图这个参数就是理解 DCT 压缩最直观的旋钮。imshow(k, [0,255])里的显示范围必须给因为idct2输出是 double不给范围会按默认映射显示看起来发灰。滤波部分filter2的均值滤波要注意除以 255i rgb2gray(imread(onion.png)); k1 filter2(fspecial(average, 3), i) / 255; k2 filter2(fspecial(average, 5), i) / 255; k3 filter2(fspecial(average, 7), i) / 255;fspecial(average, n)生成的核元素和是 1但filter2对 uint8 输入做相关运算后数值范围会变除以 255 是为了把结果拉回可显示区间。更规范的做法是先把图像转double再滤波避免整数溢出。4. 核心片段拆解从边缘检测到彩色空间转换4.1 边缘检测与 Radon 变换的组合边缘检测本身不复杂但正文把它和radon放在一起意图是展示“边缘图还能继续做方向投影”。先看边缘a imread(onion.png); i rgb2gray(a); b edge(i); % 默认 Sobel theta 0:179; [r, xp] radon(b, theta); % 沿 180 个角度做投影 figure, imagesc(theta, xp, r); colormap(hot); colorbar; xlabel(\theta(degrees)); ylabel(x\prime);edge(i)不指定方法时默认用 Sobel返回二值图。radon对二值边缘图做投影得到的是“每个角度下边缘沿某方向的累积强度”imagesc画出来就是一条条亮带。这里theta取0:179是radon的常用角度范围xp是投影轴坐标。这个组合在检测直线方向时有用但要注意radon对输入尺寸敏感换图后xp的范围会变imagesc的坐标轴要跟着调。4.2 形态学腐蚀膨胀与分水岭分割形态学片段的核心是“同一张二值图换不同尺寸的结构元素看腐蚀膨胀的力度”a imread(football.jpg); t graythresh(a); % Otsu 自动阈值 bw1 im2bw(a, t); se1 strel(square, 3); se2 strel(square, 5); bw2 imerode(bw1, se1); % 3×3 腐蚀 bw3 imdilate(bw1, se1); % 3×3 膨胀 bw4 imerode(bw1, se2); % 5×5 腐蚀 bw5 imdilate(bw1, se2); % 5×5 膨胀graythresh返回 0 到 1 之间的归一化阈值im2bw直接接受这个值。strel(square, n)的n必须是奇数写偶数会报错。腐蚀让亮区收缩、膨胀让亮区扩张尺寸越大效果越猛。分水岭那段则是在梯度图上找“汇水盆地”f double(rgb2gray(imread(lbxx.bmp))); hv fspecial(prewitt); gv abs(imfilter(f, hv, replicate)); gh abs(imfilter(f, hv, replicate)); g sqrt(gv.^2 gh.^2); % 梯度幅值 l watershed(g); wr (l 0); % 分水岭脊线 f(wr) 255; imshow(uint8(f));watershed输入是梯度图输出是标签矩阵标签为 0 的位置就是分割线。imfilter的replicate边界选项能减少边缘伪影。这段代码里hv是转置得到水平方向的 Prewitt 核两个方向梯度平方和开根号就是梯度幅值。分水岭容易过分割正文后面用imregionalmin看局部极小值就是在解释过分割的来源。4.3 HSI 彩色空间的手工转换与分量滤波彩色部分最值得拆的是 HSI 手工转换因为它没有直接调用rgb2hsi而是用公式一步步算rgb1 im2double(imread(football.jpg)); r rgb1(:,:,1); g rgb1(:,:,2); b rgb1(:,:,3); i (r g b) / 3; tmp1 min(min(r, g), b); tmp2 r g b; tmp2(tmp2 0) eps; % 防止除零 s 1 - 3 .* tmp1 ./ tmp2; tmp1 0.5 * ((r - g) (r - b)); tmp2 sqrt((r - g).^2 (r - b).*(g - b)); theta acos(tmp1 ./ (tmp2 eps)); h theta; h(b g) 2*pi - h(b g); % 根据 B 与 G 关系修正色相 h h / (2*pi); h(s 0) 0;这段代码的每个中间变量都对应 HSI 公式的一步i是亮度s是饱和度h是色相。eps出现在两个地方都是防除零这是手工实现公式时最容易漏的。得到 H、S、I 后正文分别对 H 和 S 做均值滤波再转回 RGB观察“变柔和”和“饱和度降低”两种效果。转回 RGB 的分段公式比较长核心是按色相区间分三段计算每段用余弦公式求主分量另外两个分量由1 - 和得到。这段代码不适合死记但值得跑一遍因为它是理解“为什么在 HSI 空间滤波比在 RGB 空间滤波更符合视觉直觉”的最好例子。注意手工 HSI 转换里h(s 0) 0这一行不能省否则灰度区域饱和度为 0的色相会是acos算出的无意义值转回 RGB 时出现彩色噪点。5. 避坑与排查跑这份实例集最容易翻车的几处5.1 图像路径与文件名大小写现象imread(onion.png)报“文件不存在”但明明把图片放在当前目录。原因Matlab 当前工作目录不是脚本所在目录或者文件名大小写不一致Onion.png与onion.png。解决脚本开头用cd(fileparts(mfilename(fullpath)))切到脚本目录或者统一用fullfile拼绝对路径。文件名建议全部小写避免跨平台问题。5.2 坐标顺序写反导致掩膜偏移现象roipoly或poly2mask生成的掩膜位置和预期差一截但不报错。原因把行坐标和列坐标传反了c应该是列xr应该是行y。解决先用impixelinfo在图上确认几个关键点的行列值再填数组或者用ginput交互取点避免手写坐标。5.3 数据类型与显示范围不匹配现象滤波或变换后的图像imshow出来一片白或一片黑。原因filter2、dct2、idct2输出是 double数值范围可能超出[0,1]或[0,255]imshow默认按 double 的[0,1]映射。解决显示时显式给范围如imshow(k, [0,255])或者在滤波前im2double滤波后mat2gray归一化。5.4 结构元素尺寸与二值化阈值不匹配现象imerode后目标几乎消失或者imdilate后整图连成一片。原因strel(square, n)的n太大或者graythresh得到的阈值不适合当前图像。解决先用imhist看灰度分布确认阈值合理结构元素从 3×3 起步逐步加大每次subplot对照。5.5 分水岭过分割现象watershed结果分割线密密麻麻目标被切碎。原因梯度图噪声多局部极小值过多。解决分割前先平滑梯度图如imfilter均值滤波或medfilt2或者用imhmin抑制浅极小值再跑watershed。正文里用imregionalmin显示局部极小值就是排查过分割的入口。6. 二次开发把散落命令整理成可复用函数这份实例集最大的价值不是让你照着敲一遍而是给你一批“验证过的参数组合”。真正上手改的时候我建议做三件事。第一把重复出现的“读入 → 转灰度 → 处理 → 分屏显示”抽成一个辅助函数比如showPair(original, processed, titleStr)内部统一subplot(121)和subplot(122)省掉每段都写显示代码。第二把区域选择那组函数封装成maskDemo(imgPath, c, r)坐标作为参数传入换图时只改调用处。第三给滤波和形态学片段加一个参数表把fspecial的核类型、strel的尺寸、graythresh的阈值都提成变量方便做对比实验。function showPair(a, b, nameA, nameB) % 统一的双图对照显示避免每段重复写 subplot figure; subplot(1,2,1); imshow(a); title(nameA); subplot(1,2,2); imshow(b); title(nameB); end这个函数看着简单但能省掉大量重复代码而且保证所有对照图的布局一致截图写报告时很省事。验证改造是否成功的方法也简单拿 PDF 里任意三段代码用封装后的函数重写输出结果和原代码逐像素对比isequal或max(abs(diff(:)))一致就说明封装没改变行为。还有一个具体技巧彩色空间那部分的手工 HSI 转换建议单独存成rgb2hsi_local.m和hsi2rgb_local.m两个函数文件输入输出都用double类型内部保留eps防除零。这样后面做“只对 H 分量滤波”的实验时直接hsi rgb2hsi_local(img); hsi(:,:,1) filter2(...); out hsi2rgb_local(hsi);三行搞定不用每次复制那一大段公式。转回 RGB 的分段逻辑里三个区间的边界条件和要特别小心我一般会在函数末尾加一个assert检查输出范围在[0,1]超出就说明分段写漏了。从那以后我每次拿到这种“实例 PDF”类的资料都强制自己先抽一个最小可运行脚本、再抽一个对照显示函数最后才逐段复现——不然命令窗口历史越堆越乱回头找某段参数只能靠翻 PDF。希望这份拆解能帮你少走几段弯路把这份实例集真正跑成自己手里的实验底稿。本文还有配套的精品资源点击获取

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询