2011-10-29 15 views
6

Tengo algunas partículas que identifiqué en una imagen más grande, y necesito analizar imágenes más pequeñas para cada partícula. He utilizado la función 'BoundingBox' de regionprops, pero aún no he tenido éxito. ¿Cómo puedo hacer ahora una subimagen rectangular de la imagen I usando BoundingBox? Puedo usar BoundingBox para dibujar un rectángulo en la imagen original, pero los parámetros devueltos por BoundingBox parecen no ser de dimensión de píxel (x, y, ancho, alto), (x1, y1, x2, y2), etc. esperaría que volviera un cuadro delimitador. He escrito un código de muestra con coins.png para que sea más fácil de entender para cualquiera. ¿Me puede ayudar con esto? ¡Gracias! .¿Cómo obtener una subimagen rectangular desde regionprops (Imagen, 'BoundingBox') en 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); 

Respuesta

7

Los parámetros devueltos por regionprops son [y,x,width,height] en matriz coordenadas (véase también "unexpected Matlab"

Por lo tanto, para extraer el rectángulo, se escribe:

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

Sí, y puede recorrer más de 's.NumObjects', el iterador reemplazando' 1' Jonas'. –

12

De acuerdo con la documentación de REGIONPROPS:

BoundingBox es [ul_corner width], donde:

  • ul_corner: está en forma [x y z ...] y especifica la esquina superior izquierda del cuadro delimitador

  • anchura: está en forma [x_width y_width ...] y especifica el ancho del cuadro delimitador a lo largo de cada dimensión

Ahora puede utilizar IMCROP funciona como imcrop(I, rect) donde:

rect es un vector de posición de cuatro elementos [xmin ymin width height] que especifica el tamaño y la posición del rectángulo de recorte.

Por lo tanto:

s = regionprops(L, 'BoundingBox'); 

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

No sabía acerca de este uso de 'imcrop', es mucho más legible que la indexación directa de la imagen. FWIW, los documentos dicen 'imcrop' rounds lo mismo que Jonas en su respuesta. –

+0

@reve_etrange: es importante comprender los diferentes métodos para expresar la ubicación de la imagen: http://www.mathworks.com/help/toolbox/images/brcu_al-1.html – Amro

+0

El enlace de arriba ha cambiado a: http: // www .mathworks.com/help/images/image-coordinate-systems.html. También Image Processing Toolbox introdujo nuevas clases de referencia espacial: 'imref2d' y' imref3d' – Amro

Cuestiones relacionadas