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:
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.
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.
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:
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:
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:
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:
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:
Publicación traducida automáticamente
Artículo escrito por jssuriyakumar y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA