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

时间:2009-12-04 16:41:40

标签: image matlab plot

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

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

但是生成的图像“1.jpg”已经在图表和图像中保存了非图像区域。我该如何解决这个问题?

1 个答案:

答案 0 :(得分:14)

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

您的问题与另一个SO question非常相似,因此我首先要指出这些答案所涵盖的两个主要选项:

  • 修改原始图像数据:您的图像数据存储在变量I中,因此您可以直接修改I中的图像像素值,然后保存使用IMWRITE修改图像数据。 my answerLiorH's answer中介绍了执行此操作的方法。此选项最适用于图像的简单修改(如添加矩形,就像该问题一样)。

  • 修改图形的保存方式:您还可以修改图形的保存方式,以便更好地匹配原始图像的尺寸。 PRINTGETFRAMEAzim的答案中介绍了使用jacobkoSCFrench函数代替SAVEAS的方法。如果您使用文本标签,箭头或其他更复杂的绘图对象覆盖图像,则可以执行此选项。

通过保存整个数字来使用第二个选项可能会非常棘手。具体来说,如果您在一个小窗口(比如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

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