2017-05-30 5 views
-1

Je veux trouver les coins des objets. J'ai essayé le code suivant:comment trouver les coins de l'objet tourné dans 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 

Mon image d'entrée est: enter image description here

Je suis l'image de sortie suivante enter image description here

L'objet plus basse dans l'image n'est pas détectée correctement. Comment puis-je corriger le code? Il ne fonctionne pas pour une image pivotée.

+0

Avez-vous essayé d'utiliser le détecteur de coin encastré de matlab: ['detectHarrisFeatures'] (https://www.mathworks.com/help/vision/ref/detectharrisfeatures.html)? – kedarps

+0

Je ne sais pas comment l'utiliser – user1234

+0

Pouvez-vous également poster l'image originale afin que les répondeurs puissent l'utiliser pour leur code de démonstration? – Wolfie

Répondre

0

Vous pouvez obtenir tous les points de l'image et utiliser kmeans en cluster et partitionner les points en 8 groupes. Une fois la partition terminée, vous avez les points et vous pouvez choisir les points que vous voulez.

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

Maintenant, nous sommes en mesure de saisir les points de la coque limite regions..the/convexes sont en cours. Vous pouvez faire ce que vous voulez avec les points.

+0

Je veux trouver les quatre coins. votre code ne le donne pas – user1234

+0

pouvez-vous vérifier mon image de sortie. J'ai besoin de quatre coins d'objets – user1234

+0

Réponse différente pour différents run.y donc ??? – user1234