我想要显示图像并在其上绘制一些内容,然后将其保存为与原始图像大小相同的图像。我的MATLAB代码是:
figH = figure('visible','off');
imshow(I);
hold on;
% plot something
saveas(figH,'1','jpg');
close(figH);
但是生成的图像“1.jpg”已经在图表和图像中保存了非图像区域。我该如何解决这个问题?
答案 0 :(得分:14)
新图片大于原图的原因是因为SAVEAS功能会保存整个图形窗口,而不仅仅是轴的内容(图像显示的位置) )。
您的问题与另一个SO question非常相似,因此我首先要指出这些答案所涵盖的两个主要选项:
修改原始图像数据:您的图像数据存储在变量I
中,因此您可以直接修改I
中的图像像素值,然后保存使用IMWRITE修改图像数据。 my answer和LiorH's answer中介绍了执行此操作的方法。此选项最适用于图像的简单修改(如添加矩形,就像该问题一样)。
修改图形的保存方式:您还可以修改图形的保存方式,以便更好地匹配原始图像的尺寸。 PRINT,GETFRAME和Azim的答案中介绍了使用jacobko和SCFrench函数代替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
上应该有一个红色的星号,并且应该与输入图像具有相同的尺寸。