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
Hier ist ein follo w-up Frage: http://stackoverflow.com/questions/37558409/working-with-erosion-and-dilatation – Matt