【问题标题】:MATLAB: how to save a geoshow figure with faceAlpha?MATLAB:如何使用 faceAlpha 保存 geoshow 图形?
【发布时间】:2016-08-26 20:49:32
【问题描述】:

我正在尝试在 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])

这是完美的情节:

当我打印图形时

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

图像是全白的

【问题讨论】:

  • FaceAlpha = 1 会发生什么?
  • 我有同样的输出
  • 如果您有原始图像的链接以便我们可以重现问题,这将是 很多更容易提供帮助
  • @TasosPapastylianou 这里是图片的链接。 dropbox.com/s/55o13cmyzf206uo/Singapore.tif?dl=0

标签: matlab plot alpha figure


【解决方案1】:

非常感谢图片链接! 我已经尝试过您的代码(适用于您提供的“Singapore.tif”文件和适当的输出文件),它在我的系统(Matlab 2013b,Linux 64 位)上按预期工作。这是输出文件:

所以很抱歉,您的代码没有任何问题,这可能与 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');


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

【讨论】:

  • 如果“手动”方法也不起作用,那么问题几乎肯定出在您的安装/png 库上。 'jpg' 或 'pdf' 驱动程序呢?
  • 你是对的。我可以将它保存在 .pdf 和 .tiff 中,并且效果很好。太棒了!
【解决方案2】:

根据 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') ;

【讨论】:

  • 将图像导入为 mapshow 时出错。但是这里是图像的链接。 dropbox.com/s/55o13cmyzf206uo/Singapore.tif?dl=0
  • 我的答案显然是使用 MATLAB 提供的标准图像。现在您要问一个以前未包含的新问题。你应该为此问另一个问题。在我看来,您的图像具有不同的光栅结构。请记住,收回已接受的答案是一种非常糟糕的做法。祝你好运在其他地方解决它。
  • 你是对的。我接受了你的回答,即使它没有解决我的问题而是另一个问题。
猜你喜欢
  • 1970-01-01
  • 2021-11-27
  • 2013-04-05
  • 2015-12-23
  • 2012-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多