Python OpenCV – Operaciones morfológicas

Las operaciones morfológicas de Python OpenCV son una de las técnicas de procesamiento de imágenes que procesa la imagen en función de la forma. Esta estrategia de procesamiento generalmente se realiza en imágenes binarias. 

Las operaciones morfológicas basadas en OpenCV son las siguientes:

  • Erosión
  • Dilatación
  • Apertura
  • Clausura
  • Gradiente morfológico
  • sombrero de copa
  • Sombrero negro

Para todas las técnicas anteriores, los dos requisitos importantes son la imagen binaria y un elemento de estructuración del núcleo que se utiliza para deslizarse por la imagen.

Imágenes utilizadas para la demostración:

Imágenes utilizadas

Imágenes utilizadas

Erosión

La erosión consiste principalmente en erosionar la superficie exterior (el primer plano) de la imagen. Como las imágenes binarias solo contienen dos píxeles 0 y 255, implica principalmente erosionar el primer plano de la imagen y se sugiere tener el primer plano en blanco. El espesor de la erosión depende del tamaño y la forma del grano definido. Podemos hacer uso de la función ones() de NumPy para definir un núcleo. Hay muchas otras funciones como ceros NumPy, kernels personalizados y otras que se pueden usar para definir kernels según el problema en cuestión.

Código:

  • Importe los paquetes necesarios como se muestra
  • Lee la imagen
  • Binarizar la imagen.
  • Como se recomienda mantener el primer plano en blanco, estamos realizando la operación de inversión de OpenCV en la imagen binarizada para que el primer plano sea blanco.
  • Estamos definiendo un núcleo de 5×5 lleno de unos
  • Entonces podemos hacer uso de la función Opencv erode() para erosionar los límites de la imagen.

Python3

# import the necessary packages
import cv2
import numpy as np
import matplotlib.pyplot as plt
 
# read the image
img = cv2.imread(r"Downloads\test (2).png", 0)
 
# binarize the image
binr = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY+cv2.THRESH_OTSU)[1]
 
# define the kernel
kernel = np.ones((5, 5), np.uint8)
 
# invert the image
invert = cv2.bitwise_not(binr)
 
# erode the image
erosion = cv2.erode(invert, kernel,
                    iterations=1)
 
# print the output
plt.imshow(erosion, cmap='gray')

Producción:

La salida debe ser una imagen más delgada que la original.

Erosión

Dilatación

La dilatación implica dilatar la superficie exterior (el primer plano) de la imagen. Como las imágenes binarias solo contienen dos píxeles 0 y 255, implica principalmente expandir el primer plano de la imagen y se sugiere tener el primer plano en blanco. El espesor de la erosión depende del tamaño y la forma del núcleo definido. Podemos hacer uso de la función ones() de NumPy para definir un núcleo. Hay muchas otras funciones como ceros NumPy, kernels personalizados y otras que se pueden usar para definir kernels según el problema en cuestión. Es exactamente lo opuesto a la operación de erosión.

Código:

  • Importe los paquetes necesarios como se muestra
  • Lee la imagen
  • Binarizar la imagen.
  • Como se recomienda mantener el primer plano en blanco, estamos realizando la operación de inversión de OpenCV en la imagen binarizada para que el primer plano sea blanco.
  • Estamos definiendo un kernel 3×3 lleno de unos
  • Entonces podemos hacer uso de la función Opencv dilate() para dilatar los límites de la imagen.

Python3

import cv2
 
# read the image
img = cv2.imread(r"path to image", 0)
 
# binarize the image
binr = cv2.threshold(img, 0, 255, cv.THRESH_BINARY+cv.THRESH_OTSU)[1]
 
# define the kernel
kernel = np.ones((3, 3), np.uint8)
 
# invert the image
invert = cv2.bitwise_not(binr)
 
# dilate the image
dilation = cv2.dilate(invert, kernel, iterations=1)
 
# print the output
plt.imshow(dilation, cmap='gray')

Producción:

La salida debe ser una imagen más gruesa que la original.

imagen dilatada

Apertura

La apertura implica erosión seguida de dilatación en la superficie exterior (el primer plano) de la imagen. Todas las restricciones mencionadas anteriormente para la erosión y la dilatación se aplican aquí. Es una mezcla de los dos métodos principales. Generalmente se utiliza para eliminar el ruido de la imagen.

Código:

  • Importe los paquetes necesarios como se muestra
  • Lee la imagen
  • Binarizar la imagen.
  • Estamos definiendo un kernel 3×3 lleno de unos
  • Entonces podemos hacer uso de la función Opencv cv.morphologyEx() para realizar una operación de apertura en la imagen.

Python3

# import the necessary packages
import cv2
 
# read the image
img = cv2.imread(r"\noise.png", 0)
 
# binarize the image
binr = cv2.threshold(img, 0, 255,
                     cv2.THRESH_BINARY+cv2.THRESH_OTSU)[1]
 
# define the kernel
kernel = np.ones((3, 3), np.uint8)
 
# opening the image
opening = cv2.morphologyEx(binr, cv2.MORPH_OPEN,
                           kernel, iterations=1)
