除了存在绘制矢量场的特殊函数之外,我还遇到了一个奇怪的 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 可恢复图像(但会破坏线条分辨率)。
最佳答案
这不是一个答案,因为它没有准确解释为什么会发生这种情况,但它提供了一种解决方法,以及对奇怪行为的更多观察。
范围:
我试过你的例子,确实:
- pre HG2 (R2013a):行为与您描述的相同
- HG2 (R2015a):没问题,一切都在那里。
解决方法:
经过反复试验,我发现这是 HG2 之前版本中 painter
渲染器的特定行为。
如果您将渲染器更改为默认 painter
以外的任何渲染器,您将取回图像和叠加的线条。
set(gcf,'Renderer','zbuffer')
%// OR
set(gcf,'Renderer','opengl')
观察:
请注意,我也尝试过:
- 首先显示线条(没问题),然后显示图像(并使用
uistack
重新排序)=> 相同的黑色图像。 - 使用多轴=>黑框
并向您展示故障的持久性:
- 如果删除所有行,图像不会重新出现(=黑框)。
- 如果删除所有图形对象,则重新显示图像=>黑框
- 如果您
cla
甚至clf
则重新显示图像=> 黑框
我发现显示图像的唯一方法是如上所述更改渲染器。
打印/保存
最初,我认为渲染器的更改是在保存图形时在幕后发生的,从而使最终输出得以完整显示。不幸的是,通过更多的探索,它似乎并不那么简单。
我尝试了不同版本的 print
(而不是 saveas
),因为它允许您选择渲染器。对于每个渲染器,我选择了 2 种格式,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
engine)完全相似。它们甚至没有像您在手动切换渲染器时观察到的那样显示出轻微的饱和度差异。这让我觉得 Matlab 选择忽略我的渲染器规范。它只是决定哪一个是最相关的,然后继续打印 3 次相同的图形。所以我认为可能是未使用 painter
渲染器,这就是显示图像的原因。
还好没那么快。在 3x pdf
图像 (ghostscript
engine) 上......我可以观察到 3 张图片之间的细微差别......所以渲染器是他们之间是一样的。 painter
用于其中一个,并成功渲染了图像。
所以总而言之,painter
渲染器似乎只有在应用于(HG2 之前的)图形时才会出现故障!
关于matlab - 当用线条覆盖时,图像逐渐消失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27144825/