Détection de rivières sinueuses en images

14

J'ai surfaces: z i ( x , y ) avec un attribut mesuré (variable) sur chaque surface: a i ( x , y ) . La plupart des surfaces auront une distribution aléatoire de l'attribut à travers la surface, mais certaines surfaces (les plus intéressantes) montreront un motif de rivière sinueuse:nzje(X,y)uneje(X,y)

entrez la description de l'image ici

J'ai besoin de votre aide pour trouver une mesure qui nous dira lesquelles des surfaces sont les plus susceptibles d'avoir un tel motif.n

Il existe de nombreuses cartes possibles avec le même histogramme comme indiqué ci-dessous; la mesure doit donc "récompenser" la continuité spatiale. Pour illustrer cela, j'ai créé une image aléatoire avec presque le même histogramme que l'image de la rivière: entrez la description de l'image ici

Ainsi, les statistiques d'image comme entropie ne peuvent être qu'une partie de la solution.

Voici un exemple d'image sans motif de rivière sinueuse: entrez la description de l'image ici

Mes images sont synthétiques (made in Matlab). Dans la vie réelle, l'image sans le motif peut avoir une continuité spatiale un peu plus sous la forme de petites taches de valeur similaire.

Voici les images en niveaux de gris:

entrez la description de l'image ici entrez la description de l'image ici

Andy
la source
1
Pouvez-vous publier des images réelles (sans axe, palette, histogramme, afin que nous puissions essayer différents algorithmes?). Aussi: La "rivière sinueuse" est-elle réellement un sinus, ou peut-elle avoir une forme quelconque?
Niki Estner
1
Salut Nikie. Dans mon exemple (données synthétiques faites dans Matlab), la rivière est un sinus. Dans la vraie vie, c'est "comme un sinus"; parfois, il s'écarte de la ligne médiane, parfois non.
Andy

Réponses:

13

Une mesure très simple serait de comparer chaque ligne de l'image avec la ligne au-dessus, permettant un décalage horizontal.

J'ai piraté ensemble cet algorithme simple dans Mathematica:

Mean[MapThread[
  Function[{line1, line2},
   Min[Table[Norm[line1 - RotateLeft[line2, shift]], {shift, -5, 5}]]
   ], {s[[2 ;;]], s[[;; -2]]}]]

Il prend simplement chaque paire de rangées adjacentes, fait pivoter l'une des rangées de -5..5 pixels et prend la plus petite distance euclidienne. Cela donne une distance euclidienne pour chaque paire de lignes. Je prends simplement la moyenne (mais selon vos données réelles, une moyenne ou une médiane tronquée pourrait être plus robuste).

Ce sont les résultats que j'obtiens pour les échantillons générés artificiellement (Formule: Normaliser (bruit aléatoire * (1 facteur) + signal * facteur))

entrez la description de l'image ici

Si je trace le résultat par rapport à la force du signal, l'algorithme semble mesurer assez bien la "force du signal de la rivière sinueuse":

entrez la description de l'image ici

EDIT : j'ai oublié de normaliser les échantillons d'entrée. Correction d'une nouvelle image de résultat téléchargée

Niki Estner
la source
Bonne réponse. Cependant, je pense que votre mesure peut être trompée par une autre courbe continue, comme une ligne droite. J'améliorerais cela un peu en modifiant la dernière étape pour ajuster un sinus aux points (x, y) que vous avez trouvés, avec une certaine amplitude, phase et fréquence. Ensuite, l'amplitude peut servir de mesure à la "force de la rivière".
Andrey Rubshtein
4

Vous semblez être sur la bonne voie avec cet histogramme. S'il s'agit d'une image représentative de votre échantillon, cet histogramme montre que les images où le motif de méandres est présent peuvent être détectées simplement en examinant si elles contiennent des valeurs supérieures à un certain seuil.

En dehors de cela, vous pouvez essayer d'obtenir l' entropie de chaque image. Cela vous donnera un numéro par image qui caractérise son caractère aléatoire. Après cela, vous pouvez obtenir un histogramme des entropies de vos images. Si vous êtes sûr que les images sont distinctement divisées en "totalement aléatoire" et "aléatoire avec un méandre" (c'est-à-dire moins aléatoire), alors l'histogramme des entropies sera bimodal. Le mode gauche correspondra à des images avec une entropie plus faible et donc moins aléatoire (plus susceptibles de contenir un motif sinueux) et vice versa pour le mode droit.

(BTW MATLAB comprend une fonction pertinente )

EDIT: En réponse aux commentaires du PO et au téléchargement ultérieur de plus d'informations sur le problème, voici un point supplémentaire à cette réponse:

L'entropie fonctionnerait toujours, mais pas le cas simple et sans mémoire décrit par la formule de Shannon (où chaque échantillon d'une série chronologique est supposé être indépendant des précédents).

Comme alternative plus simple, vous pouvez essayer d'examiner les caractéristiques de l' autocorrélation de l'image .

A_A
la source
Salut A_A. Je pense que les statistiques d'image font partie de la solution, mais il faut pondérer les pixels voisins d'une manière ou d'une autre pour récompenser la continuité spatiale (voir la carte d'attribut aléatoire ci-dessus).
Andy
Bonjour, je suis d'accord et j'ai augmenté la réponse.
A_A