[OpenCV-Python] 17 Transformación morfológica

OpenCV-Python: Procesamiento de imágenes IV en OpenCV

17 Transformación morfológica

Objetivos
  • Conocer diferentes operaciones morfológicas, como corrosión, expansión, operación abierta, operación cerrada, etc.
  • Las funciones que debemos aprender son: cv2.erode (), cv2.dilate (), cv2.morphologyEx (),
etc.

Principio
  La operación morfológica es una operación simple basada en la forma de la imagen. La operación realizada en la imagen binarizada en general. Se deben ingresar dos parámetros, uno es la imagen original y el segundo se llama elemento de estructuración o núcleo, que se usa para determinar la naturaleza de la operación. Las dos operaciones morfológicas básicas son la corrosión y la expansión. Sus variantes constituyen operaciones de apertura, operaciones de cierre, pendientes, etc. Los presentaremos uno a uno en la siguiente figura a modo de ejemplo.

img

17.1 Corrosión

Al igual que la erosión del suelo, esta operación corroerá los límites de los objetos en primer plano (pero el primer plano sigue siendo blanco). ¿Cómo se hace esto? El núcleo de convolución se desliza a lo largo de la imagen. Si todos los valores de píxel de la imagen original correspondiente al núcleo de convolución son 1, entonces el elemento central mantiene el valor de píxel original, de lo contrario se vuelve cero.

¿Qué impacto tendrá esto? Según el tamaño del núcleo de convolución, todos los píxeles cercanos al primer plano se corroerán (se convertirán en 0), por lo que el objeto en primer plano se volverá más pequeño y el área blanca de toda la imagen se reducirá. Esto es útil para eliminar el ruido blanco y también se puede utilizar para desconectar dos objetos que están conectados entre sí.
Aquí tenemos un ejemplo, usando un kernel de convolución de 5x5, en el que todos los valores están en formato. Veamos como trabaja:

import cv2
import numpy as np

img = cv2.imread('j.png',0)
kernel = np.ones((5,5),np.uint8)
erosion = cv2.erode(img,kernel,iterations = 1)

resultado:

Erosión

17.2 Expansión

Contrariamente a la corrosión, siempre que uno de los valores de píxel de la imagen original correspondiente al núcleo de convolución sea 1, el valor de píxel del elemento central es 1. Entonces, esta operación aumentará el área blanca (primer plano) en la imagen. Generalmente, primero se usa la corrosión y luego se usa la expansión para eliminar el ruido. Debido a que la corrosión elimina el ruido blanco, también hace que los objetos del primer plano sean más pequeños. Así que lo volvemos a inflar. En este momento, el ruido se ha eliminado y no volverá, pero el primer plano está quieto y aumentará. La expansión también se puede utilizar para conectar dos objetos separados.

dilation = cv2.dilate(img,kernel,iterations = 1)

resultado:

img

17.3 Operación abierta

La corrosión de naturaleza avanzada y luego la expansión se llama operación abierta. Como presentamos anteriormente, se usa para eliminar el ruido. La función que usamos aquí es cv2.morphologyEx ().

opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)

resultado:

Apertura

17.4 Aritmética cercana

Primero se expande y luego se corroe. A menudo se utiliza para rellenar pequeños agujeros en objetos en primer plano o pequeños puntos negros en objetos en primer plano.

closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)

resultado:

img

17.5 Gradiente morfológico

De hecho, es la diferencia entre expansión y erosión de una imagen.
El resultado se parece al contorno del objeto de primer plano.

gradient = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel)

resultado:

img

17.6 Sombrero de copa

La diferencia entre la imagen original y la imagen obtenida tras la operación de apertura. El siguiente ejemplo es el resultado de una operación de sombrero de copa con un núcleo de 9x9.

tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)

resultado:

img

17.7 Sombrero negro

La diferencia entre la imagen obtenida tras la operación de cierre y la imagen original.

tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)

resultado:

img

17.8 La relación entre operaciones morfológicas

Enumeramos las relaciones entre las operaciones morfológicas centralizadas anteriores para su referencia:

Elemento estructurado
  En el ejemplo anterior, usamos Numpy para construir el elemento estructurado, que es cuadrado. Pero a veces necesitamos construir un núcleo ovalado / circular. Para lograr este requisito, se proporciona la función OpenCV cv2.getStructuringElement (). Solo necesitas decirle la forma y el tamaño del núcleo que necesitas.

# Rectangular Kernel
>>> cv2.getStructuringElement(cv2.MORPH_RECT,(5,5))
array([[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]], dtype=uint8)
# Elliptical Kernel
>>> cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(5,5))
array([[0, 0, 1, 0, 0],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[0, 0, 1, 0, 0]], dtype=uint8)
# Cross-shaped Kernel
>>> cv2.getStructuringElement(cv2.MORPH_CROSS,(5,5))
array([[0, 0, 1, 0, 0],
[0, 0, 1, 0, 0],
[1, 1, 1, 1, 1],
[0, 0, 1, 0, 0],
[0, 0, 1, 0, 0]], dtype=uint8)

Para obtener más información, preste atención a la cuenta oficial:
img

Supongo que te gusta

Origin blog.csdn.net/yegeli/article/details/113421033
Recomendado
Clasificación