MATLAB:如何使用faceAlpha保存地理图形?

时间:2016-08-26 20:49:32

标签: matlab plot alpha figure

我想在Matlab R2014a中保存一个图形,我想在图像上绘制数据。这是代码:

[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

2 个答案:

答案 0 :(得分: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');

<小时/> 作为奖励,这里是你如何在Octave中执行同样的事情,如果你感兴趣的话(我发现Octave的印刷图看起来更好,特别是在字体方面!):

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的{​​{1}}失败,boston.tif mapshow失败的方式与Singapore.tif相同。显而易见,您的图像是“Geo”变体,因为您的行geoshow(Singapore(:,:,1:3), R)在没有抛出错误的情况下工作。因此,使用mapshow的建议不是您问题的正确答案,并且具有误导性。更不用说它与你的实际问题完全无关,因为print命令不能从它的数字句柄产生预期的结果,理论上它应该与数字的生成方式无关。我毫不犹豫地从中撤回你的“接受”标记。尤其是因为该网站可以作为许多其他观众的参考;仅仅因为你被欺负接受它而引导用户找错了答案是没有意义的。

答案 1 :(得分: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