除了存在绘制矢量场的特殊功能之外,我遇到了一个奇怪的Matlab行为:绘制图像(带imagesc
或imshow
)并覆盖它带有彩色线条(plot
或line
)会导致背景图像被删除。
%% some data...
% random image
Image = rand(200,400);
% 900 lines of random color
color1 = rand(1,900);
color2 = rand(2,900);
color3 = rand(3,900);
% some positions
x = 31:60;
y = 31:60;
[X,Y] = meshgrid(x,y);
%% plot process
% plot Image (with 'imshow' or 'imagesc')
imshow(Image);
hold on;
% plot the lines (with 'line' or 'plot')
for i = 1:900
line([X(i), X(i)+1],[Y(i),Y(i)+2],'color',[color1(i),color2(i),color3(i)]);
if i == 100 % nothings happens to background image after 100 vectors
pause();
elseif i == 200 % gradually starts to change...
pause();
end
end
% ... at the end it is completely erased
结果:100行
结果:200行
结果:900行
不错的一面将图像保存为PNG会恢复图像(但会破坏线条分辨率)。
答案 0 :(得分:0)
这不是回答,因为它没有准确解释为什么会发生这种情况,但它提供了一种解决方法,以及对奇怪行为的更多观察。
我尝试了你的例子,确实:
经过一些试验和错误后,我发现这是HG2之前版本中painter
渲染器的特定行为。
如果您将渲染器更改为默认painter
以外的任何渲染器,则会返回图像和叠加的线条。
set(gcf,'Renderer','zbuffer')
%// OR
set(gcf,'Renderer','opengl')
请注意,我也尝试过:
uistack
重新排序)=>相同的黑色图像。
并向您展示持久性是如何出现故障:
cla
甚至clf
,则重新显示图片=>黑框我发现显示图像的唯一方法是更改渲染器,如上所述。
最初,我认为当您保存图形时,渲染器的更改发生在场景后面,从而允许最终输出完全显示。不幸的是,通过探索更多它似乎并不那么简单。
我尝试使用print
(而不是saveas
)的不同版本,因为它允许您选择渲染器。对于每个渲染器,我选择了两种格式,PDF
使用ghostscript
引擎,PNG
使用Matlab引擎:
%%
print(1,'-dpng','-painters','testimageP.png')
print(1,'-dpng','-zbuffer' ,'testimageZ.png')
print(1,'-dpng','-opengl' ,'testimageO.png')
%%
print(1,'-dpdf','-painters','testimageP.pdf')
print(1,'-dpdf','-zbuffer' ,'testimageZ.pdf')
print(1,'-dpdf','-opengl' ,'testimageO.pdf')
好吧,在结果之后,我仍然不确定发生了什么。所有这些保存的数字都显示了正确的图像和顶部的线条......但是:
3x png
图片(Matlab
引擎)完全相似。它们甚至没有像手动切换渲染器时观察到的那样显示出饱和度的微小差异。这让我觉得Matlab选择忽略我的渲染器规范。它只决定哪一个最相关,并继续打印3次相同的数字。所以我认为可能没有使用painter
渲染器,这就是图像显示的原因。
好吧不是那么快。在3x pdf
图片(ghostscript
引擎)上...我可以观察到3张图片之间的细微差别......所以渲染器不是一样的它们之间。 painter
用于其中一个,并成功渲染了图像。
总而言之,似乎painter
渲染器在应用于(前HG2)数字时才会出现故障!