Attributions de pixels cohérentes dans ClusteringComponents?
J'ai un grand ensemble de données de micrographies SEM que j'essaie de segmenter binairement via ClusteringComponents, et cela m'a semblé être la méthode la plus précise par rapport aux autres fonctions de binarisation, par exemple la binarisation morphologique.
Cependant, bien que les clusters soient précis, il attribue les groupes de pixels sombres ou clairs dans un ordre essentiellement aléatoire. Cependant je soupçonne que cela se produit lorsque le contraste est faible.
Je suis capable de reproduire ce problème avec des images d'exemple. Sur la première image, les pixels sombres reçoivent 0, tandis que sur la deuxième image, les pixels clairs sont attribués à 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"]
Comment puis-je l'obtenir pour qu'il attribue systématiquement les composants de pixels sombres à 0 ou 1?
Réponses
OK donc je vais poster ma solution jerry-rigged pour l'instant:
Utilisez l'image de cluster binarisée pour générer un masque de l'image d'origine
Test de l'intensité moyenne des pixels de la zone masquée par rapport à la moyenne globale pour vérifier si les amas noirs correspondent aux zones sombres
Conditionally ColorNegate les valeurs qui ne correspondent pas
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}
Cependant, s'il existe une solution dans la fonctionnalité de clustering, j'aimerais l'entendre