Segmentación de Imágenes Usando OpenCV y K-means: Unificación de Colores Similares
En el procesamiento de imágenes, la segmentación es una técnica esencial para dividir una imagen en diferentes regiones o grupos de píxeles que comparten características similares. En este artículo, exploraremos cómo podemos aplicar la segmentación para unificar colores similares utilizando OpenCV y el algoritmo de K-means. Este proceso es útil cuando queremos simplificar una imagen, reduciendo la variación de colores en zonas con tonalidades similares, como el agua de una playa o el cielo.
¿Qué es la segmentación de imágenes?
La segmentación de imágenes consiste en dividir una imagen en diferentes partes, generalmente basándose en criterios como el color o la textura. Este proceso es ampliamente utilizado en aplicaciones como la detección de objetos, análisis médico y procesamiento de escenas.
En este caso, usaremos la técnica de K-means clustering, que es un algoritmo de agrupamiento (clustering) que organiza los datos en K grupos diferentes. Cada píxel de la imagen será asignado a uno de estos grupos en función de su color, y luego los colores similares serán reemplazados por un único color promedio del grupo, logrando unificar las tonalidades similares.
Pasos para la unificación de colores usando K-means
- Leer la imagen: Para comenzar, cargamos una imagen de ejemplo en la que queremos unificar los colores. Esto puede ser útil en imágenes con muchas tonalidades, como el agua de una playa, donde se observan distintas variaciones de azul.
- Cambio de espacio de color a LAB: Trabajaremos en el espacio de color LAB (luminancia y dos canales de color) porque permite manejar mejor los colores similares. Este espacio separa el brillo (luminancia) de los colores, lo que es ideal para agrupar tonalidades cercanas.
- Aplicar K-means: Usaremos el algoritmo de K-means para agrupar los píxeles en un número reducido de colores. El valor de K indica cuántos colores diferentes queremos obtener en la imagen final. Cuanto menor sea K, más se unificarán las tonalidades.
- Visualización del resultado: Finalmente, mostramos la imagen segmentada, donde las regiones con colores similares han sido agrupadas en una sola tonalidad, simplificando la imagen.
Código para unificar colores similares con K-means
import cv2
import numpy as np
# Cargar la imagen
img = cv2.imread('3.jpg')
# Convertir la imagen de BGR a LAB (mejor espacio de color para cuantización)
lab_img = cv2.cvtColor(img, cv2.COLOR_BGR2LAB)
# Reestructuramos la imagen para usar KNN (convertimos la imagen a un array 2D)
data = lab_img.reshape((-1, 3))
data = np.float32(data)
# Definir los criterios de K-means
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 10, 1.0)
# Número de clusters (segmentos)
K = 3
_, label, center = cv2.kmeans(data, K, None, criteria, 10, cv2.KMEANS_RANDOM_CENTERS)
# Convertimos de nuevo a 8 bits y restauramos la imagen segmentada
center = np.uint8(center)
res = center[label.flatten()]
quantizedImg = res.reshape((lab_img.shape))
# Convertir de vuelta a BGR para visualizar
quantizedImgbgr = cv2.cvtColor(quantizedImg, cv2.COLOR_LAB2BGR)
# Mostrar la imagen segmentada y con colores unificados
cv2.imshow('Imagen Original', img)
cv2.imshow('Imagen Cuantizada con Colores Unificados', quantizedImgbgr)
cv2.waitKey(0)
cv2.destroyAllWindows()
Imagen original:
Resultado:
Explicación del código
- Carga de la imagen: Se usa la función
cv2.imread()
para cargar la imagen en formato BGR (Blue, Green, Red), que es el formato por defecto de OpenCV. - Conversión al espacio LAB: Convertimos la imagen al espacio LAB, que separa la información de color en componentes de luminancia (L) y dos componentes de color (A y B). Esto ayuda a segmentar colores similares de una manera más precisa.
- Agrupamiento con K-means: Definimos el número de colores deseados a través de K, que indica la cantidad de clusters. Usamos el algoritmo K-means para agrupar los colores en clusters representativos y luego reasignamos cada píxel de la imagen a su cluster correspondiente.
- Visualización del resultado: Finalmente, convertimos la imagen segmentada de vuelta al formato BGR para visualizarla y mostrar cómo se han unificado los colores similares.
Aplicaciones Prácticas
Este proceso de cuantización de colores puede ser útil en una variedad de aplicaciones:
- Procesamiento de imágenes industriales: Para analizar objetos de una manera más clara y reducir la variación de colores en las piezas producidas.
- Fotografía y diseño: Para simplificar una imagen y darle un estilo artístico al reducir el número de colores.
- Visión artificial: Cuando se trabaja con imágenes de baja resolución o cámaras con un rango de color limitado, es útil reducir los colores para facilitar el análisis.
Conclusión
La segmentación de imágenes mediante K-means es una técnica poderosa para unificar tonalidades similares en una imagen. Esta técnica puede ser usada en diversas áreas de visión artificial y diseño gráfico, simplificando la complejidad de los colores y facilitando el análisis o el tratamiento posterior de las imágenes.
Si quieres seguir aprendiendo más sobre cómo aplicar técnicas avanzadas de procesamiento de imágenes con Python, sigue atento a las publicaciones de nuestro blog y no dudes en probar este código por ti mismo. ¡La práctica es clave para dominar estas herramientas!