2017-05-30 2 views
-1

Ich möchte die Ecken von Objekten finden. Ich habe versucht, den folgenden Code:Wie finde ich die Ecken eines gedrehten Objekts in 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 

Mein Eingangsbild: enter image description here

bekam ich die folgende Ausgabe Bild enter image description here

Die unterste Objekt im Bild nicht richtig erkannt wird. Wie kann ich den Code korrigieren? Es funktioniert nicht für ein gedrehtes Bild.

+0

Haben Sie versucht, den eingebauten Melder von Matlab zu verwenden: ['detectHarrisFeatures'] (https://www.mathworks.com/help/vision/ref/detectharrisfeatures.html)? – kedarps

+0

Ich weiß nicht, wie man es benutzt – user1234

+0

Können Sie das Originalbild auch so posten, dass jeder Beantworter es für ihren Vorführcode benutzen kann? – Wolfie

Antwort

0

Sie können alle Punkte aus dem Bild erhalten und kmeans Clustering verwenden und die Punkte in 8 Gruppen partitionieren. Sobald die Partition fertig ist, haben Sie die Punkte in und und Sie können auswählen, was immer Sie wollen.

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

Jetzt sind wir in der Lage, die regions..the Grenze/konvexe Hülle Punkte sind in der Hand zu erfassen. Sie können mit den Punkten alles tun, was Sie wollen.

+0

Ich möchte die vier Ecken finden. Ihr Code gibt es nicht – user1234

+0

können Sie mein Ausgabebild überprüfen. Ich brauche vier Ecken von Objekten – user1234

+0

Unterschiedliche Antwort für verschiedene run.y so ??? – user1234

Verwandte Themen