2016-08-26 360 views
1

我试图在Matlab R2014a中保存一个图,在该图中我想通过图像绘制数据。这是代码:MATLAB:如何用faceAlpha保存geoshow图形?

[Singapore, R] = geotiffread(file); 
s = size(Singapore); 
matrix = rand(s(1),s(2)); 
geoshow(Singapore(:,:,1:3), R) 
hold on 
geoshow(matrix, R, 'DisplayType', 'texturemap','facealpha',.2); 
xlim([103.605,104.04]) 
ylim([1.2,1.475]) 

这一个是完美的作品情节: enter image description here

而当我打印图

print(gcf, '-dpng',  fullfile(FileF, 'test.png')) 

图像完全是白色 enter image description here

+1

FaceAlpha = 1会发生什么? – NKN

+0

我有相同的输出 – emax

+2

这将是一个***很容易***帮助,如果你有一个链接到原始图像,以便我们可以重现问题 –

回答

1

许多感谢的图片链接! 我已经尝试过你的代码(适用于你提供的`Singapore.tif'文件和一个合适的输出文件),它可以在我的系统上正常工作(Matlab 2013b,Linux 64位)。这是输出文件:

enter image description here

所以我很抱歉地说,有什么不对你的代码,它可能是与Windows上的“PNG”驱动程序或特定的安装。你有没有尝试打印到不同的驱动程序? (如JPG或PDF?)。如果您从图形的图形菜单中执行此操作,它是否真的有效,例如File->Save As;或通过File->Export Setup->Export具有适当的属性?


我唯一能想到的可能会让您的系统混淆的其他事情是试图打印一张uint8 rgb图像(您的新加坡图像) 覆盖的双灰度图像。你可以看到,如果您的新加坡图像转换为这种双重解决了改变:

geoshow(Singapore(:,:,1:3), R) 

geoshow(mat2gray(Singapore(:,:,1:3)), R) 


也可能是值得手动试图绘制数据 ,看看是否打印的工作原理如:

[Singapore, R] = geotiffread('Singapore.tif'); 
SingaporeXYImage = cat(3, flipud(Singapore(:,:,1)), ... 
          flipud(Singapore(:,:,2)), ... 
          flipud(Singapore(:,:,3))); 
s = size(Singapore); 
matrix3D = repmat(rand(s(1),s(2)), [1,1,3]); 
imagesc(R.LongitudeLimits, R.LatitudeLimits, mat2gray(SingaporeXYImage)); 
hold on; 
imagesc(R.LongitudeLimits, R.LatitudeLimits, matrix3D, 'alphadata', .2); 
hold off; 
axis xy equal tight; 
xlim([103.605,104.04]) 
ylim([1.2,1.475]) 
print(gcf, '-dpng', 'test.png'); 


作为奖励,这里是如何您可能会在八度进行同样的事情,如果你有兴趣(我发现打印从八度曲线看起来更漂亮,尤其是在字体方面!):

pkg load mapping; 
pkg load image; 
[SingaporeStruct, R] = rasterread('Singapore.tif'); 
SingaporeImage = cat(3, SingaporeStruct(1:3).data); % note this is a matrix of 
                % "doubles" in range [0,255] 
SingaporeImage = mat2gray(SingaporeImage); % Convert to appropriate [0,1] range 
              % for "doubles" rgb images! 
s = size (SingaporeImage); 
matrix3D = repmat (rand (s(1), s(2)), [1, 1, 3]); 
imagesc (R.bbox(:,1), R.bbox(:,2), ... 
     SingaporeImage .* 0.8 + matrix3D .* 0.2); % manually create 
                % transparency effect 
axis xy equal tight 
xlim([103.605,104.04]) 
ylim([1.2,1.475]) 
print (gcf, '-dpng', 'test.png'); 

enter image description here


另外,对我的同事和他/她在答案中所付出的努力没有不尊重,但我会注意到您收到的其他答案本质上是完全错误的,您应该收回您的 marked accepted,无论他/她的声明和警告如何关于收回明显答案的粗鲁程度。 mapshow专门用于使用 MapCellsReference格式的图像: boston.tif图像就是这样一个图像。 然而,您的图片使用 GeographicCellsReference格式。前者使用 mapshow,后者使用 geoshow; geoshow将失败 boston.tif,以相同的方式 mapshow失败 Singapore.tif。应该很明显,你的图像是一个“地理”变体,因为你的行 geoshow(Singapore(:,:,1:3), R)工作没有发生错误。因此,使用 mapshow的建议不是您的问题的正确答案,并且具有误导性。更何况,与你的实际问题完全不相干的是,为什么 print命令不能从它的图形句柄中产生预期的结果,理论上这应该与这个数字如何生成无关。我不会有任何关于撤回你的“接受”标记的疑虑。不仅仅是因为这个网站可以作为许多其他观众的参考。仅仅因为你被欺负接受错误的答案而引导用户是没有意义的。

+1

如果“手动”方法也不起作用,那么问题几乎可以肯定与你的安装/ png库有关。那么'jpg'或'pdf'驱动程序怎么样? –

+1

你说得对。我可以将它保存在.pdf和.tiff中,并且它可以很好地工作。大! – emax

0

正如mathworks建议的那样,使用mapshow应该可以解决您的问题。对我来说,以下工作:

[boston, R] = geotiffread('boston.tif'); 
figure 
mapshow(boston, R); 
axis image off 
S = size(boston); 
matrix=rand(S(1),S(2)); 
hold on 
mapshow(matrix, R,'DisplayType','texturemap','facealpha',0.2); 
print(gcf, '-dpng','test.png') ; 

enter image description here

+0

导入图像时出现错误,如地图显示。然而这里的图像的链接。 https://www.dropbox.com/s/55o13cmyzf206uo/Singapore.tif?dl=0 – emax

+0

我的答案显然是在MATLAB提供的标准图像上工作。现在你正在问一个以前没有包括的新问题。你应该为此提出另一个问题。对我来说,它看起来像你的图像有不同的光栅结构。请记住,收回已接受的答案是一种非常糟糕的做法。祝你好运解决它在别的地方。 – NKN

+0

你说得对。即使它不能解决我的问题,但我接受了你的答案,但另一个答案。 – emax