如何在MATLAB中保存绘图图像并保持原始图像大小?

Tim*_*Tim 9 matlab plot image

我想要显示图像并在其上绘制一些内容,然后将其保存为与原始图像大小相同的图像.我的MATLAB代码是:

figH = figure('visible','off');
imshow(I);
hold on;
% plot something
saveas(figH,'1','jpg');
close(figH);
Run Code Online (Sandbox Code Playgroud)

但是得到的图像"1.jpg"已经在图中以及图像中保存了非图像区域.我怎么解决这个问题?

gno*_*ice 14

新图像大于原始图像的原因是因为SAVEAS功能保存整个图形窗口,而不仅仅是轴的内容(显示图像的位置).

你提的问题是非常相似的另一个SO问题,所以我会首先指出这些答案包含两个主要的选项:

  • 修改原始图像数据:您的图像数据存储在变量中I,因此您可以直接修改图像像素值,I然后使用IMWRITE保存修改后的图像数据.在我的回答LiorH的回答中描述了你可以做到这一点的方法.此选项最适用于图像的简单修改(如添加矩形,因为该问题与此有关).

  • 修改图形的保存方式:您还可以修改图形的保存方式,以便更好地匹配原始图像的尺寸.你可以这样做的方法(使用PRINTGETFRAME函数而不是SAVEAS)在Azim,jacobkoSCFrench的答案中描述.如果您使用文本标签,箭头或其他更复杂的绘图对象覆盖图像,则可以执行此选项.

通过保存整个数字来使用第二个选项可能很棘手.具体来说,如果您在一个小窗口(比如700×700像素)中绘制一个大图像(例如1024×1024像素),则可能会丢失图像分辨率.您必须设置图形和轴属性以适应.这是一个示例解决方案:

I = imread('peppers.png');      %# Load a sample image
imshow(I);                      %# Display it
[r,c,d] = size(I);              %# Get the image size
set(gca,'Units','normalized','Position',[0 0 1 1]);  %# Modify axes size
set(gcf,'Units','pixels','Position',[200 200 c r]);  %# Modify figure size
hold on;
plot(100,100,'r*');             %# Plot something over the image
f = getframe(gcf);              %# Capture the current window
imwrite(f.cdata,'image2.jpg');  %# Save the frame data
Run Code Online (Sandbox Code Playgroud)

输出图像上image2.jpg应该有一个红色星号,并且应该与输入图像具有相同的尺寸.