2011-10-11 3 views
2

이미지에 타원 모양의 객체가 가득 찼습니다. 객체 자체에 가장 적합한 각 객체에 대한 타원을 디자인해야합니다. here 이미지에 타원을 그릴 때 도움이되는 코드를 찾았습니다.Matlab에서 플롯하지 않고 이미지를 생성하기 위해 축 좌표를 사용합니다.

나는 3 차원 매트릭스 (x에 대한 하나의 차원, y의 다른 물체의 수 3)에 xy 절약 마지막 부분을 변경했습니다. 이 코드는 for 루프에 있기 때문에 그 위에 그림 플롯 타원을 생성하고 저장하지 말고 imread으로 업로드하여 나머지 코드로 전달하고 싶지 않습니다.

이미지의 정확한 위치에 피팅 타원으로 가득 찬 bw 이미지에서이 3D 행렬을 변환 할 수있는 방법이 있습니까?

답변

1

imshow을 사용하여 이미지를 표시 한 후 hold on 문 때문에 줄임표가 기존 그림 위에 그려집니다. 그래서,이 대신 : 만 (x, y) 당신을 제공, 저장,

figure 

[편집]

가 좋아, 우선 :

imshow(bw) 
hold on 

단순히 figure 문을 사용하여 새 그림을 만들 타원 중심 만. 타원을 그리려면 majos/minor 축 크기 (a, b) 및 방향 각도 (theta)도 저장해야합니다.

간단히 말해서 나는 당신이 이미 가지고있는 루프를 다시 사용할 수 있지만, 단순히 1에 bw 이미지 픽셀을 설정하여 plot를 대체 할 각 좌표

% get image dimensions 
dim = size(bw); 

% preallocate a blank bw image 
target = false(dim); 

% for each ellipse 
for k = 1:length(s) 

    % this part remains the same: 
    xbar = s(k).Centroid(1); 
    ybar = s(k).Centroid(2); 

    a = s(k).MajorAxisLength/2; 
    b = s(k).MinorAxisLength/2; 

    theta = pi*s(k).Orientation/180; 
    R = [ cos(theta) sin(theta) 
     -sin(theta) cos(theta)]; 

    xy = [a*cosphi; b*sinphi]; 
    xy = R*xy; 

    x = xy(1,:) + xbar; 
    y = xy(2,:) + ybar; 

    % ---------- 
    % but replace plot(x,y) with this: 

    % limit to image dimensions (1:256) 
    x(x<1) = 1; x(x>dim(1))=dim(1); 
    y(y<1) = 1; y(y>dim(2))=dim(2);  

    % set those pixels to 1 
    target(sub2ind(dim, round(x),round(y))) = 1; 

end 

imshow(target); 

을 지금, 이미지 외부의 절반 타원가 경계. 그래서 x, y 좌표를 (1 : 256)으로 제한해야합니다. 그렇지 않으면 범위를 벗어난 오류가 발생합니다. 이 줄임표를 완전히 제거해야하는지 아니면 여기에서 수행 한대로 부분적으로 그려야하는지 다시 생각해 봐야합니다.

+0

고맙습니다. 그러나 실제로 figure와 imshow (btw, 내 코드에서 imshow 대신 figure(); imagesc (bw)를 사용하고 있으며 내 문제는 아닙니다)를 제거하고 싶습니다. 내가 가지고있는 것은 bw가 각 경우에 픽셀 인 1024x1392 행렬 인 경우입니다. 웹에서 가져온 코드는 실제로 두 개의 배열을 생성합니다. 50 개 요소 길이의 x와 y입니다 (각 요소 값은 타원 좌표입니다). 이 정보를 축 좌표로 bw 행렬에 전달하려면 어떻게해야합니까? 최종 목표는 내가 언급 한 코드가 무엇을하는지, 플롯 부분을 건너 뛰고 그냥 bw 이미지에 타원을 추가하는 것입니다. – user990253

+0

@ user990253 : 이제 알았습니다. 코드를 예제로 업데이트했습니다. – Groo

+0

대단히 감사합니다! 대단한 개선이지만 여전히 길을 걷고 있습니다! 내 코드의 다음 단계는 둘레를 채우는 것이기 때문에 실제로 타원 경계선이 필요합니다. BTW, 난 원래의 그림 개체와 생성 된 타원의 중첩을하기 위해, 모두 x와 y에 dim (1)을 사용했습니다. 범위를 벗어난 오류로 원본 이미지에서 많은 물체를 잃어 버렸습니다! – user990253