如何将 Matlab warp 的表面图输出传递给 export_fig?

Posted

技术标签:

【中文标题】如何将 Matlab warp 的表面图输出传递给 export_fig?【英文标题】:How to pass surface map output of Matlab warp to export_fig? 【发布时间】:2016-10-12 15:38:26 【问题描述】:

Warp 对象位于极坐标中,我无法使用axes 分配,因此我无法将表面对象直接传递给export_fig生成图像的代码但我无法为export_fig 捕获它,如下所示,因为它没有句柄

clear all; close all; clc; 
img=imread('peppers.png'); 
% http://***.com/a/7586650/54964
[h,w,~] = size(img);
s = min(h,w)/2;
[rho,theta] = meshgrid(linspace(0,s-1,s), linspace(0,2*pi,s));
[x,y] = pol2cart(theta, rho);
z = zeros(size(x));
figure;
h=warp(x, y, z, img); 
view(2), axis square tight off

export_fig 接受图形和语法处理程序,但不接受表面图,因此我无法将 h 传递给函数

% https://github.com/altmany/export_fig
export_fig(figure_handle, filename);
export_fig(axes_handle, filename);

提案失败的示例代码

clear all; close all; clc; 

fp=figure();
hax_polar=axes(fp);

f_do_not_touch=figure('Name', 'Do not touch'); 

index=0;
I=imread('peppers.png'); 
while index < 7
    [x, y, z]=makePolar(I);
    h=warp(x, y, z, I);
    view(2), axis square tight off
    %
    [Ip, alpha] = export_fig('/home/masi/Images/masi', '-png', '-native', '-q101', '-a1', '-m1', '-RGB', '-nofontswap',  '-transparent', '-dpng', ...
        hax_polar);
    p=FastPeakFind(Ip); % https://se.mathworks.com/matlabcentral/fileexchange/37388-fast-2d-peak-finder
    imagesc(hax_polar, Ip); hold on
    plot(hax_polar, p(1:2:end),p(2:2:end),'r+')
    hold off
    index=index+1;
end

function [x, y, z]=makePolar(img)
% http://***.com/a/7586650/54964
[h,w,~] = size(img);
s = min(h,w)/2;
[rho,theta] = meshgrid(linspace(0,s-1,s), linspace(0,2*pi,s));
[x,y] = pol2cart(theta, rho);
z = zeros(size(x));
end

图。 1 输出图 Do not touch 获取内容并且主图由于隐式声明而中断

Matlab:2016a 操作系统:Debian 8.5 64 位

【问题讨论】:

请考虑添加minimal reproducible example。这意味着直接复制粘贴将运行代码。这很重要,因为您正在做非常具体的事情,我们不能只是猜测,我们可能会错过您的错误。 另外,export_fig 有什么关系?警告出现在surface 图像生成很棒。 figure_handlefilename 在您的代码中不存在,因此会出错。这就是我的意思。 这有关系吗?如果我这样做 figure_handle=figure; h=warp(x, y, z, img); view(2), axis square tight off; filename='whatevers.png' export_fig(figure_handle, filename); 它也有效 使用h_ax = get(h, 'Parent') 获取包含曲面的轴的句柄,然后将h_ax 传递给export_fig。 【参考方案1】:

如果我们解决了一些问题,我们会得到您所期望的。

    由于warp 不接受'Parent' 属性,您需要确保您希望它出现的axes 是当前坐标区。您可以使用 axes 函数强制执行此操作并将轴句柄传递给它。

    axes(hax_polar)
    h = warp(x, y, z, I);
    
    % Explicitly modify this axes
    view(hax_polar, 2)
    axis(hax_polar, 'square')
    axis(hax_polar, 'tight')
    axis(hax_polar, 'off')
    

    在调用imagescplot 时,使用'Parent' 属性值对而不是将父级指定为第一个输入会更清晰(并且跨系统工作更可靠)。

    imagesc(Ip, 'Parent', hax_polar);
    plot(p(1:2:end), p(2:2:end), 'r+', 'Parent', hax_polar);
    hold(hax_polar, 'off')
    

一旦我们解决了所有这些问题,我们就会得到看起来正确的图像

clear all; close all; clc;

fp=figure();
hax_polar=axes('Parent', fp);

f_do_not_touch=figure('Name', 'Do not touch');

index=0;
I=imread('peppers.png');
while index < 7
    [x, y, z]=makePolar(I);

    axes(hax_polar)

    h=warp(x, y, z, I);

    % Different
    view(hax_polar, 2);
    axis(hax_polar, 'square')
    axis(hax_polar, 'tight')
    axis(hax_polar, 'off')
    %
    [Ip, alpha] = export_fig('test.png', '-png', '-native', '-q101', '-a1', '-m1', '-RGB', '-nofontswap',  '-transparent', '-dpng', ...
        hax_polar);
    p=FastPeakFind(Ip); % https://se.mathworks.com/matlabcentral/fileexchange/37388-fast-2d-peak-finder
    imagesc(Ip, 'Parent', hax_polar); hold on
    plot(p(1:2:end),p(2:2:end),'r+', 'Parent', hax_polar)
    hold(hax_polar, 'off')
    index=index+1;
end

function [x, y, z]=makePolar(img)
% http://***.com/a/7586650/54964
[h,w,~] = size(img);
s = min(h,w)/2;
[rho,theta] = meshgrid(linspace(0,s-1,s), linspace(0,2*pi,s));
[x,y] = pol2cart(theta, rho);
z = zeros(size(x));

【讨论】:

@Masi 我不确定您所说的“断言声明”是什么意思。但是,如果您希望您的代码适用于所有版本,那么这样做很重要并且它很好、明确并且更容易理解正在发生的事情。 @Masi 没有。只需阅读有关何时可以/不能使用它的文档。 @Masi 所以看起来在较新的版本上你不需要需要'Parent' 属性值,所以我稍微修改了我的答案。新的第一点确实是您的问题的原因

以上是关于如何将 Matlab warp 的表面图输出传递给 export_fig?的主要内容,如果未能解决你的问题,请参考以下文章

如何将身份验证令牌传递给端点?

如何将文件路径从 asp.net matlab ne builder dll 工具传递给 Matlab 函数

在 Matlab 中插值 3D 圆柱的表面

图像变换DIBR-3D图像变换(3D Image Warping)matlab源码

Matlab:图像拼接和混合

Scenekit 如何在地球/球体周围弯曲/扭曲/弯曲瓷砖