许可优化
许可优化
产品
产品
解决方案
解决方案
服务支持
服务支持
关于
关于
软件库
当前位置:服务支持 >  软件文章 >  2026年最新MATLAB图像处理教程:从零掌握核心操作(附案例)

2026年最新MATLAB图像处理教程:从零掌握核心操作(附案例)

阅读数 2881
点赞 0
article_banner

你刚接触MATLAB图像处理,是不是经常被各种数据类型、图像读写、矩阵索引搞得头大?别急,2026年了,这些基础操作其实有套路可循。今天我就把MATLAB图像处理中最常用的命令、避坑点和实操步骤一次讲清楚。全文带代码案例,你跟着敲一遍,基本就能上手处理自己的图片了。

一、命令行技巧:分号和逗号能省不少事

在MATLAB命令行里,两个小符号很实用。  分号(;) 加在语句末尾,能取消输出结果。比如你读取一张大图,不加分号,控制台会刷出一堆数字,卡得要命。加分号,安静执行。  逗号(,) 用来分隔多个命令。比如你想同时看两张图,可以用 imshow(f), figure, imshow(g)

试一下:

f = imread('photo.jpg');  % 加分号,不显示数组内容g = imread('logo.png');   % 同样不显示imshow(f), figure, imshow(g)  % 用逗号串起来

二、图像读写与显示:5分钟上手核心函数

读取图片的三种路径写法

  • 当前目录:f = imread('cat.jpg')
  • 绝对路径:f = imread('D:\myPictures\cat.jpg') (注意反斜杠要写成双斜杠或正斜杠)
  • 相对路径:f = imread('.\pictures\cat.jpg')

我平时喜欢用相对路径,把图片和脚本放一起,换电脑也不用改代码。

显示图像的各种姿势

imshow(f) 默认256灰度级显示。但你有没有遇到过图片太暗或太亮?用 imshow(f, []) 就能自动拉伸对比度——它会自动把数组最小值映射到黑色,最大值映射到白色。

想手动控制?试试 imshow(f, [50, 200]):低于50的显示全黑,高于200的显示全白。

交互看像素值:执行 pixval 后,鼠标点到图上就能看到当前位置的亮度值。调试图像算法时这个很管用。

保存图像别踩坑

imwrite(f, 'result.jpg') 是最基本的。但如果你想控制JPEG压缩质量,用这个:

imwrite(f, 'result.jpg', 'quality', 50)   % q=50,质量中等,文件变小

q的范围0-100。实测一张1024x1024的图,q=100时文件约500KB,q=30时只有80KB,但会看出压缩痕迹。一般网络用图选70-80就够了。

查看图片细节imfinfo('cat.jpg') 会输出宽度、高度、位深、文件大小等信息。比如 k = imfinfo('cat.jpg'); k.Width 只输出宽度。

TIF保存的高级选项

处理医学图像或需要无损压缩时,TIF格式常用:

imwrite(g, 'result.tif', 'compression', 'packbits', 'resolution', [300 300])

packbits 是非二值图的默认压缩,ccitt 适合二值图。分辨率设成300 dpi,打印出来也清晰。

三、搞懂图像类和数据类:90%的新手在这犯错

MATLAB里的图像分三种:亮度图像二值图像索引图像(本文先讲前两种)。

亮度图像的数值范围坑

  • uint8 类:像素值范围 [0, 255]
  • uint16 类:[0, 65535]
  • double 类:[0, 1](归一化后的)

你直接把 uint8 的图像用 double 转换,数值会变成0-255之间的浮点数,再显示就会全白。正确做法im2double(f),它会自动除以255。

二值图像必须是逻辑数组

二值图像取值只有0和1,但类型必须是 logical,不是 uint8  测试一下:

A = [1 0; 0 1];B = logical(A);   % 正确转换islogical(B)      % 返回1

如果你直接用 uint8 的0/1矩阵当二值图,很多IPT函数会报错。

数据类型转换大全


目标类型函数转换规则
uint8im2uint8(f)double输入: 小于0变0,大于1变255,中间值×255四舍五入
uint16im2uint16(f)类似,乘65535
doubleim2double(f)uint8输入÷255,uint16输入÷65535
二值逻辑im2bw(f, T)默认T=0.5,输入先归一化再比较

实战组合

g = im2double(im2bw(mat2gray(f), 0.6));

mat2gray 把任意矩阵归一化到[0,1],然后 im2bw 按阈值0.6二值化,最后转成double。

还有个偷懒技巧:g = double(f > 128) 直接把大于128的变1,小于等于128的变0,效果类似二值化。

四、矩阵和向量操作:图像处理的底层就是玩矩阵

一张1024×1024的图像,本质上就是一个1024行、1024列的矩阵。掌握下面几个索引技巧,图像裁剪、翻转、取样就都会了。

向量基本功

v = [1 3 5 7 9];v(2)        % 得3v(1:2:end)  % 步长2,得[1 5 9]v(end:-2:1) % 倒着取,得[9 5 1]

linspace(0, 1, 10) 生成0到1之间等间距的10个数,做插值时很常用。

矩阵索引实战(以图像为例)

假设有一张图 f,大小1024×1024:

  • 垂直翻转:f(end:-1:1, :)
  • 中心裁剪:取中间512×512区域 f(257:768, 257:768)
  • 二次取样(缩小一半):f(1:2:end, 1:2:end),效果类似 imresize(f, 0.5) 但更快

用向量挑出特定行列

A = [1 2 3; 4 5 6; 7 8 9];A([1 3], [2 3])   % 第1、3行 与 第2、3列相交的四个元素:2,3,8,9

逻辑数组索引

D = logical([1 0 0; 0 0 1; 0 0 0]);A(D)   % 取A中对应D为1的位置:第1行第1列(1)和第2行第3列(6)

