Primero lo básico:
La segmentación de cambio medio es una técnica de homogeneización local que es muy útil para amortiguar las diferencias de tonalidad o sombreado en objetos localizados. Un ejemplo es mejor que muchas palabras:
Acción: reemplaza cada píxel con la media de los píxeles en una vecindad rango-r y cuyo valor está dentro de una distancia d.
El cambio medio toma generalmente 3 entradas:
- Una función de distancia para medir distancias entre píxeles. Por lo general, la distancia euclidiana, pero podría usarse 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 tendrán en cuenta 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 diferentes implementaciones le darán resultados diferentes allí.
NO discutiré los detalles matemáticos sangrientos aquí, ya que son imposibles de mostrar sin la notación matemática adecuada, no están disponibles en StackOverflow, y también porque se pueden encontrar en buenas fuentes en otros lugares .
Veamos 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.
Calculémoslo en Mathematica . En lugar de mostrar los números reales, mostraremos un código de colores, por lo que es más fácil comprender lo que está sucediendo:
El código de colores para su matriz es:
Luego tomamos un cambio medio razonable:
MeanShiftFilter[a, 3, 3]
Y obtenemos:
Donde todos los elementos centrales son iguales (a 97, BTW).
Puede iterar 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 no isotrópica estable:
En este momento, debe quedar claro que no puede seleccionar cuántos "colores" obtendrá 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 el número de clústeres de salida de antemano es algo así como el clúster Kmeans .
Funciona 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!