Mesure statistique pour savoir si une image est constituée de régions distinctes connectées spatialement

14

Considérez ces deux images en niveaux de gris:

rivière Aléatoire

La première image montre un modèle de rivière sinueuse. La deuxième image montre un bruit aléatoire.

Je cherche une mesure statistique que je peux utiliser pour déterminer s'il est probable qu'une image montre un modèle de rivière.

L'image de la rivière a deux zones: rivière = valeur élevée et partout ailleurs = valeur faible.

Le résultat est que l'histogramme est bimodal:

entrez la description de l'image ici

Par conséquent, une image avec un motif de rivière devrait avoir une variance élevée.

Cependant, l'image aléatoire ci-dessus fait de même:

River_var = 0.0269, Random_var = 0.0310

D'autre part, l'image aléatoire a une faible continuité spatiale, alors que l'image de la rivière a une continuité spatiale élevée, ce qui est clairement montré dans le variogramme expérimental: entrez la description de l'image ici

De la même manière que la variance "résume" l'histogramme en un seul nombre, je recherche une mesure de continuité spatiale qui "résume" le variogramme expérimental.

Je veux que cette mesure "punisse" la semi-variance élevée aux petits retards plus durement qu'aux gros retards, j'ai donc trouvé:

 svuner=h=1nγ(h)/h2

Si j'additionne seulement de lag = 1 à 15, j'obtiens:

River_svar = 0.0228, Random_svar = 0.0488

Je pense qu'une image de rivière devrait avoir une variance élevée, mais une variance spatiale faible, donc j'introduis un rapport de variance:

 runetjeo=vuner/svuner

Le résultat est:

River_ratio = 1.1816, Random_ratio = 0.6337

Mon idée est d'utiliser ce ratio comme critère de décision pour savoir si une image est une image de rivière ou non; rapport élevé (par exemple> 1) = rivière.

Des idées sur la façon dont je peux améliorer les choses?

Merci d'avance pour n'importe quelle réponse!

EDIT: Suivant les conseils de whuber et Gschneider, voici le Morans I des deux images calculées avec une matrice de poids à distance inverse de 15x15 en utilisant la fonction Matlab de Felix Hebeler :

River_M Random_M

J'ai besoin de résumer les résultats en un seul numéro pour chaque image. Selon wikipedia: "Les valeurs vont de -1 (indiquant une dispersion parfaite) à +1 (corrélation parfaite). Une valeur nulle indique un modèle spatial aléatoire." Si je résume le carré du Morans I pour tous les pixels, j'obtiens:

River_sumSqM = 654.9283, Random_sumSqM = 50.0785 

Il y a une énorme différence ici, donc Morans semble être une très bonne mesure de continuité spatiale :-).

Et voici un histogramme de cette valeur pour 20 000 permutations de l'image de la rivière: histogramme des permations

De toute évidence, la valeur River_sumSqM (654.9283) est peu probable et l'image de la rivière n'est donc pas spatialement aléatoire.

Andy
la source
4
Question interessante. Un conseil qui me vient immédiatement à l'esprit est de se concentrer sur la partie à courte portée du variogramme: c'est la partie cruciale et fera le meilleur travail pour distinguer des paires d'images comme celles-ci. (Les statistiques étroitement liées sont le Moran I et le Geary C. ) Cependant, il est difficile de donner des conseils spécifiques, sauf si vous pouvez caractériser plus clairement les types d'images que vous prévoyez de traiter.
whuber
2
+1 whuber, Moran's I semble être un bon début dans ce cas. Ensuite, envisagez peut-être un test de permutation pour voir à quel point votre image est «extrême».
Gschneider
@Gschneider Le test de permutation est une bonne idée, surtout parce qu'aucune permutation ne doit être effectuée! Il est simple de calculer la distribution du variogramme (ou le Moran's I ou le Geary C ou autre) sous permutations des valeurs dans l'image: il y a tellement de valeurs que le CLT s'applique. (Par exemple, le variogramme ressemblera aux points verts; le double de leur hauteur constante correspond à la variance des valeurs de l'image.) Le problème devient plus difficile lorsqu'un motif "rivière" doit être distingué d'autres motifs tels qu'un "lac" ou les "rivières" peuvent avoir des largeurs très variables.
whuber
Désolé, mais je ne suis pas sûr de suivre: vous me dites de permuter l'image testée pixel par pixel de façon aléatoire, puis de comparer la valeur I de Moran de l'image permutée avec celle de l'image testée?
Andy
Ce que j'avais à l'esprit était d'abord de définir une sorte de structure de quartier (probablement simple) et de calculer le I. de Moran. Ensuite, vous pouvez calculer K, disons 200000, permutations possibles des pixels, en calculant le I de Moran pour chaque permutation. Une fois que vous avez ces 200 000 Moran, je vois où se trouve votre statistique observée. Mais, la méthode de whuber semble plus facile :).
Gschneider

Réponses:

1

Je pensais qu'un flou gaussien agit comme un filtre passe-bas laissant la structure à grande échelle derrière et supprimant les composants à nombre d'onde élevé.

Vous pouvez également regarder l'échelle des ondelettes nécessaires pour générer l'image. Si toutes les informations vivent dans les ondelettes à petite échelle, ce n'est probablement pas la rivière.

Vous pourriez envisager une sorte d'auto-corrélation d'une ligne de la rivière avec elle-même. Donc, si vous avez pris une rangée de pixels de la rivière, même avec du bruit, et trouvé la fonction de corrélation croisée avec la ligne suivante, vous pouvez à la fois trouver l'emplacement et la valeur du pic. Cette valeur va être beaucoup plus élevée que ce que vous obtiendrez avec le bruit aléatoire. Une colonne de pixels ne produira pas beaucoup de signal à moins que vous ne choisissiez quelque chose de la région où se trouve la rivière.

http://en.wikipedia.org/wiki/Gaussian_blur

http://en.wikipedia.org/wiki/Cross-correlation

EngrStudent - Réintégrer Monica
la source
1
Quelques idées intéressantes ici! Puis-je vous persuader d'étoffer cette réponse en appliquant une ou plusieurs de vos approches aux exemples d'images pour (1) montrer comment fonctionnent vos méthodes et (2) évaluer leur performance?
whuber
1
C'est de ma thèse. (Génie mécanique) J'ai mis un flou gaussien sur la position d'un pendule non linéaire, puis j'ai utilisé la méthode de convolution pour reculer la position d'une image et la comparer à l'analyse. Je l'ai essayé avec plusieurs niveaux de bruit. Tant que le bruit était inférieur à un seuil lié à la taille du gaussien, la reconstruction était très bonne. lien La figure 11 était le graphique pertinent pour la reconstruction. La figure 6 et l'équation 2 indiquent la réponse au bruit.
EngrStudent
Merci! Il semble donc que vous soyez en excellente position pour étoffer cette réponse et démontrer son efficacité réelle. :-)
whuber
Désolé pour le double commentaire. Je pense qu'il est "intelligent" d'utiliser une partie d'un objet comme une pseudo "ondelette mère" pour lui-même. Cela semble auto-référentiel, mais aussi poétique. Auto-Adjoint.
EngrStudent
1

