如何在 Matlab 极轴上链接数据图像?
Posted
技术标签:
【中文标题】如何在 Matlab 极轴上链接数据图像?【英文标题】:How to linkdata images on Matlab polaraxes? 【发布时间】:2016-10-17 23:04:30 【问题描述】:我正在尝试在极轴上使用linkdata
图像,这在plot
/area
/... 中很好地描述为linkdata
文档here 中的笛卡尔。
第一段根据 alpha 值制作两个带有剪切的图像的代码。
第二段循环并在极轴上绘制这些图像。
第一次迭代后,linkdata on
激活,但我收到通知,它不提供 Fix it
选项,如图 1 所示。
我认为错误在于我无法将linkdata
的数据源明确定义为图像,请参阅尝试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);
images1 = 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);
images2 = getframe(hax);
close all;
clearvars -except images;
%% Polar
% http://***.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(image1.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]); % http://***.com/a/15529630/54964
colormap(ax, gray(1024));
box(ax, 'off');
axis(ax, 'off');
end
图。 1 单幅图像在极轴上是正确的,这里是在第二次迭代之后;顶部栏显示失败的linkdata
尝试,并且不像通常那样提供Fix it
选项
尝试 1
要显式设置guihandles
和datasources
但没有效果可能是因为没有在图像上显式应用linkdata
作为数据源
...
myhandles = guihandles(fp);
for image=images
h = imagesc(image1.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.m 文件 冲浪而不是表面。
我正在处理有关该主题的服务请求。
MATLAB:2016b 操作系统:Debian 8.5 MathWorks 服务请求:#02229120
【问题讨论】:
@AnderBiguri 请参阅链接数据的文档。极坐标表示应该与笛卡尔表示类似。 如果您还发布了以前版本的 MATLAB 的替代代码,我可以提供帮助,但由于版本问题,我无法运行该代码。 @AnderBiguri 您的 MATLAB 版本是多少? 2014b。基本上 2016b 之前的任何东西都不接受您处理轴并将它们传递给函数的方式(例如,Parent, hax
)
不是说你应该改,只是如果你改了我也许能帮上忙,没有压力!
【参考方案1】:
MATLAB 支持答案是当前的,因为没有关于修复的开发计划
简短的回答是 Polaraxes 确实支持数据链接,但是看起来您正在使用 warp,它正在创建一种不支持数据链接的表面对象。对此有一些解决方法,例如,您可以修改 warp.m 文件以使用 surf 而不是表面。
【讨论】:
以上是关于如何在 Matlab 极轴上链接数据图像?的主要内容,如果未能解决你的问题,请参考以下文章