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: