Detección de superficie

9

¿Cómo podría un segmento grandes áreas de gris (que van del blanco al negro) de una imagen? (Si sabe esto en opencv, puede responder diciendo qué haría en opencv). Por ejemplo, dada esta imagen:

ingrese la descripción de la imagen aquí

Usted ve que esta es un área grande de gris y es claramente distinguible del resto. ¿Cómo puede segmentar esto si esta área puede tener algún tono de gris y tiene que funcionar en tiempo real?

Gracias de antemano.

Olivier_s_j
fuente
Veo varias áreas grises claramente distinguibles. ¿Podrías mostrar el resultado deseado?
Dr. belisario
mi resultado deseado son las coordenadas de las esquinas superiores derecha e izquierda y la coordenada de la esquina inferior izquierda del rectángulo gris medio
Olivier_s_j
¿Puede contarnos algo más sobre el medio ambiente y la posible variación en las imágenes que necesitará procesar? ¿El objetivo siempre estará cerca del medio de la imagen? ¿Habrá otros rectángulos grises presentes, posiblemente del mismo tamaño? ¿Qué pasa si aparecen como el mismo tono de gris? ¿Hay alguna otra cosa que podamos usar para identificarlo? ¿Siempre tendrá la pequeña forma de "T" en la parte superior?
justis
Hola, el objetivo no siempre estará cerca del centro de la imagen. El objetivo siempre será algún tipo de rectángulo. (También puede ser solo una pared). Si hay varios rectángulos, también deberían detectarse, pero deberían ser grandes. Pequeñas áreas pueden ser descartadas. Si todos aparecen como el mismo tipo de gris, todos deberían ser detectados, pero la posibilidad de que esto ocurra es muy pequeña. La única propiedad real que se puede detectar es que una superficie tendrá el mismo gris (más o menos) sobre toda la superficie, y que es un rectángulo. No habrá una pequeña camiseta en forma de T cada vez
Olivier_s_j

Respuestas:

9

Obtendrá una segmentación razonable del área gris utilizando el Algoritmo de cuenca o cortes de gráficos. Watershed está disponible en opencv pero los cortes de gráficos aún no. (Por cierto, ¿es este un mapa de profundidad de Kinect?)

nav
fuente
1
La función de cuenca en opencv requería una imagen de 3 canales de 8 bits como entrada. Mi mapa de profundidad es una imagen de 8 bits 1. Alguna idea de como resolver esto?
Olivier_s_j
/ * obtener propiedades de imagen / ancho = src-> ancho; altura = src-> altura; / crear una nueva imagen para la versión en escala de grises * / IplImage * dst = cvCreateImage (cvSize (ancho, alto), IPL_DEPTH_8U, 1); cvCvtColor (src, dst, CV_RGB2GRAY);
nav
Otra pregunta, acabo de hacer que la función de cuenca funcione en otra imagen (solo un ejemplo de opencv). Pero comienzan con una imagen en color y una imagen binaria. Solo tengo 1 imagen ... la imagen de grascale. ¿Alguna idea de cuál debería ser la máscara (la segunda variable de entrada)?
Olivier_s_j
4

En Mathematica podrías hacer algo como:

Colorize[MorphologicalComponents[
  ColorNegate@
   Erosion[Dilation[
     DeleteSmallComponents[
      Erosion[Binarize[
        GradientFilter[
         ColorConvert[Import@"http://i.stack.imgur.com/XdnaW.png", 
          "RGB"], 2], .015], 1], 100], 2], 2]], 
 ColorFunction -> "ThermometerColors"]

ingrese la descripción de la imagen aquí

Probablemente pueda traducir este código a cualquier lib de procesamiento de imágenes.

Dr. belisario
fuente
Hola se ve bien Pero no tengo Mathica. ¿Pero supongo que usaste el umbral basado en la escala de grises de esta imagen? ¿Tal vez podrías dar un poco de información con tu código? Thx
Olivier_s_j
1
@Ojt Para cada comando, puede leer " reference.wolfram.com/mathematica/ref/xxx.html " para obtener una descripción. Por ejemplo reference.wolfram.com/mathematica/ref/…
Dr. belisarius
Ok, hice lo que sugeriste. Pero parece que está utilizando Binarize para umbral en un valor dado. Lo cual no es posible en mi caso. Dado que grandes áreas de pueden tener diferentes tonos de gris. (Por ejemplo, la superficie media podría ser muy gris claro). Y entonces el umbral no funcionaría.
Olivier_s_j