2011-03-01 10 views
8

Quiero suavizar el contorno de las imágenes binarizadas y creo que erosionar es la mejor manera de hacerlo. Sé que la forma normal de trabajo es usar cvDilate (src, dst, 0, iter); donde 0 es una matriz 3x3.Dilatar/erosionar modificar la opción del núcleo

El problema es que la matriz 3x3 hace una erosión profunda en mis imágenes. ¿Cómo puedo hacer una erosión con una matriz de 2x2 o algo más pequeño que la matriz predeterminada de 3x3?

Respuesta

21

Aquí tienes como referencia los resultados de la utilización diferentes núcleos:

enter image description here

Saludos!

1

Con la API C, puede crear un objeto IplConvKernel dedicado de cualquier tipo y tamaño con la función CreateStructuringElementEx(). Si usa la API de C++ (función dilate()), el elemento de estructuración utilizado para la dilatación es cualquier matriz (Mat) que desee.

+0

En esta función, CreateStructuringElementEx, los parámetros 3 y 4 (x_anchor y y_anchor) no saben qué significa. Su desplazamiento predeterminado para kernel. Puse 0 y 0, ¿es correcto ??? –

+0

Estos parámetros definen el píxel principal del núcleo, utilizado para saber cómo aplicarlo. Por lo general, se encuentra en el centro de un círculo o un cuadrado. Puede estar descentrada para formas de kernel más exóticas. –

3

Si su objetivo es tener una imagen binarizada con bordes suaves, entonces, si tiene el original, es mejor utilizar algo así como un desenfoque gaussiano con cvSmooth() antes de realizar la binarización.

Dicho esto, no está restringido a los núcleos de 3x3. cvDilate() toma un IplConvKernel producido por CreateStructuringElementEx y puede hacer un elemento estructurador con cualquier forma (rectangular) con esa función. Sin embargo, un elemento de estructuración funciona en relación con un punto de anclaje que debe tener coordenadas enteras, por lo que si usa una matriz de 2x2, la matriz no puede centrarse alrededor del píxel. entonces, en la mayoría de los casos, es mejor usar elementos estructurantes con un número impar de filas y columnas.

Lo que podría hacer es crear un elemento de 3x3 estructuración donde sólo el valor central y los valores desde arriba, abajo, izquierda y hacia la derecha de los que son de 1, como por ejemplo:

0 1 0 
1 1 1 
0 1 0 

lugar de la predeterminada :

1 1 1 
1 1 1 
1 1 1 

El primer núcleo hará algunos bordes ligeramente más lisos.

3

Aquí es un enfoque rápido y sucio que le diga si la dilatación/erosión funcionará para usted:

  • Upsample su imagen.
  • Erode (dilatan, abrir, cerrar, lo que sea) con el filtro más pequeño que puede utilizar (normalmente 3x3)
  • Downsample de nuevo a su tamaño original imagen
0

errosion y dilatación matrices deben ser de orden impar

- una matriz de 2 * 2 no se puede utilizar

matrices de convolución deberían ser del orden de 1 * 1 3 * 3 5 * 5 7 * 7. .. pero ODD

intenta aplicar cerca - Erode luego dilatar la operación de imagen - utilizar la función cvMorpologyEx()

1

un núcleo con todo 1'S es un filtro de paso bajo convolución.Un filtro de dilatación reemplaza cada píxel en la región 3X3 con el píxel más oscuro en esa región de 3x3. Un filtro de erosión reemplaza cada píxel en la región 3X3 con el píxel más claro en esa región de 3x3. Eso es si tu fondo es claro y tu objeto de primer plano está oscuro. Si voltea el fondo y el primer plano, también podría voltear su filtro de dilatación y erosión.

Además, si desea realizar una operación 'abierta', realiza una erosión seguida de una dilatación. Por el contrario, una operación "cercana" es una dilatación seguida de una erosión. Abrir tiende a eliminar grupos aislados de píxeles y cerrar tiende a llenar los agujeros.

Cuestiones relacionadas