2016-06-26 13 views
-3

Fehler: In einer Zuweisung A (I) = B muss die Anzahl der Elemente in B und I gleich sein.Fehler beim Berechnen des Schwerpunkts in Matlab

Fehler in ==> Test bei 22 Schwerpunkt (i) = k (i) .Centroid;

test.m

I=imread('1_1.jpg'); 
    I=rgb2gray(I); 
    I2 = Thresholding(I); 
    cc = bwconncomp(I2,8); 
    n = cc.NumObjects; 
    Area = zeros(n,1); 
    Centroid = zeros(n,1); 
    Perimeter = zeros(n,1); 
    MajorAxis = zeros(n,1); 
    MinorAxis = zeros(n,1); 
    k = regionprops(cc, 'Area','Centroid','Perimeter','MajorAxisLength', 'MinorAxisLength'); 
    for i=1:n 
    Area(i) = k(i).Area; 
    Centroid(i)=k(i).Centroid; 
    Perimeter(i) = k(i).Perimeter; 
    MajorAxis(i) = k(i).MajorAxisLength(i); 
    MinorAxis(i) = k(i).MinorAxisLength(i); 
    end 
    handdata(1,1) = mean(Area); 
    handdata(2,1) = mean(Centroid); 
    handdata(3,1) = mean(Perimeter); 
    handdata(4,1) = mean(MajorAxis); 
    handdata(5,1) = mean(MinorAxis); 

Thresholding.m

function im = Thresholding(I); 
[r,c] = size(I); 
im = zeros(r,c); 
for i=1:r 
    for j=1:c 
     if I(i,j)>105 
      im(i,j)=1; 
     end 
    end 
end 
im = bwareaopen(im,5); 
im = imfill(im, 'holes'); 
end 

Antwort

0

Lösung

das Zentroid-Feld ist ein Vektor der Größe 1x2 (für die Y-Halten und x Koordinaten). Daher müssen Sie Ihren Code entsprechend ändern:

Außerhalb der for-Schleife:

Centroid = zeros(n,2); %The centroids array should be nx2, to contain both x and y positions 

Innerhalb der for-Schleife:

Centroid(i,:)=k(i).Centroid; %fill the corresponded i'th row 
MajorAxis(i) = k(i).MajorAxisLength; %remove the coordinate from MajorAxisLength and MinorAxisLength fields 
MinorAxis(i) = k(i).MinorAxisLength; 

Aus diesem Grund müssen Sie auch Ändern der folgenden Codezeile, da Mittelwert (Centroid) ein Vektor der Größe 1x2 ist. handdata wird ein Vektor von 4x1 sein, und das Schwerpunktmittel wird in eine andere Variable, centroidData genannt, gesetzt.

handdata(1,1) = mean(Area); 
handdata(2,1) = mean(Perimeter); 
handdata(3,1) = mean(MajorAxis); 
handdata(4,1) = mean(MinorAxis); 
centroidData = mean(Centroid); 

Zwei weitere Vorschläge

1.In der Thresholding-Funktion, anstatt Doppel der Verwendung von for-Schleife können Sie einfach schreiben

im = I > 105; 

2.in Haupt for-Schleife (in das Hauptskript) use ii instead of i als Variablenname für Ihren Zähler.

+0

Ich sollte handdata (2,1) = Mittelwert (Centroid) in => ?? –

+0

sehe meine aktualisierte Antwort – drorco

+0

Es scheint kein Fehler. Aber es gibt mir auch keine Antwort. Der ausgegebene Wert ist NaN. Wie kann ich es lösen? –