Segmentación basada en regiones y bordes

Segmentación

La segmentación es la separación de una o más regiones u objetos en una imagen basada en un criterio de discontinuidad o similitud. Una región en una imagen se puede definir por su borde (borde) o por su interior, y las dos representaciones son iguales. Hay tres métodos destacados para realizar la segmentación:

  • Segmentación basada en píxeles
  • Segmentación basada en regiones
  • Segmentación basada en bordes

Segmentación basada en bordes

La segmentación basada en bordes contiene 2 pasos:

  • Detección de bordes: en la detección de bordes, necesitamos encontrar los píxeles que son píxeles de borde de un objeto. Hay muchos métodos de detección de objetos, como el operador de Sobel, el operador de Laplace, Canny, etc.
1 0 -1
2 0 -2
1 0 -1
Operador vertical Sobel
+1 2 1
0 0 0
-1 -2 -1
Operador Horizontal Sobel
0 -1 0
-1 4 -1
0 -1 0
Operador negativo de Laplace
  • Vinculación de bordes: en este paso, tratamos de refinar la detección de bordes vinculando los bordes adyacentes y combinándolos para formar el objeto completo. La vinculación de bordes se puede realizar utilizando cualquiera de los dos métodos siguientes:
    • Procesamiento local: en este método, usamos gradiente y dirección para vincular los bordes del vecindario. Si dos bordes tienen un vector de dirección similar, entonces se pueden vincular.
    • Procesamiento global: este método se puede realizar mediante la transformación HOG
  • Ventajas :
    • Este enfoque es similar a cómo el cerebro humano aborda la tarea de segmentación.
    • Funciona bien en imágenes con buen contraste entre el objeto y el fondo.
  • Limitaciones:
    • No funciona bien en imágenes con transiciones suaves y bajo contraste.
    • Sensible al ruido.
    • La vinculación robusta de bordes no es trivial y fácil de realizar.

Segmentación basada en regiones

En esta segmentación, hacemos crecer las regiones al incluir recursivamente los píxeles vecinos que son similares y están conectados al píxel semilla. Usamos medidas de similitud como las diferencias en los niveles de gris para las regiones con niveles de gris homogéneos. Usamos la conectividad para evitar conectar diferentes partes de la imagen. 

Hay dos variantes de segmentación basada en regiones:

  • Enfoque de arriba hacia abajo
    • Primero, necesitamos definir el píxel semilla predefinido. O podemos definir todos los píxeles como píxeles semilla o píxeles elegidos al azar. Haga crecer las regiones hasta que todos los píxeles de la imagen pertenezcan a la región.
  • Enfoque de abajo hacia arriba
    • Seleccione semillas solo de objetos de interés. Haga crecer las regiones solo si se cumple el criterio de similitud.
  • Medidas de similitud:
    • Las medidas de similitud pueden ser de diferentes tipos: para la imagen en escala de grises, la medida de similitud puede ser las diferentes texturas y otras propiedades espaciales, la diferencia de intensidad dentro de una región o el valor medio de la distancia en blanco y negro de la región.
  • Técnicas de fusión de regiones:
    • En la técnica de fusión de regiones, tratamos de combinar las regiones que contienen un solo objeto y separarlo del fondo. Hay muchas técnicas de fusión de regiones, como el algoritmo Watershed, el algoritmo de división y fusión, etc.
  • Ventajas:
    • Dado que realiza un cálculo de umbral simple, es más rápido de realizar.
    • La segmentación basada en regiones funciona mejor cuando el objeto y el fondo tienen un alto contraste.
  • Limitaciones:
    • No produjo muchos resultados de segmentación precisos cuando no hay diferencias significativas en los valores de píxeles en blanco y negro del objeto y el fondo.

Implementación:

  • En esta implementación, realizaremos una segmentación basada en el borde y la región. Usaremos el módulo de imagen scikit para eso y una imagen de su conjunto de datos proporcionado.

Python3

# code
import numpy as np
import matplotlib.pyplot as plt
from skimage.feature import canny
from skimage import data,morphology
from skimage.color import rgb2gray
import scipy.ndimage as nd
plt.rcParams["figure.figsize"] = (12,8)
%matplotlib inline
 
# load images and convert grayscale
rocket = data.rocket()
rocket_wh = rgb2gray(rocket)
 
# apply edge segmentation
# plot canny edge detection
edges = canny(rocket_wh)
plt.imshow(edges, interpolation='gaussian')
plt.title('Canny detector')
 
# fill regions to perform edge segmentation
fill_im = nd.binary_fill_holes(edges)
plt.imshow(fill_im)
plt.title('Region Filling')
 
# Region Segmentation
# First we print the elevation map
elevation_map = sobel(rocket_wh)
plt.imshow(elevation_map)
 
# Since, the contrast difference is not much. Anyways we will perform it
markers = np.zeros_like(rocket_wh)
markers[rocket_wh < 0.1171875] = 1 # 30/255
markers[rocket_wh > 0.5859375] = 2 # 150/255
 
plt.imshow(markers)
plt.title('markers')
 
# Perform watershed region segmentation
segmentation = morphology.watershed(elevation_map, markers)
 
plt.imshow(segmentation)
plt.title('Watershed segmentation')
 
# plot overlays and contour
segmentation = nd.binary_fill_holes(segmentation - 1)
label_rock, _ = nd.label(segmentation)
# overlay image with different labels
image_label_overlay = label2rgb(label_rock, image=rocket_wh)
 
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(24, 16), sharey=True)
ax1.imshow(rocket_wh)
ax1.contour(segmentation, [0.8], linewidths=1.8, colors='w')
ax2.imshow(image_label_overlay)
 
fig.subplots_adjust(**margins)

Producción: 

Mapas de elevación




Referencias:

Publicación traducida automáticamente

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