algorithm - algoritmo - Segmentación de imágenes usando Mean Shift explicado
mean shift python (2)
¿Podría alguien ayudarme a entender cómo funciona realmente la segmentación Mean Shift?
Aquí hay una matriz de 8x8 que acabo de inventar
103 103 103 103 103 103 106 104
103 147 147 153 147 156 153 104
107 153 153 153 153 153 153 107
103 153 147 96 98 153 153 104
107 156 153 97 96 147 153 107
103 153 153 147 156 153 153 101
103 156 153 147 147 153 153 104
103 103 107 104 103 106 103 107
Usando la matriz anterior, ¿es posible explicar cómo la segmentación Mean Shift separaría los 3 niveles diferentes de números?
Una segmentación Mean-Shift funciona de la siguiente manera:
Los datos de la imagen se convierten en espacio de funciones
En su caso, todo lo que tiene son valores de intensidad, por lo que el espacio de características será solo unidimensional. (Podría calcular algunas características de textura, por ejemplo, y su espacio de características sería bidimensional, y estaría segmentando en función de la intensidad y la textura)
Las ventanas de búsqueda se distribuyen en el espacio de características
La cantidad de ventanas, el tamaño de la ventana y las ubicaciones iniciales son arbitrarias para este ejemplo, algo que se puede ajustar según las aplicaciones específicas
Iteraciones Mean-Shift:
1.) Las MEDIDAS de las muestras de datos dentro de cada ventana se computan
2.) Las ventanas se CAMBIAN a las ubicaciones iguales a sus medios previamente calculados
Los pasos 1.) y 2.) se repiten hasta la convergencia, es decir, todas las ventanas se han establecido en las ubicaciones finales
Las ventanas que terminan en las mismas ubicaciones se fusionan
Los datos se agrupan según los recorridos de ventana
... por ejemplo, todos los datos que fueron atravesados por las ventanas que terminaron en, por ejemplo, la ubicación "2", formarán un clúster asociado con esa ubicación.
Entonces, esta segmentación (casualmente) producirá tres grupos. Ver esos grupos en el formato de imagen original puede parecerse a . Elegir diferentes tamaños de ventanas y ubicaciones iniciales puede producir resultados diferentes.
Lo básico primero:
La segmentación Mean Shift es una técnica de homogeneización local que es muy útil para amortiguar las diferencias de sombreado o tonalidad en objetos localizados. Un ejemplo es mejor que muchas palabras:
Acción: reemplaza cada píxel con la media de los píxeles en un vecindario rango-r y cuyo valor está dentro de una distancia d.
The Mean Shift toma generalmente 3 entradas:
- Una función de distancia para medir distancias entre píxeles. Por lo general, se puede usar la distancia euclidiana, pero cualquier otra función de distancia bien definida. La distancia de Manhattan es otra opción útil a veces.
- Un radio Todos los píxeles dentro de este radio (medidos según la distancia anterior) se contabilizarán para el cálculo.
- Una diferencia de valor De todos los píxeles dentro del radio r, tomaremos solo aquellos cuyos valores están dentro de esta diferencia para calcular la media
Tenga en cuenta que el algoritmo no está bien definido en las fronteras, por lo que las diferentes implementaciones le darán resultados diferentes allí.
No voy a discutir los detalles matemáticos sangrientos aquí, ya que son imposibles de mostrar sin la notación matemática adecuada, no disponible en , y también porque se pueden encontrar en buenas fuentes en otros lugares .
Miremos el centro de su matriz:
153 153 153 153
147 96 98 153
153 97 96 147
153 153 147 156
Con opciones razonables de radio y distancia, los cuatro píxeles centrales obtendrán el valor de 97 (su media) y serán diferentes de los píxeles adyacentes.
Vamos a calcularlo en Mathematica . En lugar de mostrar los números reales, mostraremos un código de color, por lo que es más fácil entender lo que está sucediendo:
El código de color para su matriz es:
Entonces tomamos un cambio medio razonable:
MeanShiftFilter[a, 3, 3]
Y obtenemos:
Donde todos los elementos centrales son iguales (a 97, BTW).
Puede repetir varias veces con Mean Shift, tratando de obtener una coloración más homogénea. Después de algunas iteraciones, llega a una configuración estable no isótropa:
En este momento, debe quedar claro que no puede seleccionar cuántos "colores" obtiene después de aplicar Mean Shift. Entonces, mostremos cómo hacerlo, porque esa es la segunda parte de su pregunta.
Lo que necesita para poder establecer la cantidad de clústeres de salida por adelantado es algo así como la agrupación de Kmeans .
Se ejecuta de esta manera para su matriz:
b = ClusteringComponents[a, 3]
{{1, 1, 1, 1, 1, 1, 1, 1},
{1, 2, 2, 3, 2, 3, 3, 1},
{1, 3, 3, 3, 3, 3, 3, 1},
{1, 3, 2, 1, 1, 3, 3, 1},
{1, 3, 3, 1, 1, 2, 3, 1},
{1, 3, 3, 2, 3, 3, 3, 1},
{1, 3, 3, 2, 2, 3, 3, 1},
{1, 1, 1, 1, 1, 1, 1, 1}}
O:
Lo cual es muy similar a nuestro resultado anterior, pero como puede ver, ahora solo tenemos tres niveles de salida.
HTH!