C'est un peu tard, mais je ne résiste pas à une suggestion et une observation.

Premièrement, je pense qu'une approche plus "de traitement d'image" peut être mieux adaptée qu'une analyse histogramme / variogramme. Je dirais que la suggestion de "lissage" d'EngrStudent est sur la bonne voie, mais la partie "flou" est contre-productive. Ce qu'il faut, c'est un lisseur préservant les bords , comme un filtre bilatéral ou un filtre médian . Ils sont plus sophistiqués que les filtres à moyenne mobile, car ils sont nécessairement non linéaires .

Voici une démonstration de ce que je veux dire. Vous trouverez ci-dessous deux images rapprochant vos deux scénarios, ainsi que leurs histogrammes. (Les images sont chacune 100 par 100, avec des intensités normalisées).

Images brutes images brutes

Pour chacune de ces images, j'applique ensuite un filtre médian 5 x 5 15 fois *, qui adoucit les motifs tout en préservant les bords . Les résultats sont montrés plus bas.

Images lissées images lissées

(* L'utilisation d'un filtre plus grand maintiendrait toujours le contraste net sur les bords, mais lisserait leur position.)

Notez comment l'image "rivière" a toujours un histogramme bimodal, mais elle est maintenant bien séparée en 2 composantes *. Pendant ce temps, l'image "bruit blanc" a toujours un histogramme unimodal à un seul composant. (* Facilement seuillé via, par exemple la méthode d'Otsu , pour créer un masque et finaliser la segmentation.)


XF[y] .

(Désolé pour la diatribe ... ma formation était en tant que géomorphologue, à l'origine)

GeoMatt22
la source
Soit dit en passant, c'est généralement une bonne idée d'être très prudent en appliquant des "méthodes variogrammes" aux images naturelles, qui ne sont généralement pas stationnaires. Ceci est abordé dans ma réponse ici .
GeoMatt22
0

Une suggestion qui peut être un gain rapide (ou qui peut ne pas fonctionner du tout, mais qui peut facilement être éliminée) - avez-vous essayé de regarder le rapport de la moyenne à la variance des histogrammes d'intensité d'image?

Prenez l'image de bruit aléatoire. En supposant qu'il est généré par des photons émis de manière aléatoire (ou similaire) frappant une caméra, et que chaque pixel est également susceptible d'être touché, et que vous avez les lectures brutes (c'est-à-dire que les valeurs ne sont pas redimensionnées ou sont redimensionnées de manière connue, vous pouvez annuler) , alors le nombre de lectures dans chaque pixel doit être distribué par poisson; vous comptez le nombre d'événements (photons frappant un pixel) qui se produisent dans une période de temps fixe (temps d'exposition) plusieurs fois (sur tous les pixels).

Dans le cas où il y a une rivière de deux valeurs d'intensité différentes, vous avez un mélange de deux distributions de poisson.

Un moyen très rapide de tester une image pourrait alors consister à examiner le rapport de la moyenne à la variance des intensités. Pour une distribution de poisson, la moyenne sera approximativement égale à la variance. Pour un mélange de deux distributions de poisson, la variance sera supérieure à la moyenne. Vous finirez par avoir besoin de tester le rapport des deux par rapport à un certain seuil prédéfini.

C'est très grossier. Mais si cela fonctionne, vous pourrez calculer les statistiques suffisantes nécessaires en un seul passage sur chaque pixel de votre image :)

Tapoter
la source