2011-10-29 6 views
6

Ho alcune particelle che ho identificato in un'immagine più grande e ho bisogno di analizzare immagini più piccole per ogni particella. Ho usato la funzione BoundingBox di regionprops, ma non ho ancora avuto successo. Come posso ora creare una sottoimmagine rettangolare dell'immagine che utilizzo BoundingBox? Posso usare BoundingBox per disegnare un rettangolo sull'immagine originale, ma i parametri restituiti da BoundingBox sembrano non essere di dimensione pixel (x, y, larghezza, altezza), (x1, y1, x2, y2), ecc., Che io aspetterei che un riquadro di limitazione tornasse. Ho scritto del codice di esempio usando coins.png per renderlo più facile a chiunque. Puoi aiutarmi con questo? Grazie! .Come ottenere una sottoimmagine rettangolare da regionprops (Immagine, 'BoundingBox') in Matlab?

figure(1); 
I = imread('coins.png'); 
bw = im2bw(I, graythresh(I)); 
bw2 = imfill(bw,'holes'); 
imshow(bw2); 


figure(2); 
L = bwlabel(bw2); 
imshow(label2rgb(L, @jet, [.7 .7 .7])) 

figure(3); 
imshow(I); 
s = regionprops(L, 'BoundingBox'); 
rectangle('Position', s(1).BoundingBox); 

risposta

7

I parametri restituiti da regionprops sono [y,x,width,height] in matrice coordinate (vedi anche "unexpected Matlab"

Così, per estrarre il rettangolo, si scrive:

subImage = I(round(s(1).BoundingBox(2):s(1).BoundingBox(2)+s(1).BoundingBox(4)),... 
     round(s(1).BoundingBox(1):s(1).BoundingBox(1)+s(1).BoundingBox(3))); 
+1

Yup, ed è possibile ciclare su 's.NumObjects', l'iteratore sostituzione di Jonas'' 1'. –

12

Secondo la documentazione di REGIONPROPS:

BoundingBox è [ul_corner width], dove:

  • ul_corner: è in forma [x y z ...] e specifica l'angolo superiore sinistro del riquadro

  • larghezza: è in forma [x_width y_width ...] e specifica la larghezza del riquadro di delimitazione lungo ciascuna dimensione

Ora è possibile utilizzare IMCROP funzioni come imcrop(I, rect) dove:

rect è una posizione a quattro vettore elemento [xmin ymin width height] che specifica la dimensione e la posizione del rettangolo di ritaglio.

Così:

s = regionprops(L, 'BoundingBox'); 

subImage = imcrop(I, s(1).BoundingBox); 
imshow(subImage) 
+0

Non sapevo di questo uso di 'imcrop', è molto più leggibile di quello che indicizza direttamente l'immagine. FWIW, i documenti dicono che 'imcrop' arrotonda lo stesso di Jonas nella sua risposta. –

+0

@reve_etrange: è importante comprendere i diversi metodi per esprimere la posizione dell'immagine: http://www.mathworks.com/help/toolbox/images/brcu_al-1.html – Amro

+0

Il collegamento precedente è stato cambiato in: http: // www .mathworks.com/help/images/image-coordinate-systems.html. Anche Image Processing Toolbox ha introdotto nuove classi di riferimento spaziale: 'imref2d' e' imref3d' – Amro

Problemi correlati