Optimisation du traitement des images

L'auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

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 !

(ಠ_ಠ) visite Drozor

+0 -0
Staff

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.

+0 -0
Auteur du sujet

des statistiques avec des pourcentages de couleurs ;). (Osef des statistiques, ça ça marche :p )
le .net n'est pas obligatoire, mais c'est le langage logiciel que je maitrise le mieux, et que je préfère.

Édité par Aze

(ಠ_ಠ) visite Drozor

+0 -0
Staff

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.

+0 -0
Auteur du sujet

ben les statistiques c'est le la moyenne du nombre de pixel d'affilés de la même couleur. je vais voir OpenCV ;). Python j'aime pas du tout. Niveau C++ je m'y connait moyen mais je verrai.

(ಠ_ಠ) visite Drozor

+0 -0

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.

Édité par simbilou

La répétition est la base de l’enseignement. — ☮ ♡

+0 -0
Staff

Ces statistiques elles ont un but précis ? Ca reste étrange. Les couleurs sont rarement exactement pareil. C'est quoi le but au final? Pourquoi faire ces statistiques ? C'est quoi l'objectif in fine ?

+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

+0 -0
Staff

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.

+0 -0
Auteur du sujet

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 ?

(ಠ_ಠ) visite Drozor

+0 -0
Staff

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.

+0 -0
Auteur du sujet

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.

Si parce qu'il faut que j'y enregistre dans un fichier texte, avant de faire mes stats ;)

(ಠ_ಠ) visite Drozor

+0 -0
Staff

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.

+0 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

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