2016-04-21 12 views
0

Ich habe n Regionen von regionprops mit 'BoundingBox' und 'Image' Eigenschaften generiert. Ich speicherte die Daten ([x, y, Δx, Δy]) aus einer bestimmten Region (14 zum Beispiel) bb1, die ich mag arbeiten, aber zuerst muß ich den folgenden Code verstehen:Arbeiten mit einer bestimmten Region von BoundingBox generiert

bb1=floor(Ic(14,1).BoundingBox); 
I1bb1=I1(bb1(2):bb1(2)+bb1(4)-1 , bb1(1):bb1(1)+bb1(3)-1 ,:); 

Danach, auch ich will das verstehen nächster Code, der es aus dem gleichen Beispiel ist:

I2=I1bb1.*repmat( Ic(BB,1).Image , [1 1 3]); 

Wo Ic enthält n Regionen erzeugt durch BoundingBox

Antwort

0

Yo Sie haben eine 3D-Variable I1 (ich glaube, RGB-Bild) und Sie möchten die Boundingbox Ic(14,1).BoundingBox daraus zuschneiden. Das heißt, haben Sie ein kleineres 3D-Array, das den Pixeln innerhalb des Begrenzungsrahmens in Bild I1 entspricht. Um dies zu tun Beschneiden Sie diese Befehle haben:

bb1=floor(Ic(14,1).BoundingBox); 

Zuerst stellen Sie sicher, die Werte [x, y, w, h] des Begrenzungsrahmens ganze Zahlen sind und nicht Sub-Pixeln, so dass Sie diese Werte für die Indizierung verwenden können. Dann können Sie Index in I1 mit dem Begrenzungsrahmen:

I1bb1=I1(bb1(2):bb1(2)+bb1(4)-1 , bb1(1):bb1(1)+bb1(3)-1 ,:); 

Für die Reihen von I1bb1 nehmen Sie die Zeilen aus bb1(2) (y Wert) zu y+w-1 der bb1(2)+bb1(4)-1 ist. Gleiches gilt für die Spalten von x bis x+h-1.

Für die dritte Codezeile haben Sie die Eigenschaft Ic(14,1).Image. Diese Eigenschaft ist

Gibt ein Binärbild (logisch) der gleichen Größe wie die Bounding Box der Region zurück. Die Ein-Pixel entsprechen der Region und alle anderen Pixel sind Aus.

Jetzt wollen Sie I2 die gleiche Größe wie das Begrenzungsfeld sein, aber alle Pixel in der BoundingBox nicht zu dem Objekt gehören, werden auf [0 0 0] (alle RGB-Werte Null). So konvertieren Sie Ic(14,1).Image von 2D binärer Maske zu einer 3D-Maske über drei Kanäle:

repmat( Ic(BB,1).Image , [1 1 3]) 

Schließlich elementweise Sie den „aufgeblasenen“ Maske mit dem beschnittenen Bild multiplizieren I1bb1:

I2=I1bb1.*repmat( Ic(BB,1).Image , [1 1 3]); 

Sie können die gleichen Ergebnisse mit etwas besser lesbaren Code erreichen:

Ibb1 = imcrop(I1, bb1); %// crop a bounding box from image 
I2 = bsxfun(@times, Ibb1, Ic(14,1).Image); %// no need for repmat 
+0

Hier ist ein follo w-up Frage: http://stackoverflow.com/questions/37558409/working-with-erosion-and-dilatation – Matt

Verwandte Themen