Atribuições de pixel consistentes em ClusteringComponents?
Eu tenho um grande conjunto de dados de micrografias SEM que estou tentando segmentar de forma binária por meio de ClusteringComponents, e parece ser o método mais preciso em comparação com as outras funções de binarização, por exemplo, Binarização morfológica.
No entanto, embora os clusters sejam precisos, ele atribui os grupos de pixels claros ou escuros em ordem essencialmente aleatória. No entanto, suspeito que isso ocorre quando o contraste é baixo.
Consigo reproduzir este problema com imagens de exemplo. Na primeira imagem, os pixels escuros são atribuídos a 0, enquanto na segunda imagem, os pixels claros são atribuídos a 0.
test=ExampleData[{"TestImage","Man"}]
clustered=ClusteringComponents[test,2,PerformanceGoal->"Quality"];
Image[clustered - 1, "Bit"]
test2=ExampleData[{"TestImage","Tank2"}]
clustered2=ClusteringComponents[test2,2,PerformanceGoal->"Quality"]
Como posso obtê-lo de forma que atribua consistentemente os componentes de pixel escuro a 0 ou 1 ??
Respostas
OK, então vou postar minha solução improvisada até agora:
Use a imagem binarizada do cluster para gerar uma máscara da imagem original
Testar a intensidade média de pixels da área mascarada vs a média global para verificar se os clusters pretos correspondem às áreas escuras
Condicionalmente ColorNegate os valores que não correspondem
clusterColorTestFunction[testImage_] := Module[{clustered,mask,globalMean,maskedMean}, clustered=ClusteringComponents[testImage,2,PerformanceGoal->"Quality"]; mask=Image[clustered - 1, "Bit"]; globalMean=ImageMeasurements[testImage,"Mean"]; maskedMean=ImageMeasurements[testImage,"Mean",Masking->mask]; Which[globalMean>maskedMean,ColorNegate[mask],globalMean <maskedMean,mask] ]; clusterColorTestFunction[#]&/@{test,test2}
No entanto, se houver uma solução dentro da funcionalidade de clustering, adoraria ouvi-la