【问题标题】:How do I save a plotted image and maintain the original image size in MATLAB?如何在 MATLAB 中保存绘制的图像并保持原始图像大小?
【发布时间】:2010-12-23 07:41:45
【问题描述】:

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

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

但生成的图像“1.jpg”在绘图中保存了非图像区域以及图像。我该如何解决这个问题?

【问题讨论】:

  • 大多少?一个数量级?很小的百分比?
  • 对不起,我的意思应该是不保存剧情中的非图像区域。

标签: image matlab plot


【解决方案1】:

新图像比原始图像大的原因是SAVEAS 函数保存整个图形窗口,而不仅仅是轴的内容(显示图像的位置)。

您的问题与另一个SO question 非常相似,所以我将首先指出这些答案包含的两个主要选项:

  • 修改原始图像数据:您的图像数据存储在变量I中,因此您可以直接修改I中的图像像素值,然后使用保存修改后的图像数据IMWRITE。在my answer 和LiorH's answer 中描述了您可以执行此操作的方法。此选项最适合对图像进行简单修改(例如添加一个矩形,正如该问题所关注的那样)。

  • 修改图的保存方式:您还可以修改图的保存方式,使其更好地匹配原始图像的尺寸。在Azim、jacobko 和SCFrench 的答案中描述了您可以执行此操作的方法(使用PRINT 和GETFRAME 函数而不是SAVEAS)。如果您使用文本标签、箭头或其他更多涉及的绘图对象覆盖图像,则此选项是您想要做的。

通过保存整个图形来使用第二个选项可能会很棘手。具体来说,如果您在小窗口(例如 700 x 700 像素)中绘制大图像(例如 1024 x 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 上应该有一个红色星号,并且应该与输入图像具有相同的尺寸。

【讨论】:

  • 谢谢大佬,我试过Azim的方法。非图像区域消失,但保存的图像与原始图像的分辨率不同。这可以解决吗?问候!
  • @Tim:我基本上结合了 Azim 和 SCFrench 的建议,并在上面的答案中添加了一个新的解决方案。希望这会为您解决问题。
猜你喜欢
  • 2011-08-20
  • 1970-01-01
  • 2017-08-11
  • 1970-01-01
  • 1970-01-01
  • 2011-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多