Ailleurs dans ce fil, user1149913 fournit d'excellents conseils (définir un modèle probabiliste) et du code pour une approche puissante (estimation EM). Deux problèmes restent à résoudre:
Comment gérer les écarts par rapport au modèle probabiliste (ce qui est très évident dans les données de 2011-2012 et quelque peu évident dans les ondulations des points moins inclinés).
Comment identifier de bonnes valeurs de départ pour l'algorithme EM (ou tout autre algorithme).
Pour résoudre le problème n ° 2, utilisez une transformation de Hough . Il s'agit d'un algorithme de détection de caractéristiques qui, pour rechercher des étendues linéaires de caractéristiques, peut être efficacement calculé comme une transformation de Radon .
Xyx , ydans la transformation de Hough. Lorsque les entités du graphe d'origine suivent une ligne commune ou se rapprochent suffisamment d'une ligne, les ensembles de courbes qu'elles produisent dans la transformation de Hough tendent à avoir une intersection commune correspondant à cette ligne. En trouvant ces points de plus grande intensité dans la transformation de Hough, nous pouvons lire de bonnes solutions au problème initial.
Pour commencer à utiliser ces données, j'ai d'abord découpé les éléments auxiliaires (axes, graduations et étiquettes) et, pour faire bonne mesure, découpé les points manifestement périphériques en bas à droite et saupoudrés le long de l'axe du bas. (Lorsque cette opération n'est pas supprimée, la procédure fonctionne toujours correctement, mais elle détecte également les axes, les images, les séquences linéaires de graduations, les séquences linéaires d'étiquettes et même les points situés sporadiquement sur l'axe inférieur!)
img = Import["http://i.stack.imgur.com/SkEm3.png"]
i = ColorNegate[Binarize[img]]
crop2 = ImageCrop[ImageCrop[i, {694, 531}, {Left, Bottom}], {565, 467}, {Right, Top}]
(Ceci et le reste du code sont dans Mathematica .)
A chaque point de cette image correspond une plage de courbes étroite dans la transformation de Hough, visible ici. Ce sont des ondes sinusoïdales:
hough2 = Radon[crop2, Method -> "Hough"] // ImageAdjust
Cela montre visuellement que la question est un problème de regroupement de lignes : la transformation de Hough la réduit à un problème de regroupement de points auquel nous pouvons appliquer n'importe quelle méthode de regroupement.
Dans ce cas, le regroupement est tellement clair qu'un simple post-traitement de la transformation de Hough a suffi. Pour identifier les emplacements de plus grande intensité dans la transformation, j'ai augmenté le contraste et rendu floue la transformation sur un rayon d'environ 1%: cela est comparable aux diamètres des points de tracé de l'image d'origine.
blur = ImageAdjust[Blur[ImageAdjust[hough2, {1, 0}], 8]]
Seuil du résultat réduit à deux blobs minuscules dont les centroïdes identifient raisonnablement les points de plus grande intensité: ceux-ci estiment les lignes ajustées.
comp = MorphologicalComponents[blur, 0.777]) // Colorize
0,777
Le côté gauche de l'image correspond à une direction de 0 degré (horizontal) et, en regardant de gauche à droite, cet angle augmente linéairement jusqu'à 180 degrés. En interpolant, je calcule que les deux blobs sont centrés à 19 et 57,1 degrés, respectivement. Nous pouvons également lire les interceptions à partir des positions verticales des blobs. Cette information donne les ajustements initiaux:
width = ImageDimensions[blur][[1]];
slopes = Module[{x, y, z}, ComponentMeasurements[comp, "Centroid"] /.
Rule[x_, {y_, z_}] :> Round[((y - 1/2)/(width - 1)) 180., 0.1]
]
{19., 57,1}
De la même manière, on peut calculer les intersections correspondant à ces pentes, en donnant ces ajustements:
(La ligne rouge correspond au minuscule point rose de la photo précédente et la ligne bleue à la plus grande goutte aqua.)
Dans une large mesure, cette approche a automatiquement résolu le premier problème: les écarts par rapport à la linéarité effacent les points d'intensité maximale, mais ne les modifient généralement pas beaucoup. Franchement, les points périphériques contribueront au bruit de bas niveau tout au long de la transformation de Hough, qui disparaîtra au cours des procédures de post-traitement.
À ce stade, vous pouvez fournir ces estimations en tant que valeurs de départ pour l'algorithme EM ou pour un minimiseur de vraisemblance (qui, avec de bonnes estimations, convergeront rapidement). Cependant, il serait préférable d’utiliser un estimateur de régression robuste tel que les moindres carrés repondérés de manière itérative . Il est capable de fournir un poids de régression à chaque point. Des poids faibles indiquent qu'un point n'appartient pas à une ligne. Exploitez ces poids, si vous le souhaitez, pour affecter chaque point à la ligne appropriée. Ensuite, après avoir classé les points, vous pouvez utiliser les moindres carrés ordinaires (ou toute autre procédure de régression) séparément sur les deux groupes de points.