【问题标题】:Plot overlaps in matlab在matlab中绘制重叠
【发布时间】:2010-05-19 19:08:32
【问题描述】:

我有一个奇怪的问题,绘图在图表中重叠,但不在同一轴上的图像中。

我确定我没有在某个地方留下保留,否则它也会在图像本身中重叠。

编辑:我想去掉蓝色的重叠线,我只想在那张照片中出现一条蓝色的线。

这是一个示例:

(注意:黑色图像是 RGB 图像,但我没有绘制那个 atm,所以它意味着在图表上从黑色到白色的过渡。)

alt text http://img541.imageshack.us/img541/3212/parabolaaaaa.png

部分代码:

   for K=1:23

    hold on
    I = fig.img.(['p' num2str(K)]);
    bw=(I);
    imshow(bw)

    ss = bwlabel(bw);
    s = regionprops(ss,'centroid');


    centroids{K} = cat(1,s.Centroid);
    hold(imgca,'on')
    plot(imgca,centroids{K}(:,1), centroids{K}(:,2), 'r*'); hold on;
    x=centroids{K}(:,1);
    y=centroids{K}(:,2);
    points=plot(x,y,'go',x,y,'rx');

    hold on
    axis on
    axis fill
    ccentroids = cat(1,centroids{:});
    C1=ccentroids(:,1);
    C2=ccentroids(:,2);
    set(points,'XData',C1,'YData',C2);

    .
    .  
    .

    p= polyfit(x2,y2,2)
    parabola_x = linspace(-250,640,500);
    parabola_polyval = polyval(p,parabola_x);
    plot(parabola_x,parabola_polyval,'b-');
    .
    .  
    .
    end

有什么想法吗?

【问题讨论】:

  • 你按什么顺序调用你的地块?
  • @ZaZu - 你能发布一些产生这个的示例代码吗?
  • @ZaZu - 你画的是线条,然后是图像,然后是点吗?如果您的图像上已经有一条蓝线,那么这可以解释为什么其余的线会消失在它后面。尝试将图像放在轴上,然后绘制其他所有内容。这是我最好的猜测。
  • 哦不,不,我想摆脱重叠的线,我只想要一条线(那条线在每个点之后移动),因为它移动它与它之前的一条重叠..我不想要那个
  • 我不明白这条蓝线(和其他蓝线)来自哪里?您可能需要展示更多代码。

标签: matlab plot overlap


【解决方案1】:

你有多条蓝线的原因是因为你用这条线为每次通过循环绘制一条:

plot(parabola_x,parabola_polyval,'b-');

事实上,您在循环中一遍又一遍地绘制所有内容(图像、点和线),而没有清除旧的。

您应该在 for 循环的外部初始化绘图对象,并使用SET 命令在循环内更新它们,而不是仅仅重新绘制它们。我在this answer 中给出了一个例子,你之前问的一个问题是我在哪里讨论使用句柄来绘制对象来修改它们。对于您在此处提供的示例代码,您可以执行以下操作:

hImage = imshow(bw(fig.img.p1));  %# Initialize the image
hold on;                          %# Add to the existing plot
hStar = plot(nan,nan,'r*');       %# Initialize the red star
hPoints = plot(nan,nan,'go',...   %# Initialize the other points
               nan,nan,'rx');
hLine = plot(nan,nan,'b-');       %# Initialize the blue line

for K = 1:23

  I = fig.img.(['p' num2str(K)]);
  bw = (I);
  set(hImage,'CData',bw);  %# Update the image

  ss = bwlabel(bw);
  s = regionprops(ss,'centroid');
  centroids{K} = cat(1,s.Centroid);
  set(hStar,'XData',centroids{K}(:,1),...  %# Update the red star
            'YData',centroids{K}(:,2));
  ccentroids = cat(1,centroids{:});
  C1 = ccentroids(:,1);
  C2 = ccentroids(:,2);
  set(hPoints,'XData',C1,'YData',C2);  %# Update the other points

  ...

  p = polyfit(x2,y2,2);
  parabola_x = linspace(-250,640,500);
  parabola_polyval = polyval(p,parabola_x);
  set(hLine,'XData',parabola_x,...      %# Update the blue line
            'YData',parabola_polyval);

  ...

end

【讨论】:

  • 有没有一种方法可以初始化它而不首先绘制它? polyval 中的值不断变化,所以我需要确保在第二个循环开始之前不会真正查看绘图
  • @ZaZu:我用一个如何先初始化事物的示例更新了我的答案。为了初始化一个我一开始不想显示的绘图对象,我通常只设置 x 和 y 值NaN,它仍然会创建对象供您稍后更新,但它不会在图片。
  • 非常感谢您的回复,是的,我忘记保存带有设置的版本,但我什至没有想到重叠的行可能来自那个...感谢添加gnovice,我已经更新了我的设置行,它现在可以工作了...问题是它现在出现在 bw 图像下...为什么会这样?
  • @ZaZu:我不知道为什么会这样,但您可以尝试将其添加到 SET 的输入参数中以更新行:,'ZData',ones(size(parabola_x))
  • @ZaZu:它创建了一个与parabola_x 相同大小的向量,填充了一个,然后将其设置为线的 z 数据,使其比图像高一点(位于z 高度为 0)。
猜你喜欢
  • 2010-12-17
  • 1970-01-01
  • 1970-01-01
  • 2012-01-16
  • 2015-06-10
  • 1970-01-01
  • 1970-01-01
  • 2013-07-19
  • 1970-01-01
相关资源
最近更新 更多