2011-10-11 71 views
2

我有一個圖像充滿了橢圓形狀的對象。我需要爲每個物體設計一個最適合物體本身的橢圓。我找到了一段代碼,可以幫助我在圖像here上繪製橢圓。使用座標軸生成圖像而不繪製它,在Matlab中

我已經改變了最後一部分在3D矩陣(對於x一個維度,其他爲y,和對象的數量的第三)保存xy。由於此代碼位於for循環中,因此我不想在其上生成圖形省略號,將其保存並上傳至imread以將其傳遞給代碼的其餘部分。

有沒有辦法將bw圖像中的這個3D矩陣轉換成完整的圖像中正確位置的擬合橢圓?

回答

1

由於在使用imshow顯示圖像後顯示hold on語句,因此在現有圖的頂部繪製了省略號。所以,取而代之的是:

imshow(bw) 
hold on 

只需使用figure語句創建一個新的人物:

figure 

[編輯]

好吧,首先,只存儲(x, y)給你只有橢圓中心。要繪製橢圓,還需要存儲其主軸/副軸尺寸(a,b)及其方向角(theta)。

我會簡單地重用你已經有循環,但用BW圖像像素的簡單設置爲1更換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

非常感謝!但我實際上想消除圖和imshow(順便說一句,在我的代碼中我使用figure(); imagesc(bw),而不是imshow,這不是我的問題)。我所擁有的是bw是一個1024x1392的矩陣,我的情況是每個元素都是一個像素。我從web上獲取的代碼實際上是生成兩個數組:x和y,長度爲50個元素(每個元素值是橢圓座標)。我怎樣才能將這些信息以軸座標傳遞給bw矩陣?我的最終目標是執行我提到的代碼,跳過繪圖部分,然後將橢圓添加到bw圖像 – user990253

+0

@ user990253:好的,現在我明白了。我用一個例子更新了代碼。 – Groo

+0

非常感謝!這是一個很大的改進,但仍然在路上!我實際上需要橢圓周長是一條線,因爲我的代碼中的下一步是填充周邊!順便說一下,我用dim(1)來表示x和y,以便重疊原始圖形對象和生成的橢圓。由於超出範圍的錯誤,我在原始圖像中丟失了很多對象! – user990253

相關問題