2011-11-16 47 views
12

Recuperé un contorno de una imagen y quiero trabajar específicamente en los píxeles del contorno. Necesito encontrar la suma (no el área) de los valores de píxel en el contorno. OpenCV solo admite ROI en forma de rectángulo, así que no tengo idea de cómo hacerlo. cvSum también solo acepta imágenes completas y no tiene una opción de máscara, por lo que estoy un poco perdido sobre cómo proceder. ¿Alguien tiene alguna sugerencia sobre cómo encontrar la suma de los valores de píxeles en un contorno específico?¿Tratar con píxeles en contornos (OpenCV)?

+0

¿Cuál es la representación del contorno? Coordenadas de píxeles? Imagen/máscara? ¿Por qué no puedes simplemente recorrer los píxeles? –

+0

Lo siento pero realmente no entiendo la pregunta. El contorno consiste en una secuencia de puntos que rodean un área específica. No veo cómo puedo simplemente recorrer los píxeles. El contorno puede tener cualquier forma, desde el contorno de un cuerpo humano hasta el de un perro, la falta de una forma fija significa que realmente no puedo "hacer un círculo" – fdh

+0

Si los píxeles del contorno se dan como coordenadas en alguna matriz, recorra ese conjunto, tome coordenadas de él y luego mire el píxel de la imagen con esas coordenadas. Si el contorno está en una imagen y sus píxeles tienen un color específico (o rango) que los distingue de todo lo demás, simplemente recorra los píxeles de la imagen y observe sus colores para ver si son los píxeles del contorno. Si no tiene las coordenadas y no hay un rango de color específico para los píxeles de contorno, es un tipo diferente de problema, es más difícil. Usted no especificó la representación. Es por eso que pregunté al respecto –

Respuesta

5

Primero obtenga todos sus contornos. Utilice esta información para crear una imagen binaria con las partes blancas siendo el contorno y el área del contorno. Realice una operación Y en las dos imágenes. El resultado serán los contornos y el área sobre un fondo negro. Luego, suma todos los píxeles en esta imagen.

+0

En primer lugar, lo que está sugiriendo me dará la suma de TODOS los contornos. Quiero cada suma por separado, no totalmente. En segundo lugar, como dije en mi pregunta, no quiero calcular el área del contorno, sino el valor de los píxeles que ya no son negros en el contorno. Su método hará que todos los píxeles en el contorno sean blancos, desafiando por completo el punto de la aplicación. – fdh

+1

cuando Y la imagen binaria y la imagen original, lo que obtienes es una imagen aislada. No obtendrás una imagen completamente blanca. Si quiere uno a la vez, puede crear la máscara binaria y AND las dos imágenes de a una por vez. – scord

+0

lo siento si no me explicaba bien. Pero yo mismo hice algo similar con éxito. – scord

3

Si entiendo bien, desea sumar todas las intensidades de píxeles de una imagen gris que se encuentran dentro de un contorno. Si es así, el método en el que pienso es dibujar ese contorno en una imagen en blanco y llenarla, haciéndote así una máscara. Después de que para optimizar el proceso también se puede calcular la rect de delimitación del contorno con:

CvRect cvBoundingRect(CvArr* points, int update=0); 

Después de esto se puede hacer una imagen intermedia con:

void cvAddS(const CvArr* src, CvScalar value, CvArr* dst, const CvArr* mask=NULL); 

utilizando el valor 0, la máscara obtenida desde el contorno y establecer antes como ROI el rect limitante.

Después de esto, una suma en la imagen resultante será un poco más rápida.

+0

Gracias. Por lo que entiendo, básicamente estás aislando el contenido de los contornos, usando una máscara. Veo cómo funciona, pero realmente no entiendo el propósito del rectángulo delimitador. Si el contenido del contorno se ha aislado, ¿de qué sirve tener un ROI? – fdh

+0

El punto es trabajar en una región más pequeña cuando se calcula la suma o cualquier otra operación que implique atravesar cada píxel de una imagen. – Adrian

0

para acceder al punto del contorno sigue individualmente el código

vector<vector<Point> > contours; 
... 
printf("\n Contours pixels \n"); 
for(int a=0; a< contours.size(); a++) 
{ 
    printf("\nThe contour NO = %d size = %d \n",a, contours[a].size()); 
    for(int b = 0; b < contours[a].size(); b++) 
    { 
     printf(" [%d, %d] ",contours[a][b].x, contours[a][b].y); 
    } 
} 
+0

Esto solo dará como resultado los puntos a lo largo de los bordes del contorno. No los píxeles dentro. – David

Cuestiones relacionadas