【问题标题】:How to have an image in background of plot in matlab如何在matlab中的绘图背景中有图像
【发布时间】:2015-05-14 03:50:20
【问题描述】:

我有一个来自 3D 空间中的线网络的图,我也有一个来自对象的图像。现在我想将图像文件作为固定背景放在我的绘图背景中,然后网络应该绘制在该背景上。顺便说一句,由于网络在 3D 空间中,我可以轻松地旋转它,并且在我的组合图上旋转网络对我来说也很重要。

这是我编写的代码,但它单独显示了我的情节!如果我把 imshow 放在图中,那么图像将绘制在我的网络顶部,我只能看到我的网络的一个点。这是Network的链接和background的背景图片 这是我的代码:第一行绘制图像,其余代码绘制我的线网络:

Img1 = imshow('STP1.png');
figure('name','Distance');
hold on;
labels = cellstr( num2str([1:SIFT_Length]') );  
text(SIFT_3D(:,1), SIFT_3D(:,2),SIFT_3D(:,3),labels,'FontWeight','bold','FontSize', 12,...
 'VerticalAlignment','bottom','HorizontalAlignment','right')
title('Distances Network with colorized lines based on Uncertainty','FontWeight','bold');
hold on
for k = 1:Num_Line_SIFTS
       plot3([SIFT_3D(Line_among_2_Sifts(k,1),1),SIFT_3D(Line_among_2_Sifts(k,2),1)],...
       [SIFT_3D(Line_among_2_Sifts(k,1),2),SIFT_3D(Line_among_2_Sifts(k,2),2)],...
       [SIFT_3D(Line_among_2_Sifts(k,1),3),SIFT_3D(Line_among_2_Sifts(k,2),3)],...
       'o-','Color',[RGB_0_1(k,1) RGB_0_1(k,2) RGB_0_1(k,3)],'MarkerFaceColor',[RGB_0_1(k,1) RGB_0_1(k,2) RGB_0_1(k,3)],'MarkerEdgeColor',...
       'k', 'LineWidth',2)
 end
hold off;

请帮我解决这个问题。

【问题讨论】:

  • 您是否尝试过在hold on 命令之后和绘制其他任何内容之前使用imshow
  • 我也测试了你的建议。但它不起作用!所有的网络点都会被卡在一个点上!!正如我所说,只有网络应该是可旋转的,而背景应该是固定的!

标签: matlab plot background


【解决方案1】:

这个呢:

clear
clc
close all


%// Read image
Im=flipud(imread('STP1_low.png'));

%// Dummy surface to plot.
Z = peaks(25);

%// Prepare image position
shift = 20;
xIm=zeros(size(Z))-shift;

hold on
surface(xIm,Im,'FaceColor','texturemap','EdgeColor','none','CDataMapping','direct')
surface(Z,'FaceAlpha',0.8,'LineStyle','none','FaceColor','interp');
axis on
view(-35,45)

box on
rotate3d on

输出:

您可以旋转它,图像仍然作为背景。

【讨论】:

  • 当我尝试通过您给定的函数加载图像时 Im=flipud(imread('peppers.png')); Matlab 给了我这个错误:X 必须是二维矩阵。!我什至无法加载图像文件。你能看看我把它的链接放在我的问题中的背景图片,看看你能用你的代码加载它吗?
  • 是的,工作正常;我刚刚编辑了答案。您确定错误是由调用imread 产生的吗?
  • 嗯,这很奇怪。如果省略 flipud 会怎样?
【解决方案2】:

我不确定我是否理解您的需求,不过......

figure('name','Distance','unit','normalized');

a=axes('position',[0 0 1 1])
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% UPDATED CODE STARTS HERE
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% Disable zoom
h=zoom;
setAllowAxesZoom(h,a,false);
% Disable rotation
h = rotate3d;
setAllowAxesRotate(h,a,false) 
%
%%%%%%%%%%%%%%%%%%%%%%%%%%
% UPDATED CODE ENDS HERE
%%%%%%%%%%%%%%%%%%%%%%%%%%
%
hold on
imshow('Jupiter_New_Horizons.jpg','parent',a)

t=0:.01:2*pi;
z=sin(t).*cos(t)
a1=axes('position',[0.3 0.3 .5 .5])

plot3(cos(t),sin(t),z,'r','linewidth',3)
grid on
set(gca,'color','none')

此脚本生成以下图表:

希望这会有所帮助。

【讨论】:

  • 不错!我认为你说得对,我误解了这个问题哈哈 +1
  • 谢谢@Benoit_11。您的答案是第一位的,我应该在回答时刷新页面。关于问题的解释......好吧......让我们看看user3185893的想法:-)
  • @ il_raffa,这正是我需要的,但我认为我的网络和我的图像大小不一样,因为我的网络的所有点都卡在我的绘图窗口的左上角!我必须放大很多次才能看到我的网络,当我放大时,背景也会被放大。背景不应该是可缩放和可旋转的!!!但这里也可以缩放和旋转!你能告诉我如何固定背景并且只有顶层可旋转和缩放吗?
  • 背景图像链接到轴,这就是为什么当您放大绘图时背景图像也会被缩放。要禁用特定轴上的缩放,您可以使用函数setAllowAxesZoom。您可以在我在这里提供的答案中找到一个竞争示例:Remove zoom from GUI axes in Matlab
  • 我已更新脚本以禁用包含背景图像的轴上的缩放和旋转。希望这可以解决您的问题。
猜你喜欢
  • 1970-01-01
  • 2016-11-09
  • 1970-01-01
  • 2018-10-22
  • 2018-06-24
  • 2013-04-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多