2017-05-30 6 views
-1

私はオブジェクトの角を探したい。どのようにmatlabで回転オブジェクトの角を見つけるには?

Vstats = regionprops(BW2,'Centroid','MajorAxisLength','MinorAxisLength',... 
    'Orientation'); 
u = [Vstats.Centroid]; 
VcX = u(1:2:end); 
VcY = u(2:2:end); 

[VcY id] = sort(VcY); % sorting regions by vertical position 
VcX = VcX(id); 
Vstats = Vstats(id); % permute according sort 
Bv = Bv(id); 

Vori = [Vstats.Orientation]; 
VRmaj = [Vstats.MajorAxisLength]/2; 
VRmin = [Vstats.MinorAxisLength]/2; 

% find corners of vertebrae 
figure,imshow(BW2) 
hold on 
% C = corner(VER); 
% plot(C(:,1), C(:,2), 'or'); 

C = cell(size(Bv)); 
Anterior = zeros(2*length(C),2); 
Posterior = zeros(2*length(C),2); 
for i = 1:length(C) % for each region 
    cx = VcX(i); % centroid coordinates 
    cy = VcY(i); 
    bx = Bv{i}(:,2); % edge points coordinates 
    by = Bv{i}(:,1); 
    ux = bx-cx; % move to the origin 
    uy = by-cy; 
    [t, r] = cart2pol(ux,uy); % translate in polar coodinates 
    t = t - deg2rad(Vori(i)); % unrotate 
    for k = 1:4 % find corners (look each quadrant) 
     fi = t((t>=(k-3)*pi/2) & (t<=(k-2)*pi/2)); 
     ri = r((t>=(k-3)*pi/2) & (t<=(k-2)*pi/2)); 
     [rp, ip] = max(ri); % find farthest point  
     tc(k) = fi(ip); % save coordinates 
     rc(k) = rp; 
    end 
    [xc,yc] = pol2cart(tc+1*deg2rad(Vori(i)) ,rc); % de-rotate, translate in cartesian 
    C{i}(:,1) = xc + cx; % return to previous place 
    C{i}(:,2) = yc + cy; 
    plot(C{i}([1,4],1),C{i}([1,4],2),'or',C{i}([2,3],1),C{i}([2,3],2),'og') 

    % save coordinates : 
    Anterior([2*i-1,2*i],:) = [C{i}([1,4],1), C{i}([1,4],2)]; 
    Posterior([2*i-1,2*i],:) = [C{i}([2,3],1), C{i}([2,3],2)]; 
end 

マイ入力画像がある: 私は、次のコード試み enter image description here

をIは、画像内の一番下のオブジェクトが正しく検出されない場合、次の出力画像 enter image description here

を得ました。コードを修正するにはどうすればよいですか?回転した画像では機能しません。

+0

matlabの内蔵コーナー検出器を使ってみましたか? ['detectHarrisFeatures'](https://www.mathworks.com/help/vision/ref/detectharrisfeatures.html)? – kedarps

+0

私はそれを使用する方法を知らない – user1234

+0

回答者がデモンストレーションコードのために使用できるように元の画像を投稿することはできますか? – Wolfie

答えて

0

イメージからすべてのポイントを取得し、kmeansクラスタリングを使用してポイントを8つのグループに分割します。パーティションが完成したら、あなたはポイントを持っています。あなたはポイントをあなたが望むものから選ぶことができます。

rgbImage = imread('your image') ; 
    %% crop out the unwanted white background from the image 
    grayImage = min(rgbImage, [], 3); 
    binaryImage = grayImage < 200; 
    binaryImage = bwareafilt(binaryImage, 1); 
    [rows, columns] = find(binaryImage); 
    row1 = min(rows); 
    row2 = max(rows); 
    col1 = min(columns); 
    col2 = max(columns); 
    % Crop 
    croppedImage = rgbImage(row1:row2, col1:col2, :); 
    I = rgb2gray(croppedImage) ; 
    %% Get the white regions 
    [y,x,val] = find(I) ; 
    %5 use kmeans clustering 
    [idx,C] = kmeans([x,y],8) ; 
    %% 
    figure 
    imshow(I) ; 
hold on 
for i = 1:8 
    xi = x(idx==i) ; yi = y(idx==i) ; 
    id1=convhull(xi,yi) ; 
    coor = [xi(id1) yi(id1)] ; 
    [id,c] = kmeans(coor,4) ;  

    plot(coor(:,1),coor(:,2),'r','linewidth',3) ; 
    plot(c(:,1),c(:,2),'*b') 
end 

enter image description here

enter image description here

今、私たちはregions..the境界/凸包ポイントをキャプチャすることができます手にしています。あなたは、あなたがポイントで望む数学を何でもすることができます。

+0

私は四隅を探したい。あなたのコードはそれを与えません – user1234

+0

私の出力イメージをチェックできますか?私はオブジェクトの四隅が必要です – user1234

+0

異なるrun.yのための別の答え??? – user1234

関連する問題