gpt4 book ai didi

matlab - 用图像替换箭袋箭头

转载 作者:太空宇宙 更新时间:2023-11-03 19:18:02 25 4
gpt4 key购买 nike

我有一个圆形晶格,在晶格位置上我绘制了归一化箭头,这些箭头保持相同的大小并根据模拟改变方向,细节无关紧要。

我的情节是这样的

enter image description here

是否可以用 jpg/bmp/gif/png 图像替换箭袋图中的箭头?或通过任何其他命令?

理想情况下,它看起来像这样(虽然不一定是箭头)

enter image description here

最佳答案

说明

您可以执行此操作的一种方法是使用 surface objecttexture-map as the FaceColor .

在 MATLAB 中,您可以创建一个简单的矩形曲面。您可以设置 FaceColor成为 texturemap 这将导致分配给 CData 的值被映射到整个表面。

然后为了获得透明度,您还可以设置 FaceAlpha值为 texturemap 并设置 AlphaData并且这些透明度值也将映射到整个表面范围。

为了将此应用于您的案例,您需要将 CData 设置为要用于替换箭头的图像。您将希望 AlphaData 与图像数据大小相同,值为 1 表示不透明,值为 0 表示透明。这将使它看起来不像您发布的图像,您可以清楚地看到边界框。然后,您需要绘制这些表面之一,每个箭头都将指向这些表面,并适本地缩放/定位它。

实现

更新:此代码 (ImageQuiver) 的更完善版本现已在 Github 上可用。以及 MATLAB File Exchange .

为了演示我正在谈论的内容,我创建了以下函数,它基本上就是这样做的。它接受与 quiver 相同的输入(首先提供图像数据,最后提供可选的 AlphaData 参数)并在所有请求的坐标处创建一个表面请求的方向,并按指定的量缩放。

function h = quiverpic(im, X, Y, dX, dY, scale, alpha)
% im - RGB or indexed image
% X - X positions
% Y - Y positions
% dX - X direction vector
% dY - Y direction vector
% scale - Any scaling (Default = 1)
% alpha - Transparency (same size as im), if not specified = ~isnan(im)

h = hggroup();

if ~exist('scale', 'var')
% By default there is no scaling
scale = 1;
end

if ~exist('alpha', 'var')
% By default, any NaN will be transparent
alpha = ~isnan(im);
end

% Determine aspect ratio of the source image
width_to_height = size(im, 2) / size(im, 1);

for k = 1:numel(X)
% Determine angle from displacement vectors
theta = atan2(dY(k), dX(k));

% Subtract pi/2 to +y is considered "up"
theta = theta + pi/2;

% Setup surface plot boundary
[xx,yy] = meshgrid([-0.5, 0.5] * width_to_height, [0 1]);

% Scale depending on magnitude of dX and dY
this_scale = scale * sqrt(dX(k).^2 + dY(k).^2);

% Scale X and Y components prior to rotating
xx = xx .* this_scale;
yy = yy .* this_scale;

% Rotate to align with the desired direction
xdata = xx .* cos(theta) - yy .* sin(theta);
ydata = xx .* sin(theta) + yy .* cos(theta);

% Determine what is considered the "anchor" of the graphic.
% For now this is assumed to be the "bottom-middle"
xoffset = X(k) - mean(xdata(2,:));
yoffset = Y(k) - mean(ydata(2,:));

% Actually plot the surface.
surf(xdata + xoffset, ...
ydata + yoffset, zeros(2), ...
'Parent', h, ...
'FaceColor', 'texture', ...
'EdgeColor', 'none', ...
'CData', im, ...
'FaceAlpha', 'texture', ...
'AlphaData', double(alpha));
end
end

例子

我写了一个小测试脚本来展示如何使用它并显示结果。

t = linspace(0, 2*pi, 13);
dX = cos(t(1:end-1));
dY = sin(t(1:end-1));
X = (3 * dX) + 5;
Y = (3 * dY) + 5;
scale = 1;

% Load the MATLAB logo as an example image
png = fullfile(matlabroot,'/toolbox/matlab/icons/matlabicon.gif');
[im, map] = imread(png);
im = ind2rgb(im, map);

% Determine alpha channel based on upper left hand corner pixel
flatim = reshape(im, [], 3);
alpha = ~ismember(flatim, squeeze(im(1,1,:)).', 'rows');
alpha = reshape(alpha, size(im(:,:,1)));

% Plot some things prior to creating the quiverpic object
fig = figure();
hax = axes('Parent', fig);
axis(hax, 'equal');

% Plot a full circle
t = linspace(0, 2*pi, 100);
plot((cos(t) * 3) + 5, (sin(t) * 3) + 5, '-')

hold(hax, 'on')

% Plot markers at all the quiver centers
plot(X, Y, 'o', 'MarkerFaceColor', 'w')

% Plot a random image behind everything to demonstrate transparency
him = imagesc(rand(9));
uistack(him, 'bottom')

axis(hax, 'equal')
colormap(fig, 'gray')
set(hax, 'clim', [-4 4]);

% Now plot the quiverpic
h = quiverpic(im, X, Y, dX, dY, 1, alpha);

axis(hax, 'tight')

结果

enter image description here

荒谬

具有不同矢量和缩放比例的相同图像

enter image description here

任何宽高比的图像都可以正常工作

enter image description here

关于matlab - 用图像替换箭袋箭头,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36067542/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com