Alguém poderia me ajudar a entender como a segmentação Mean Shift realmente funciona?
Aqui está uma matriz 8x8 que acabei de criar
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 a matriz acima, é possível explicar como a segmentação do deslocamento médio separaria os 3 níveis diferentes de números?
Respostas:
O básico primeiro:
A segmentação por deslocamento médio é uma técnica de homogeneização local muito útil para amortecer diferenças de sombreamento ou tonalidade em objetos localizados. Um exemplo é melhor do que muitas palavras:
Ação: substitui cada pixel pela média dos pixels em uma vizinhança de alcance r e cujo valor está dentro de uma distância d.
A mudança média leva geralmente 3 entradas:
Observe que o algoritmo não está bem definido nas bordas, portanto, diferentes implementações fornecerão resultados diferentes lá.
NÃO discutirei os detalhes matemáticos sangrentos aqui, pois eles são impossíveis de mostrar sem a notação matemática adequada, não disponível no StackOverflow, e também porque podem ser encontrados em boas fontes em outros lugares .
Vejamos o centro de sua matriz:
Com opções razoáveis de raio e distância, os quatro pixels centrais obterão o valor de 97 (sua média) e serão diferentes dos pixels adjacentes.
Vamos calcular no Mathematica . Em vez de mostrar os números reais, exibiremos um código de cores, para que seja mais fácil entender o que está acontecendo:
O código de cores para sua matriz é:
Em seguida, tomamos uma mudança média razoável:
E nós temos:
Onde todos os elementos centrais são iguais (a 97, BTW).
Você pode iterar várias vezes com Mean Shift, tentando obter uma coloração mais homogênea. Depois de algumas iterações, você chega a uma configuração não isotrópica estável:
Neste momento, deve ficar claro que você não pode selecionar quantas "cores" deseja obter após aplicar o deslocamento médio. Então, vamos mostrar como fazer, porque essa é a segunda parte da sua pergunta.
O que você precisa para ser capaz de definir o número de clusters de saída com antecedência é algo como cluster de Kmeans .
Funciona assim para sua matriz:
Ou:
Que é muito semelhante ao nosso resultado anterior, mas como você pode ver, agora temos apenas três níveis de saída.
HTH!
fonte
Uma segmentação de deslocamento médio funciona mais ou menos assim:
Os dados da imagem são convertidos em espaço de recurso
No seu caso, tudo que você tem são valores de intensidade, então o espaço de recursos será apenas unidimensional. (Você pode calcular alguns recursos de textura, por exemplo, e então seu espaço de recurso seria bidimensional - e você estaria segmentando com base na intensidade e textura)
As janelas de pesquisa são distribuídas no espaço de recursos
O número de janelas, tamanho da janela e locais iniciais são arbitrários para este exemplo - algo que pode ser ajustado dependendo de aplicativos específicos
Iterações de deslocamento médio:
1.) Os MEANs das amostras de dados em cada janela são calculados
2.) As janelas são deslocadas para os locais iguais aos seus meios calculados anteriormente
As etapas 1.) e 2.) são repetidas até a convergência, ou seja, todas as janelas se fixaram nas localizações finais
As janelas que terminam nos mesmos locais são mescladas
Os dados são agrupados de acordo com as travessias de janela
... por exemplo, todos os dados que foram percorridos por janelas que terminaram, digamos, no local “2”, formarão um cluster associado a esse local.
Portanto, essa segmentação (coincidentemente) produzirá três grupos. Visualizar esses grupos no formato de imagem original pode parecer algo como a última imagem na resposta de belisarius . A escolha de tamanhos de janela e locais iniciais diferentes pode produzir resultados diferentes.
fonte