Sujet : Re: Algèbre linéaire et string art
De : efji (at) *nospam* efi.efji (efji)
Groupes : fr.sci.mathsDate : 20. Jan 2025, 10:56:23
Autres entêtes
Organisation : A noiseless patient Spider
Message-ID : <vml6k9$31l7r$1@dont-email.me>
References : 1
User-Agent : Mozilla Thunderbird
Amusant, je n'avais jamais entendu parler de ça.
Le 19/01/2025 à 12:00, Julien Arlandis a écrit :
Bonjour,
J'essaye de développer un algorithme rapide et efficace pour représenter des images en niveaux de gris par le string art. Il s'agit de relier un ensemble de points (généralement matérialisés par des clous plantés dans une planche) par un fil tendu jusqu'à s'approcher au plus près de l'image désirée. Pour la suite, on considèrera que les points sont régulièrement espacés sur un cercle de rayon R.
Intuitivement, on peut être tenté de modéliser le problème par un espace vectoriel constitué des N(N-1)/2 segments formés par chaque paire de points. Cette idée est plus rigoureusement exprimée dans cette vidéo :
<https://www.youtube.com/watch?v=WGccIFf6MF8>
La vidéo explique très bien tout ce qu'il faut savoir de l'approche "directe", de type algèbre linéaire, et dit pourquoi ça ne marche pas bien. Elle propose à la fin un algo qui marche raisonnablement, mais on pense tout de suite au scanner médical et à la transformée de Radon.
https://www.youtube.com/watch?v=dBlSmg5T13MBingo! la seconde vidéo développe la méthode utilisant la transformée de Radon de façon super claire. Problem solved. Je ne pense pas qu'on puisse faire mieux.
Merci d'avoir indiqué cette chaine youtube qui contient plein de choses intéressantes, mais hélas rien sur les nombres complexes pour les débiles mentaux :)
Sous cette approche, le problème se modélise par l'équation matricielle :
somme(a_i * x_i) = b
où a_i est le i ème vecteur (image matricielle du segment i)
x_i est le nombre de fils reliant le segment i
b l'image à atteindre.
Sachant que la famille de vecteurs a_i ne forment pas une famille génératrice complète, (il est facile à comprendre qu'une image constituée d'un cadre blanc périphérique ne pourra pas être générée sans assombrir la partie blanche), quelle est la limite et la pertinence de cette approche ?
Non, ce n'est pas la bonne approche pour deux raisons, bien expliquées dans la video :
1/ le passage d'un "fil" à une ligne de pixels ne doit pas se faire naïvement car sinon on privilégie certaines directions. C'est le même problème que l'aliasing en image. La vidéo propose une sorte de profil élargi des fils permettant de traiter ce problème de façon heuristique et "perceptive".
2/ même si on néglige le point 1, le problème n'est pas linéaire car on doit chercher des a_i dans {0,1} et pas dans \R. Résoudre de façon classique, par moindres carrés, le problème linéaire surdéterminé que tu indiques va donner des a_i réels quelconques, y compris des négatifs qui n'ont pas de sens. Minimiser ||somme(a_i * x_i) - b||^2 avec la contrainte a_i = 0 ou 1 est un problème appelé "bang-bang" très difficile à résoudre, qui a plein de mauvaises propriétés (en particulier il est non convexe).
Pour ma part j'ai commencé à coder une méthode itérative qui consiste à partir d'un point arbitraire pour relier le point dont le segment s'approche au plus près de l'image à construire. Ce n'est pas assez
Ca a peu de chances de marcher. On doit même pouvoir construire des images pour lesquelles ça ne marche pas du tout. Et puis "le segment qui s'approche au plus près" ne doit pas être simple à trouver, sauf à tester tout exhaustivement. Ensuite il faut soustraire le segment choisi de l'image et tout recommencer pour l'itération suivante. Un bel algo en n^3 :)
satisfaisant car en comparant le résultat avec d'autres programmes, le rendu est légèrement moins esthétique.
Vous pouvez essayer l'un de ces programmes en ligne :
<https://halfmonty.github.io/StringArtGenerator/>
-- F.J.