当用线条重叠时,图像逐渐被擦除

mat*_*urg 5 matlab plot line imshow

除了存在绘制矢量场的特殊函数之外,我遇到了一个奇怪的Matlab行为:绘制一个图像(带有imagescimshow)并用彩色线条(用plotline)覆盖某些点导致背景图像的擦除.

%% 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
Run Code Online (Sandbox Code Playgroud)

结果:100行

经过100行

结果:200行

经过200行

结果:900行

经过900行

不错的一面事实将图像保存为PNG可恢复图像(但会破坏线条分辨率).

Hok*_*oki 0

这不是一个正确的答案,因为它没有准确解释为什么会发生这种情况,但它提供了一种解决方法,以及对奇怪行为的更多观察。


范围:

我尝试了你的例子,确实:

  • pre HG2 (R2013a):与您描述的行为相同
  • HG2 (R2015a):没问题,一切都在那里。

解决方法:

经过几次尝试和错误后,我发现这是painterHG2 之前版本中渲染器的特定行为。

如果将渲染器更改为默认值以外的任何渲染器painter,您将恢复图像和叠加的线条。

set(gcf,'Renderer','zbuffer')
%// OR
set(gcf,'Renderer','opengl')
Run Code Online (Sandbox Code Playgroud)

观察结果:

请注意,我还尝试:

  • 首先显示线条(没问题),然后显示图像(并使用重新排序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')
Run Code Online (Sandbox Code Playgroud)

好吧,结果出来后我仍然不确定发生了什么。所有这些保存的图形都显示了正确的图像和顶部的线条......但是:

3xpng图像(Matlab 引擎完全相同。它们甚至没有显示出饱和度的细微差别,就像您手动切换渲染器时可以观察到的那样。这让我认为 Matlab 选择忽略我的渲染器规范。它只是决定哪一个最相关,然后将相同的数字打印 3 次。所以我想可能是painter没有使用渲染器,这就是显示图像的原因。

好吧,没那么快。在 3xpdf图像(ghostscript 引擎)上...我可以观察到 3 张图片之间的细微差别...因此它们之间的渲染器并不相同。用于painter其中之一,并成功渲染了图像。


所以总而言之,painter渲染器似乎只有在应用于(HG2 之前)人物时才会出现故障!