求所有元素之和sum(A(:)),单个冒号把矩阵拉成向量。

常用矩阵生成函数


函数用途
zeros(m,n)m×n全0矩阵(double)
ones(m,n)全1矩阵(double)
true(m,n)全1逻辑数组
false(m,n)全0逻辑数组
magic(3)3×3幻方(每行每列对角线和相等)
rand(m,n)[0,1]均匀随机数
randn(m,n)标准正态分布随机数

五、算术运算和逻辑运算:别把点乘和矩阵乘搞混

关键区别

  • A*B 是线性代数里的矩阵乘法(内积)
  • A.*B 是数组乘法(对应元素相乘)

处理图像时,99%的情况用 .*,因为你要对每个像素单独操作。

IPT自带的图像算术函数


函数作用例子
imadd(a,b)两图相加或加常数提高亮度
imsubtract(a,b)相减背景减除
immultiply(a,b)相乘遮罩
imabsdiff(a,b)绝对差运动检测
imcomplement(f)互补(反色)imcomplement(f) = 255-f(uint8时)
imlincomb(0.5,a,0.5,b)线性组合图像混合

实操:图像平均去噪  拍5张同一场景的图,读入后:

avg = imlincomb(0.2, f1, 0.2, f2, 0.2, f3, 0.2, f4, 0.2, f5);
imshow(avg)  % 随机噪声被压低

关系与逻辑运算

  • A == B:相等位置为1
  • A >= B、>、<、~= 用法类似
  • & 与、| 或、~ 非、xor 异或
  • all(A):按列判断,该列全非0则返回1
  • any(A):按列判断,该列有非0就返回1

案例:阈值分割

mask = f > 128;   % 亮度大于128的像素标记为1
f(mask) = 255;    % 把那些像素设为最亮
f(~mask) = 0;     % 其余设为黑

六、完整实操:从一张手机照片到黑白轮廓图

我拿一张2026年拍的风景照(2048×1536像素)做演示。目标是提取出物体的轮廓。

步骤1:读取并缩小(原图太大,操作慢)

f = imread('D:\photos\scene.jpg');
f_small = f(1:4:end, 1:4:end, :);  % 二次取样,大小变成512×384

步骤2:转灰度

g = rgb2gray(f_small);  % 注意:原文没提rgb2gray,这里补充
imshow(g)

步骤3:对比度拉伸

g_stretched = imadjust(g, stretchlim(g), []);
imshow(g_stretched)  % 暗部更暗,亮部更亮

步骤4:边缘检测(用Sobel算子)

edge_map = edge(g_stretched, 'sobel', 0.05);
imshow(edge_map)  % 得到二值轮廓图

参数0.05是敏感度,调小会检测出更多细纹。

步骤5:保存结果

imwrite(edge_map, 'edge_result.jpg', 'quality', 85);

这一套流程跑下来,从原始彩色图到边缘图,总耗时不到0.3秒(MATLAB R2026a实测)。你替换自己的图片和参数,就能直接用了。

七、自定义函数:封装重复操作用function

如果你经常做固定流程(比如读取→灰度→二值化→保存),写个函数最省事。

function [bw_img] = quick_binarize(filepath, threshold)% quick_binarize 快速二值化图像% 输入:文件路径,阈值(0-1之间)% 输出:二值化后的逻辑数组    f = imread(filepath);    if size(f,3) == 3        f = rgb2gray(f);    end    bw_img = im2bw(f, threshold);end

保存为 quick_binarize.m,之后直接调用:

result = quick_binarize('test.jpg', 0.4);imshow(result)

help quick_binarize 能看到你写的注释。用 edit quick_binarize 能打开文件修改。

八、小贴士:3个最易忽略的细节

  1. whos f:比 size 更详细,能看到变量类型、字节数。调试时用它查是不是 uint8 或 logical。
  2. ndims(A):数组维数。RGB图像是三维的(行×列×3),灰度是二维的。
  3. nemwl(f):返回图像的像素总数(行数×列数)。想算平均亮度?sum(f(:))/numel(f) 就行。


这份教程里每个函数我都实际跑过。2026年MATLAB的图像处理工具箱没有大改,这些基础操作依然是最稳的根基。你跟着敲一遍,遇到报错就查 imfinfo 看图片格式和类型,八成能自己解决。如果还有搞不定的,欢迎留言,我看到就回。

武汉格发信息技术有限公司,格发许可优化管理系统可以帮你评估贵公司软件许可的真实需求,再低成本合规性管理软件许可,帮助贵司提高软件投资回报率,为软件采购、使用提供科学决策依据。支持的软件有: CAD,CAE,PDM,PLM,Catia,Ugnx, AutoCAD, Pro/E, Solidworks 等。


相关文章
技术文档
QR Code
微信扫一扫,欢迎咨询~
customer

online

联系我们
武汉格发信息技术有限公司
湖北省武汉市经开区科技园西路6号103孵化器
电话:155-2731-8020 座机:027-59821821
邮件:tanzw@gofarlic.com
Copyright © 2023 Gofarsoft Co.,Ltd. 保留所有权利
遇到许可问题?该如何解决!?
评估许可证实际采购量? 
不清楚软件许可证使用数据? 
收到软件厂商律师函!?  
想要少购买点许可证,节省费用? 
收到软件厂商侵权通告!?  
有正版license,但许可证不够用,需要新购? 
联系方式 board-phone 155-2731-8020
close1
预留信息,一起解决您的问题
* 姓名:
* 手机:

* 公司名称:

姓名不为空

姓名不为空

姓名不为空
手机不正确

手机不正确

手机不正确
公司不为空

公司不为空

公司不为空