matlab中的两种保存图像的方法:saveas imwrite.

本文对比了Matlab中imwrite和saveas两种保存图像的方法。saveas保存图像时背景色默认为白色,且忽略手动设置的图像大小;而imwrite则能够保留图像的实际背景色及尺寸,适用于更精细的图像处理需求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在写程序的过程中,使用saveas保存的图像不符合我的要求,于是在网上寻找解决途径。看到下面的这篇文章,说的很透彻。作者自己理解的很好,表达的也清楚。转载过来,希望对更多的朋友有帮助。

matlab中imwrite和saveas的区别

matlab中saveas(handle,['目录','文件名'])  
如果只有一幅图,handle设为gcf
如果有多副,handle需单独设置

matlab中imwrite(image_data,['directory\','filename'])
需要与getframe连用

两个命令都可以用来保存图像,区别在于
1、背景色:saveas保存的图像 背景色自动设置为白色,imwrite保存图像为所见即所得
2、图像大小: saveas无视你设置的图像大小,按默认保存,imwrite保存所见即所得

contrast example:在当前目录下image文件夹下找到两个图像,对比一下

clear
clc
x=0:pi/100:2*pi;
y=sin(x);
h=plot(x,y);  % h为plot线的句柄handle
set(gcf,'position',[80,100,400,600])
% 将图像设置为距屏幕左下角 [80,100]像素
% 图像大小设置为400*600像素
set(gcf,'color',[1,1,1]) % 背景色设置为白色
mkdir image 
% 在当前文件夹下新建image文件夹,如果已存在会warning,不影响运行

% ========================
saveas(gcf,['image\','test1.jpg'])

% ========================
f=getframe(gcf);
imwrite(f.cdata,['image\','test2.jpg'])

%% 也可以像下面这样用
% [X,map]=getframe(gcf);
% imwrite(X,'image\test2.jpg')

 

转自:http://hi.baidu.com/ctguyg/item/01f71c8d7e76ced75f0ec107

<think>好的,我需要解决用户的问题:如何在MATLAB中将subplot生成的多个子图分别保存为单独的图像文件。首先,我得回忆一下MATLAB中关于图形处理和保存的相关函数。 用户提到了subplot生成的多个图像,想分别保存每个子图。根据之前的经验,subplot会将多个axes(坐标系)放在同一个figure(图形窗口)中。直接保存的话,通常只能保存整个figure,但用户需要每个子图单独保存。因此,关键点在于如何访问每个子图对应的axes,并将其内容提取出来,保存为独立的图像文件。 首先,我需要确认在生成subplot时,每个子图的句柄(handle)是否可以被获取。例如,当使用subplot(m,n,p)时,会返回对应axes的句柄。如果用户在创建子图时保存这些句柄,后续就可以针对每个axes进行操作。 假设用户现有的代码可能是这样的: figure; subplot(2,2,1); imshow(image1); title('r=0.2'); subplot(2,2,2); imshow(image2); title('r=0.8'); % 其他子图... 这时候,每个subplot的axes句柄可以通过h1 = subplot(...)来获取。但如果在生成子图时没有保存句柄,可能需要通过figure的子对象来遍历所有axes。 另一种方法是,在生成每个子图后,立即保存该子图的内容。例如,在绘制完第一个子图后,保存当前axes的图像,然后再绘制下一个。但这样可能会影响后续的绘图,因为每次subplot都会切换当前axes。 或者,可以考虑在生成所有子图后,遍历figure中的所有axes对象,分别截取每个axes的图像区域并保存。这需要用到getframe函数或者exportgraphics函数,可能需要获取每个axes的位置信息,然后截取对应的区域。 查阅MATLAB文档,发现可以使用exportgraphics函数指定裁剪选项,或者使用getframe捕获特定区域。例如,对于每个子图的axes,可以用getframe(gca)来捕获当前坐标区的内容,然后保存图像。 具体步骤可能如下: 1. 生成所有子图,并确保它们都在同一个figure中。 2. 获取该figure中所有axes的句柄。 3. 遍历每个axes句柄: a. 将该axes设置为当前axes(使用axes(ax))。 b. 使用getframe捕获当前axes的内容。 c. 将捕获的图像数据写入文件,如使用imwrite。 此外,可能需要注意坐标轴周围的空白区域,确保保存图像只包含子图内容,而不包括标题或其他周围的空白。可能需要调整axes的位置或使用tight选项。 或者,可以考虑在保存每个子图时,创建一个新的figure,将子图的内容复制过去,然后保存新figure,最后关闭它。这种方法虽然可行,但可能会影响性能,特别是当子图数量较多时。 例如: h = findobj(gcf, 'Type', 'axes'); % 获取所有axes句柄 for i = 1:length(h) newFig = figure('visible', 'off'); % 不显示新窗口 copyobj(h(i), newFig); % 复制axes到新figure saveas(newFig, sprintf('subplot%d.png', i)); close(newFig); end 这种方法可能会保留坐标轴和标题,但需要注意新figure的尺寸是否合适,可能需要调整位置或大小以确保保存图像与原始子图一致。 另一种方法是使用exportgraphics函数,指定要导出的axes,并设置裁剪方式。例如: ax = subplot(2,2,1); exportgraphics(ax, 'subplot1.png', 'Resolution', 300); 但需要确保在导出每个axes时,正确指定对应的句柄。因此,在创建子图时保存每个axes的句柄会更方便。 总结可能的解决方案: 方法一:在生成每个子图时保存axes句柄,然后逐个导出: figure; ax1 = subplot(2,2,1); imshow(image1); title('r=0.2'); ax2 = subplot(2,2,2); imshow(image2); title('r=0.8'); % 其他子图... exportgraphics(ax1, 'subplot1.png', 'Resolution', 300); exportgraphics(ax2, 'subplot2.png', 'Resolution', 300); % 或者循环处理 方法二:生成所有子图后,通过findobj获取所有axes句柄,然后循环处理: h = findobj(gcf, 'Type', 'axes'); for k = 1:length(h) exportgraphics(h(k), sprintf('subplot%d.png', k), 'Resolution', 300); end 或者使用getframe和imwrite: h = findobj(gcf, 'Type', 'axes'); for k = 1:length(h) axes(h(k)); % 切换到对应的axes frame = getframe(gca); imwrite(frame.cdata, sprintf('subplot%d.png', k)); end 需要注意的是,getframe可能捕获整个figure的某个区域,而不仅仅是该axes的内容,所以可能需要调整捕获的区域。这时候可以使用axes的位置属性来指定捕获范围: pos = get(h(k), 'Position'); % 获取axes的位置,单位为归一化坐标 % 转换为像素坐标可能需要获取figure的Position figurePos = get(gcf, 'Position'); % [left, bottom, width, height] in pixels axesPos = pos .* figurePos([3,4,3,4]); % 计算axes在figure中的像素位置 rect = [axesPos(1), axesPos(2), axesPos(3), axesPos(4)]; frame = getframe(gcf, rect); imwrite(frame.cdata, sprintf('subplot%d.png', k)); 但这种方法可能较为复杂,且不同MATLAB版本的坐标处理可能有差异。 综合来看,使用exportgraphics函数可能是更简洁的方法,尤其在较新的MATLAB版本中(R2020a及以上)。此外,用户可能希望保持图像分辨率和质量,因此需要设置合适的参数,如'Resolution'选项。 最后,编写示例代码时,需要确保用户现有的subplot代码结构能够适配,例如在生成每个子图后保存句柄,或者在生成所有子图后遍历axes。同时,可能需要考虑子图的顺序是否正确,因为findobj返回的axes句柄可能不是按创建顺序排列的,可能需要根据Position属性排序。 例如,按子图的位置排列: h = flipud(findobj(gcf, 'Type', 'axes')); % 可能按逆序排列,需要调整 或者根据每个axes的Position属性中的坐标来确定行列顺序。 不过这可能比较复杂,可能需要用户自行调整顺序。因此,建议用户在生成子图时按顺序保存句柄到数组中,以便后续处理。 综上所述,给出两种方法方法一:逐个保存每个子图(推荐) 在创建每个子图时保存句柄,然后逐个导出: figure; ax1 = subplot(2,2,1); imshow(image1); title('r=0.2'); ax2 = subplot(2,2,2); imshow(image2); title('r=0.8'); ax3 = subplot(2,2,3); imshow(image3); title('r=2'); ax4 = subplot(2,2,4); imshow(image4); title('r=8'); % 保存每个子图 exportgraphics(ax1, 'subplot1.png', 'Resolution', 300); exportgraphics(ax2, 'subplot2.png', 'Resolution', 300); exportgraphics(ax3, 'subplot3.png', 'Resolution', 300); exportgraphics(ax4, 'subplot4.png', 'Resolution', 300); 方法二:生成后遍历所有axes并保存: figure; subplot(2,2,1); imshow(image1); title('r=0.2'); subplot(2,2,2); imshow(image2); title('r=0.8'); subplot(2,2,3); imshow(image3); title('r=2'); subplot(2,2,4); imshow(image4); title('r=8'); % 获取所有axes句柄并按创建顺序处理 h = findobj(gcf, 'Type', 'axes'); % 可能需要调整顺序,例如对于2x2的子图,按创建顺序可能是逆序 h = h(end:-1:1); % 假设需要反转顺序 for k = 1:length(h) exportgraphics(h(k), sprintf('subplot%d.png', k), 'Resolution', 300); end 需要注意的是,findobj返回的axes顺序可能与创建顺序相反,因此可能需要反转数组。例如,先创建的子图在后来的索引中可能排在后面,因此需要测试确认。 此外,如果用户无法修改原始代码以保存axes句柄,那么方法二可能更适合。 另外,关于保存图像格式,用户可能需要PNG、JPG等,可以根据需要修改文件名后缀,并在exportgraphics中指定格式,例如: exportgraphics(ax1, 'subplot1.jpg', 'Resolution', 300, 'ContentType', 'image'); 不过,exportgraphics的参数可能需要根据版本调整。如果使用较旧的MATLAB版本(如R2019b之前),则可能需要使用saveas或print函数,例如: saveas(ax1, 'subplot1.png'); 但saveas可能保存整个figure,而不是仅axes的内容。这时可能需要结合设置figure的尺寸来匹配axes的大小,或者使用其他方法。 综上所述,推荐使用exportgraphics方法,因为它可以直接导出指定axes的内容,并允许调整分辨率和裁剪选项。用户需要确保MATLAB版本支持该函数(R2020a及以上)。如果版本较低,可能需要使用其他方法,如复制axes到新figure并保存。 最后,给出示例代码,并提醒用户注意axes顺序和版本兼容性。</think>在MATLAB保存`subplot`生成的每个子图为单独图像文件,可以通过以下两种方法实现: --- ### 方法一:逐个导出子图(推荐) 在创建子图时保存坐标轴句柄,并使用`exportgraphics`函数单独保存: ```matlab % 创建子图并保存句柄 figure; ax1 = subplot(2,2,1); imshow(image1); title('r=0.2'); ax2 = subplot(2,2,2); imshow(image2); title('r=0.8'); ax3 = subplot(2,2,3); imshow(image3); title('r=2'); ax4 = subplot(2,2,4); imshow(image4); title('r=8'); % 分别保存每个子图 exportgraphics(ax1, 'subplot1.png', 'Resolution', 300); exportgraphics(ax2, 'subplot2.png', 'Resolution', 300); exportgraphics(ax3, 'subplot3.png', 'Resolution', 300); exportgraphics(ax4, 'subplot4.png', 'Resolution', 300); ``` **说明**: - `exportgraphics`函数(需MATLAB R2020a及以上版本)可直接导出指定坐标轴内容,`Resolution`参数设置图像分辨率[^3]。 - 若需保存为其他格式(如JPG),修改文件名后缀即可。 --- ### 方法二:遍历所有子图并保存 对于已生成的图形窗口,获取所有坐标轴句柄后循环保存: ```matlab figure; subplot(2,2,1); imshow(image1); title('r=0.2'); subplot(2,2,2); imshow(image2); title('r=0.8'); subplot(2,2,3); imshow(image3); title('r=2'); subplot(2,2,4); imshow(image4); title('r=8'); % 获取所有坐标轴句柄(可能需要调整顺序) h = findobj(gcf, 'Type', 'axes'); h = h(end:-1:1); % 按创建顺序反转句柄数组 % 遍历保存 for k = 1:length(h) exportgraphics(h(k), sprintf('subplot%d.png', k), 'Resolution', 300); end ``` **注意**: - `findobj`返回的句柄顺序可能与子图创建顺序相反,需通过`h(end:-1:1)`调整。 - 低版本MATLAB可使用`saveas`,但需复制子图到新窗口: ```matlab h = findobj(gcf, 'Type', 'axes'); for k = 1:length(h) newFig = figure('visible', 'off'); copyobj(h(k), newFig); saveas(newFig, sprintf('subplot%d.png', k)); close(newFig); end ``` --- ### 关键点总结 1. **句柄操作**:通过坐标轴句柄精准控制导出的子图内容。 2. **图像质量**:使用`Resolution`参数确保图像清晰度。 3. **兼容性**:`exportgraphics`适用于新版MATLAB,低版本需通过复制子图实现。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值