Operaciones morfológicas

A veces, después de descomponer su imagen, tiene ruido no deseado en su imagen binaria. Las operaciones morfológicas pueden ayudar a eliminar ese ruido de la imagen.

Núcleo

El núcleo es una forma simple donde el origen se superpone en cada píxel de valor 1 de la imagen binaria. OpenCV limita el núcleo a una matriz NxN donde N es un número impar. El origen del núcleo es el centro. Un núcleo común es

\[\begin{split}kernel = \begin{pmatrix} 1 & 1 & 1\\ 1 & 1 & 1\\ 1 & 1 & 1 \end{pmatrix}\end{split}\]

Diferentes núcleos pueden afectar la imagen de manera diferente, como erosionarse o dilatarse verticalmente.

Como referencia, esta es nuestra imagen binaria que creamos:

Original binary image.

Erosión

La erosión en la visión por computadora es similar a la erosión en el suelo. Le quita las fronteras de objetos en primer plano. Este proceso puede eliminar el ruido del fondo.

kernel = np.ones((3, 3), np.uint8)
binary_img = cv2.erode(binary_img, kernel, iterations = 1)
Image after erosion.  Little spots have gone away and large spots reduced in size.

Durante la erosión, si los píxeles superpuestos del núcleo no están contenidos completamente por los píxeles de la imagen binaria, se elimina el píxel en el que se superpuso.

Dilatación

La dilatación es opuesta a la erosión. En lugar de alejarse de las fronteras, se agrega a ellos. Este proceso puede eliminar pequeños agujeros dentro de una región más grande.

kernel = np.ones((3, 3), np.uint8)
binary_img = cv2.dilate(binary_img, kernel, iterations = 1)
Image after Dilation.  All of the spots have grown larger.

Durante la dilatación, cada píxel de cada núcleo superpuesto se incluye en la dilatación.

Apertura

La apertura es erosión seguida de dilatación. Este proceso elimina el ruido sin afectar el forma de características más grandes.

kernel = np.ones((3, 3), np.uint8)
binary_img = cv2.morphologyEx(binary_img, cv2.MORPH_OPEN, kernel)
Image after Opening.  It has removed most of the small artifacts but still keeps the large size of the larger elements.

Nota

In this specific case, it is appropriate to do more iterations of opening in order to get rid of the pixels in the top right.

Clausura

El cierre es dilatación seguida de erosión. Este proceso elimina pequeños agujeros o roturas sin afectar la forma de las características más grandes.

kernel = np.ones((3, 3), np.uint8)
binary_img = cv2.morphologyEx(binary_img, cv2.MORPH_CLOSE, kernel)
Little holes around the image have been removed but overall size of each object stayed roughly the same.