Участок перекрывается в Matlab - PullRequest
1 голос
/ 19 мая 2010

У меня странная проблема, что график накладывается на график, а не на изображение на одной оси.

Я уверен, что я никуда не держался, иначе это будет накладываться и на само изображение.

РЕДАКТИРОВАТЬ : Я хочу избавиться от синих перекрывающихся линий, я хочу, чтобы на этой картинке присутствовала только одна синяя линия.

Вот пример:

(ПРИМЕЧАНИЕ. Черное изображение является изображением RGB, но я не отображал этот атм, поэтому на графике он должен быть переходом от черного к белому.)

альтернативный текст 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

Есть идеи?

1 Ответ

2 голосов
/ 19 мая 2010

Причина, по которой у вас несколько синих линий, заключается в том, что вы строите по одной для каждого прохода в цикле с линией:

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

На самом деле, вы строите все (изображения, точки и линии) снова и снова в цикле, не стирая старые.

Вместо этого вы должны инициализировать объекты графика вне вашего цикла for и использовать команду SET , чтобы обновить их внутри цикла, вместо того, чтобы просто реплотировать их. Я привел один пример этого в этом ответе на вопрос, который вы ранее задавали, где я обсуждаю использование ручек для построения объектов для их изменения. Для примера кода, который вы даете здесь, вы можете сделать что-то вроде этого:

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
...