我想显示一张图像并在其上绘制一些内容,然后将其另存为与原始图像大小相同的图像。我的MATLAB代码是:
figH = figure('visible','off'); imshow(I); hold on; % plot something saveas(figH,'1','jpg'); close(figH); 但是,生成的图像“ 1.jpg”已保存了绘图中的非图像区域以及图像。我怎么解决这个问题?
回答:
您的新图像大于原始图像的原因是因为
SAVEAS功能保存
了整个图形窗口 ,而不是保存了轴的内容(显示图像的位置)。
您的问题与另一个
SO问题非常相似,因此我将首先指出这些答案包含的两个主要选项:
- 修改原始图像数据:您的图像数据存储在变量I ,因此您可以直接修改I的图像像素值,然后使用IMWRITE保存修改后的图像数据。 我的答案和LiorH的答案中都描述了您执行此操作的方法。此选项最适合图像的简单修改(例如,考虑到该问题,添加矩形)。
- 修改图形的保存方式:您还可以修改图形的保存方式,使其与原始图像的尺寸更好地匹配。 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 cr]); %# 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应带有红色星号,并且其尺寸应与输入图像相同。
更多&回答...