# print the output
plt.imshow(opening, cmap='gray')

Producción:

Imagen de apertura

Clausura

El cierre implica dilatación seguida de erosión en la superficie exterior (el primer plano) de la imagen. Todas las restricciones mencionadas anteriormente para la erosión y la dilatación se aplican aquí. Es una mezcla de los dos métodos principales. Generalmente se utiliza para eliminar el ruido de la imagen.

Código:

  • Importe los paquetes necesarios como se muestra
  • Lee la imagen
  • Binarizar la imagen.
  • Estamos definiendo un kernel 3×3 lleno de unos
  • Entonces podemos hacer uso de la función Opencv cv.morphologyEx() para realizar una operación de cierre en la imagen.

Python3

# import the necessary packages
import cv2
 
# read the image
img = cv2.imread(r"\Images\noise.png", 0)
 
# binarize the image
binr = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY+cv2.THRESH_OTSU)[1]
 
# define the kernel
kernel = np.ones((3, 3), np.uint8)
 
# opening the image
closing = cv2.morphologyEx(binr, cv2.MORPH_CLOSE, kernel, iterations=1)
 
# print the output
plt.imshow(closing, cmap='gray')

Producción:

Imagen de cierre

Gradiente morfológico

El gradiente morfológico es ligeramente diferente a las otras operaciones, porque el gradiente morfológico primero aplica erosión y dilatación individualmente en la imagen y luego calcula la diferencia entre la imagen erosionada y dilatada. La salida será un contorno de la imagen dada.

 Código:

  • Importe los paquetes necesarios como se muestra
  • Lee la imagen
  • Binarizar la imagen.
  • Como se recomienda mantener el primer plano en blanco, estamos realizando la operación de inversión de OpenCV en la imagen binarizada para que el primer plano sea blanco.
  • Estamos definiendo un kernel 3×3 lleno de unos
  • Entonces podemos hacer uso de la función Opencv cv.morphologyEx() para realizar un degradado morfológico en la imagen.

Python3

# import the necessary packages
import cv2
 
# read the image
img = cv2.imread(r"path to your image", 0)
 
# binarize the image
binr = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY+cv2.THRESH_OTSU)[1]
 
# define the kernel
kernel = np.ones((3, 3), np.uint8)
 
# invert the image
invert = cv2.bitwise_not(binr)
 
# use morph gradient
morph_gradient = cv2.morphologyEx(invert,
                                  cv2.MORPH_GRADIENT,
                                  kernel)
 
# print the output
plt.imshow(morph_gradient, cmap='gray')

Producción:

Gradiente morfológico Imagen

sombrero de copa

Top Hat es otra operación morfológica en la que la apertura se realiza en la imagen binaria y el resultado de esta operación es una diferencia entre la imagen de entrada y la imagen abierta. 

 Código:

  • Importe los paquetes necesarios como se muestra.
  • Lee la imagen.
  • Binarizar la imagen.
  • Estamos definiendo un núcleo de 13×13 lleno de unos.
  • Entonces podemos hacer uso de la función Opencv cv.morphologyEx() para realizar una operación de sombrero de copa en la imagen.

Python3

# import the necessary packages
import cv2
 
# read the image
img = cv2.imread("your image path", 0)
 
# binarize the image
binr = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY+cv2.THRESH_OTSU)[1]
 
# define the kernel
kernel = np.ones((13, 13), np.uint8)
 
# use morph gradient
morph_gradient = cv2.morphologyEx(binr,
                                  cv2.MORPH_TOPHAT,
                                  kernel)
# print the output
plt.imshow(morph_gradient, cmap='gray')

Producción:

Imagen del sombrero de copa

Sombrero negro

Top Hat es otra operación morfológica en la que la apertura se realiza en la imagen binaria y el resultado de esta operación es una diferencia entre la imagen de entrada y la imagen abierta.

Código:

  • Importe los paquetes necesarios como se muestra.
  • Lee la imagen.
  • Binarizar la imagen.
  • Como se recomienda mantener el primer plano en blanco, estamos realizando la operación de inversión de OpenCV en la imagen binarizada para que el primer plano sea blanco.
  • Estamos definiendo un núcleo de 5×5 lleno de unos.
  • Entonces podemos hacer uso de la función Opencv cv.morphologyEx() para realizar una operación de sombrero de copa en la imagen.

Python3

# import the necessary packages
import cv2
 
# read the image
img = cv2.imread("your image path", 0)
 
# binarize the image
binr = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY+cv2.THRESH_OTSU)[1]
 
# define the kernel
kernel = np.ones((5, 5), np.uint8)
 
# invert the image
invert = cv2.bitwise_not(binr)
 
# use morph gradient
morph_gradient = cv2.morphologyEx(invert,
                                  cv2.MORPH_BLACKHAT,
                                  kernel)
# print the output
plt.imshow(morph_gradient, cmap='gray')

Producción:

imagen de sombrero negro

Publicación traducida automáticamente

Artículo escrito por jssuriyakumar y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *