Uso de KMeans en la biblioteca sklearn para implementar agrupación y segmentación de imágenes en color
Este artículo no habla de teoría, sólo de aplicación.
Además de la biblioteca sklearn, también necesitamos algunas bibliotecas de procesamiento de imágenes. Presenté las siguientes bibliotecas:
Utilizo la biblioteca pylab para leer imágenes:
La img leída en este momento es una matriz tridimensional tridimensional con una forma de (altura, ancho, 3), donde 3 representa el número de canales, es decir, tres canales RGB.
Sin embargo, el parámetro pasado por KMeans debe ser una matriz bidimensional, por lo que debe descomponerse en dos dimensiones:
En esta estructura, solo necesita usar el El método más simple:
Hay muchos parámetros. Cuando construyo otros parámetros además de n_clusters, uso los valores predeterminados:
Luego, uso fit() para el entrenamiento:
Después de la agrupación, hay muchos parámetros, dos de los cuales son más importantes y deben usarse aquí:
Una vez completada la agrupación, es necesario volver a colorear cada píxel y todos los píxeles de la misma categoría se Debe rellenarse con el color del centro de este grupo.
Antes de esto, primero debes obtener la altura y el ancho de la imagen:
Primero, recrea una imagen con image.new(). La sintaxis se ve así:
Luego necesitas usar el método putpixel() para llenar los píxeles, pero antes debes cuidar algunos pequeños detalles:
En un Mapa RGB, cada uno Los canales son todos números enteros entre 0 y 255, pero el tipo de elemento en kmeans.cluster_centers_ es float64, por lo que se necesita un poco de procesamiento para cambiar los elementos al tipo int32 antes de completarlos.
No es apropiado cambiar el tipo directamente, porque kmeans.cluster_centers_ es algo similar al valor de un atributo después de todo, y el nombre es demasiado largo, así que cámbielo por uno más corto. Así que simplemente haga otra copia y use astype para cambiar el tipo de datos.
Como se mencionó anteriormente, kmeans.labels_ es una matriz 1D, pero la imagen es 2D, por lo que puedes recuperarla:
Luego puedes completar los píxeles:
Aquí debemos prestar atención al método putpixel(), sus dos parámetros:
Finalmente, guarda la imagen:
Usé Da Qiao de "Glory of Kings" en las fotos de prueba: