Segmentación de imágenes mediante operaciones morfológicas en Python

Si queremos extraer o definir algo del resto de la imagen, ej. Al detectar un objeto de un fondo, podemos dividir la imagen en segmentos en los que podemos hacer más procesamiento. Esto normalmente se llama segmentación . Las operaciones morfológicas son algunas operaciones simples basadas en la forma de la imagen. Normalmente se realiza en imágenes binarias. Dos operadores morfológicos básicos son la Erosión y la Dilatación. Para una comprensión básica de la dilatación y la erosión, consulte este artículo . Para procesar, utilizaremos el algoritmo de umbral de OTSU, que elimina el resultado sobresegmentado debido al ruido o cualquier otra irregularidad en la imagen y lo implementaremos con OpenCV. 

Acercarse :

  • Etiquete la región que estamos seguros de ser el primer plano u objeto con un color (o intensidad), Etiquete la región que estamos seguros de ser el fondo o no objeto con otro color.
  • Finalmente la región de la que no estamos seguros de nada, la rotulamos con 0. Ese es nuestro marcador. Luego aplique el algoritmo de cuenca hidrográfica.
  • Luego, nuestro marcador se actualizará con las etiquetas que le dimos, y los límites de los objetos tendrán un valor de -1.

Comencemos con un ejemplo, considere la imagen de monedas. Imagen de entrada: 

Python

# Python program to transform an image using
# threshold.
import numpy as np
import cv2
from matplotlib import pyplot as plt
 
# Image operation using thresholding
img = cv2.imread('c4.jpg')
 
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
 
ret, thresh = cv2.threshold(gray, 0, 255,
                            cv2.THRESH_BINARY_INV +
                            cv2.THRESH_OTSU)
cv2.imshow('image', thresh)

Producción :

  

Esta salida muestra que la imagen se transforma mediante la operación de umbral donde el primer plano todavía contiene algunos ruidos. Ahora, necesitamos eliminar cualquier pequeño ruido blanco en la imagen, es decir, en primer plano. Para eso podemos usar el cierre morfológico. Para eliminar pequeños agujeros en el objeto de primer plano, podemos usar el cierre morfológico. Para obtener fondo dilatamos la imagen. La dilatación aumenta el límite del objeto al fondo. Veamos el código: 

Python

# Noise removal using Morphological
# closing operation
kernel = np.ones((3, 3), np.uint8)
closing = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE,
                            kernel, iterations = 2)
 
# Background area using Dilation
bg = cv2.dilate(closing, kernel, iterations = 1)
 
# Finding foreground area
dist_transform = cv2.distanceTransform(closing, cv2.DIST_L2, 0)
ret, fg = cv2.threshold(dist_transform, 0.02
                        * dist_transform.max(), 255, 0)
 
cv2.imshow('image', fg)

Salida: A partir de la imagen de salida, podemos concluir que los pequeños agujeros se eliminan mediante la operación de cierre y nos aseguramos de que cualquier región en primer plano en el resultado sea realmente un primer plano. Referencia: https://docs.opencv.org/3.3.1/d3/db4/tutorial_py_watershed.html

Publicación traducida automáticamente

Artículo escrito por AFZAL ANSARI 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 *