Matlab 当用线条覆盖时,图像逐渐擦除
除了存在用于绘制向量场的特殊函数之外,我还遇到了一个奇怪的Matlab行为:绘制图像(使用Matlab 当用线条覆盖时,图像逐渐擦除,matlab,plot,line,imshow,Matlab,Plot,Line,Imshow,除了存在用于绘制向量场的特殊函数之外,我还遇到了一个奇怪的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 p
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会恢复图像(但会破坏线分辨率)。这不是正确的答案,因为它不能确切解释为什么会发生这种情况,但它提供了一种解决方法,以及对奇怪行为的更多观察
范围: 我试过你的例子,事实上:
- HG2之前(R2013a):与您描述的行为相同
- HG2(R2015a):没问题,一切都在那里
解决方法: 经过几次尝试和错误,我发现这是HG2之前版本中
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')
嗯,结果出来后,我仍然不确定发生了什么。所有这些保存的图形都显示了正确的图像和顶部的线条。。。但是:
3xpng
图像(Matlab
engine)非常类似。它们甚至不会像手动切换渲染器时可以观察到的那样显示饱和度的细微差异。这让我觉得Matlab选择忽略我的渲染器规范。它只是决定了哪一个是最相关的,然后继续打印3次相同的图形。所以我想可能是画师渲染器没有使用,这就是为什么显示图像的原因
嗯,别那么快。在3xpdf
图像(ghostscript
引擎)上。。。我能观察到这3张照片之间的细微差别。。。所以它们之间的渲染器不一样。其中一个使用了画师
,并成功地渲染了图像
因此,总之,painter
渲染器在应用于(HG2之前的)图形时似乎只是一个小问题 这是哪个版本的Matlab?是新的数字手柄吗?400发生了什么?600? 在执行行
命令后,您是否也尝试过按住键?也许这是对比度问题,你也可以试试imshow(Image,[])
?@Ander Biguri:Matlab版本:R2012b(8.0.0.783)@Adiel这也是我一开始的直觉,但由于我一直在玩弄这个想法,在MWE中,一切都在[0,1]中,我很确定情况并非如此。更重要的是,这种行为无法用这种方式解释……这在Matlab2014B win7x64计算机中不会发生。我有随机图像和小正方形的颜色没有问题。我猜:matlab的图形句柄(如果我没有错的话,用java编程)会删除图像,因为它没有足够的ram来保存屏幕上的所有数据。测试这一点:制作一个更小/更大的图像,并测试这种情况是否发生得更慢/更快。