如何在Matlab极坐标轴上链接数据图像?

3

我正在尝试在极坐标轴上链接数据图像,这在 linkdata 文档的此处中对于笛卡尔坐标系的plot/area/...有很好的描述。 第一部分的代码根据 alpha 值制作了两个图像。 第二部分循环并在极坐标轴上绘制这些图像。 在第一次迭代后,linkdata on 激活,但我收到了通知,该通知没有像图1中那样提供 Fix it 选项。 我认为 bug 在于我无法明确定义 linkdata 的数据源为图像,参见 Attempt 1。 代码:

close all; clear all; clc;
af = figure('Name', 'Do Not Touch');
%% Data generation
f = figure;
hax = axes(f);
rgb = 'peppers.png';
% http://blogs.mathworks.com/steve/2009/02/18/image-overlay-using-transparency/
rgb = imread('peppers.png');
I = rgb2gray(rgb);
h = imagesc(I, 'Parent', hax);
[M,N] = size(I);
block_size = 50;
P = ceil(M / block_size);
Q = ceil(N / block_size);
alpha_data = checkerboard(block_size, P, Q) > 0;
alpha_data = alpha_data(1:M, 1:N);
set(h, 'AlphaData', alpha_data.^2);
zeroFigureDecorations(hax); 
images{1} = getframe(hax);

[M,N] = size(I);
block_size = 50*2;
P = ceil(M / block_size);
Q = ceil(N / block_size);
alpha_data = checkerboard(block_size, P, Q) > 0;
alpha_data = alpha_data(1:M, 1:N);
set(h, 'AlphaData', alpha_data.^2);
images{2} = getframe(hax);

close all;
clearvars -except images;     

%% Polar
% http://stackoverflow.com/a/40063951/54964
fp=figure('Name', 'Test', ...
    'Position',[200 200 851 404],'Resize','off'); % only half circle on polaraxes although warp can do eclipses
ThetaTicks = 0*pi:pi/10:1*pi;
pax = polaraxes( 'ThetaAxisUnits', 'radians', ...
    'ThetaLim',[min(ThetaTicks) max(ThetaTicks)],...
    'Color','none',...
    'GridAlpha',1,...
    'GridColor',[1 1 1],...
    'ThetaTick', ThetaTicks, ...
    'ThetaDir', 'counterclockwise', ...
    'Parent', fp);
imax = axes('Parent', fp, 'Visible', 'off');
zeroFigureDecorations(imax); 

for image=images
    h = imagesc(image{1}.cdata, 'Parent', imax); 

    zeroFigureDecorations(imax); 

    linkdata on; 

    angleRadians=-pi;
    I = getframe(pax);
    I = I.cdata;
    [x, y, z]=makePolar(I, angleRadians);
    imax.Children = warp(x, y, z, I);
    set(imax,'view',[-180 -90],'Visible','off');
    axis(imax,'tight')
    pause(0.5);
end

function zeroFigureDecorations(ax)
axis(ax, 'tight');
set(ax, 'yTickLabel', []);
set(ax, 'xTickLabel', []);
set(ax, 'Ticklength', [0 0]); % https://dev59.com/jmUp5IYBdhLWcg3wF0dq#15529630
colormap(ax, gray(1024));
box(ax, 'off');
axis(ax, 'off');
end

图1. 单个图像在极轴上正确显示,这里是第二次迭代后;顶部栏显示了失败的linkdata尝试,并且没有像通常一样提供Fix it选项。

enter image description here

尝试1

显式设置guihandlesdatasources,但可能没有效果,因为没有在图像上作为数据源明确应用linkdata

...
myhandles = guihandles(fp); 
for image=images
    h = imagesc(image{1}.cdata, 'Parent', imax); 
    myhandles.output = h; 
    myhandles.yData = []; 
    myhandles.xData = []; 
    set(get(myhandles.xData, 'Children'), 'XDataSource', myhandles.xData);  
    set(get(myhandles.yData, 'Children'), 'YDataSource', myhandles.yData);  
    ...
end

MathWorks 联系方式

MATLAB 反馈论坛回答:

简短的回答是 polaraxes 支持数据链接,但是看起来您正在使用 warp,它创建了一种不支持数据链接的表面对象。有一些解决方法,例如您可以修改 warp.m 文件,使用 surf 而不是 surface。

我正在处理有关此主题的服务请求。

MATLAB:2016b
操作系统:Debian 8.5
MathWorks 服务请求号:#02229120


@AnderBiguri 请查看linkdata的文档。极坐标展示应该与笛卡尔坐标类似。 - Léo Léopold Hertz 준영
如果您发布先前版本MATLAB的替代代码,我可能能够提供帮助,但由于版本问题,我无法运行该代码。 - Ander Biguri
@AnderBiguri,你的MATLAB版本是什么? - Léo Léopold Hertz 준영
2014b。基本上在2016b之前的版本不支持您处理轴并将其传递给函数的方式(例如,Parent, hax)。 - Ander Biguri
不是说你必须改变它,只是如果你这样做,我可能能够提供帮助,没有压力! - Ander Biguri
1个回答

0

MATLAB支持答案是当前的答案,因为没有关于修复的开发计划。

简短的回答是polaraxes支持数据链接,但看起来您正在使用warp,它创建了一种不支持数据链接的表面对象类型。有解决方法,例如您可以修改warp.m文件以使用surf而不是surface。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接