Optimisation du traitement des images

Le problème exposé dans ce sujet a été résolu.

Bonjour :)
Dans un soft que je développe, en VB.net, je doit récupérer la couleur de tout les pixels d'une image, pour ensuite y traiter. Ce que je fait actuellement, c'est deux boucle imbriquée, une pour les lignes, et une pour les colonnes. et je récupère la couleur :

1
2
3
4
5
6
7
8
Dim width As Integer = img.Width
Dim height As Integer = img.Height

For y = 1 To height - 1
 For x = 1 To width - 1
  couleurs = couleurs & img.GetPixel(x, y)
 Next
Next

c'est ultra long !!!! vu que le fait pour chaque pixel^^
j'ai pensé a décomposer le code des images, mais je n'ai pas réussi a comprendre comment ça marche :/.

Auriez vous une idée d'optimisation, ou sauriez vous comment décomposer le code d'une image ?

Merci d'avance !

+0 -0

Pour avoir déjà essayé, ce genre de code en .net est inefficace. Une solution qui fonctionnait bien en C# était de passer le module en mode unsafe et de le faire avec des pointeurs. Mais je ne sais pas si c'est possible en VB. Je pense que le mieux pour toi est de prendre une lib adapté native. Tu veux faire quoi de toutes ces valeurs ? Il y a fort a parier que des lib comme opencv ai ce que tu souhaite d'implémenter nativement et avec des bindings .net.

Si le type de statistiques est important car en fonction du type je pourrais te dire ce que c'est et le nom "officiel".

Bref si tu veux vraiment le faire a la main, le C++ est le plus adapté. Sinon, je le redis, pour le traitement d'image, OpenCv est la lib de référence et si il y a un binding .net tu peux probablement le faire en deux lignes. Sinon faut que tu trouve une lib de traitement vectoriel. Typiquement en python avec numpy.

D’affilés dans quel sens ? Parce que si tu t’y prend naïvement ça va dépendre de comment tu parcours ton image. Après c’est peut être pertinent pour ce que tu veux faire, je ne sais pas, mais ça me semble curieux.

+0 -0

Dans ce cas la ce pourrait etre utile d'utiliser une fragmentation de l'image et d'analyser ces fragments au lieu des pixels. Comme dit au dessus je suis pas sur qu'il y est en .net mais en C# c'est sur, et au pire Java il y a puisqu'un de mes profs a fait utilisé une lib dans ce genre

Ces statistiques n'ont aucuns buts, c'est juste par pur curiosité, je me suis demandé quels couleurs on retrouve le plus dans des images.

Aze

Facile, de manière individuelle c'est le blanc et le noire.

Pour ce genre de chose il te faut absolument des libs de calculs vectoriels pour jouer à ça. Le problème de ta question est qu'elle est plus compliqué que prévu. Deux couleurs peuvent avoir des valeurs différentes et etre très proche. Pire, les compressions tel que le jpg vont introduire des légers changement colorimétrique.

Pour ce genre d'analyse il vaut mieux faire a minima un histogramme 3d pour s'affranchir des faibles variations ou, mieux, utiliser un algo de clusterisation.

En passant le module en mode unsafe, j'ai réussi a améliorer grandement les performances :) seul problème, dans ma boucle j'ajoute la couleur récupéré a une variable de type texte avec .ToArgb en y ajoutant dans un tableau je gagnerai en temps non ?

+0 -0

Probablement. Pour ce genre de chose il vaut mieux pré-allouer un gros tableau et ne regarder que les valeurs numérique (sans convertir en string donc). Mais du coup il n'y a plus aucun intéret à collecter ces infos, c'est ta méthode qui fait les stats qui va parcourir le tableau directement.

Je reste très dubitatif sur l'interet de tes stats par contre.

Pourquoi passer par un fichier de texte si de toute façon tu va repasser sur tous les pixels ? Pourquoi ne pas itérer directement sur l'image pour faire tes stats ?

En passant par un fichier de texte tu va passer d'une représentation compact et binaire à une représentation inefficace textuelle. J'ai du mal a voir l'interet de passer par cette étape intermédiaire.

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte