OpenCV Dilate
Este artículo explicará los conceptos de transformación morfológica como la erosión y la dilatación, que usamos para agregar y eliminar píxeles del límite de un objeto dado en una imagen en OpenCV.
Aplicar Transformación Morfológica en una Imagen Usando Erosión y Dilatación en OpenCV
Las transformaciones morfológicas son operaciones basadas en imágenes que se realizan sobre imágenes binarias. Requiere dos entradas, una es la imagen original y la segunda es el kernel.
El núcleo decide la naturaleza de la operación. Dos operadores morfológicos básicos son la erosión y la dilatación, y también tenemos algunas de sus variaciones como apertura y cierre, etc.
Comprendamos la erosión y la dilatación usando un ejemplo.
La erosión es como la erosión del suelo; erosiona los límites de un objeto en primer plano. Considere esta imagen de L
donde la parte blanca es el número 1, que también se puede tratar como el número 255 desde la perspectiva estándar de OpenCV.
La erosión elimina el píxel en los límites de un objeto en una imagen determinada. Después de eliminar los límites de este objeto L
en la imagen, este se adelgaza después de aplicar la erosión.
El kernel se desliza a través de la imagen como en una convolución 2D en términos técnicos. Un píxel en la imagen original, ya sea 1 o 0, se considerará 1 solo si todo el píxel debajo del kernel es 1; de lo contrario, se erosiona o se reduce a cero, por lo que se descarta el límite según el tamaño del núcleo.
La dilatación es lo opuesto a la erosión; agrega píxeles a los límites de un objeto en la imagen dada. Podemos ver que el límite de L
u objeto L
en la imagen se vuelve más grueso después de la dilatación.
En términos técnicos, un elemento de píxel es 1 si al menos un píxel debajo del kernel es 1, y su resultado aumentará la región blanca en la imagen o el tamaño del objeto de primer plano.
Entonces, si tiene una imagen en la que desea eliminar el ruido, primero puede aplicar la operación de erosión seguida de la dilatación porque la erosión elimina los ruidos blancos, pero también encoge nuestro objeto; por eso operamos la dilatación, preservando así la imagen original. También es útil para unir partes rotas del objeto.
Las transformaciones morfológicas tienen variaciones como apertura y cierre; La apertura es un proceso en el que aplicamos erosión seguida de dilatación. El cierre es todo lo contrario, donde aplicamos dilatación seguida de erosión.
Implementemos varias operaciones usando OpenCV. Necesitamos importar las bibliotecas requeridas.
En esta línea, estamos leyendo nuestra imagen usando la función imread()
y dando la ruta de la imagen como argumento y almacenándola en una variable llamada imagedata_original
.
imagedata_original = cv2.imread("input.png")
En este código, definimos el kernel del píxel 5x5
usando la función numpy
ones()
y el tipo de datos del kernel no está firmado int
.
kernel = np.ones((5, 5), np.uint8)
Usamos la función erode()
para aplicar la erosión en la siguiente línea. Toma varios argumentos como la imagen original, el núcleo y las iteraciones.
Las iterations
sugieren cuántas veces desea ejecutar el proceso de erosión. Si aumenta este número, está aumentando el efecto de la erosión.
erosion_op = cv2.erode(imagedata_original, kernel, iterations=1)
Usaremos la función dilate()
para aplicar la dilatación a un objeto de imagen. Los argumentos son similares a los definidos en la función erode()
.
dilation_op = cv2.dilate(imagedata_original, kernel, iterations=1)
Ahora usaremos la función morphologyEx()
para aplicar la operación de apertura. Esta función toma argumentos como la imagen de entrada MORPH_OPEN
, que significa la operación de apertura que se aplicará y el kernel que definimos anteriormente.
opening_op = cv2.morphologyEx(imagedata_original, cv2.MORPH_OPEN, kernel)
Estamos dando la siguiente instrucción para aplicar la operación de cierre a la función morphologyEx()
.
closing_op = cv2.morphologyEx(imagedata_original, cv2.MORPH_CLOSE, kernel)
Código fuente completo:
import cv2
import numpy as np
import matplotlib.pyplot as plot
FIG = plot.figure(figsize=(6, 5))
imagedata_original = cv2.imread("input.png")
FIG.add_subplot(2, 3, 1)
plot.imshow(imagedata_original)
plot.axis("off")
plot.title("original imagge")
kernel = np.ones((5, 5), np.uint8)
erosion_op = cv2.erode(imagedata_original, kernel, iterations=1)
FIG.add_subplot(2, 3, 2)
plot.imshow(erosion_op)
plot.axis("off")
plot.title("Erossion operatiopn")
dilation_op = cv2.dilate(imagedata_original, kernel, iterations=1)
FIG.add_subplot(2, 3, 3)
plot.imshow(dilation_op)
plot.axis("off")
plot.title("Dilation operatiopn")
opening_op = cv2.morphologyEx(imagedata_original, cv2.MORPH_OPEN, kernel)
FIG.add_subplot(2, 3, 4)
plot.imshow(opening_op)
plot.axis("off")
plot.title("Opening operatiopn")
closing_op = cv2.morphologyEx(imagedata_original, cv2.MORPH_CLOSE, kernel)
FIG.add_subplot(2, 3, 5)
plot.imshow(closing_op)
plot.axis("off")
plot.title("Clossing operatiopn")
plot.tight_layout()
plot.show()
Ejecutemos y veamos las diferentes salidas con diferentes operaciones en una imagen usando matplotlib
.
La mayoría de las personas podrían estar confundidas por qué el texto en la imagen erosionada parecía grueso cuando eliminó píxeles del límite. Por qué el texto de la imagen dilatada parece delgado cuando agrega píxeles al límite del objeto.
Esto se debe a que OpenCV trató la parte blanca como un objeto en sí mismo en lugar de tratar el texto negro como un objeto en la imagen. Entonces, cuando aplicamos la operación de erosión, elimina los píxeles blancos del límite del negro, por lo que el límite del texto negro se vuelve más grueso.
La operación de dilatación agrega los píxeles blancos al límite del texto negro; por eso el texto negro se adelgaza.
Hello! I am Salman Bin Mehmood(Baum), a software developer and I help organizations, address complex problems. My expertise lies within back-end, data science and machine learning. I am a lifelong learner, currently working on metaverse, and enrolled in a course building an AI application with python. I love solving problems and developing bug-free software for people. I write content related to python and hot Technologies.
LinkedIn