Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 06/06/2007, à 00:10

bodylove

travailler sur une image en c/c++

hello

Voila suite à la lecture de ce tuto et en particulier de la partie "créer/modifier un thème" je me suis mis en tete de faire de la prog sur image. Le thème human-eft dont il est question n'est plus disponible donc je peux pas vraiment m'inspirer.

J'ai un tres mauvais niveau alors si vous pouviez m'aider à décoller, en me donnant quelques pistes comme:
-bibliothèque(s) nécessaires
-de quel facon ouvre t-on l'image tongue
-le travail sur les pixels...
-si vous connaissez des liens interessant sur le sujet?

Hors ligne

#2 Le 06/06/2007, à 00:12

Tehnloss

Re : travailler sur une image en c/c++

va voir le site du zero http://www.siteduzero.com/


"La liberté est une plante qui croît vite, une fois qu'elle a pris racine."
George Washington

Hors ligne

#3 Le 06/06/2007, à 00:20

bodylove

Re : travailler sur une image en c/c++

oui le cours de c/c++ je le connais. J'ai les bases proposées sur ce site mais j'aimerais mettre en application ces connaissances.
en gros le "projet" du taf sur image c'est juste pour me motiver à programmer.

Hors ligne

#4 Le 06/06/2007, à 00:23

Tehnloss

Re : travailler sur une image en c/c++

le tuto OpenGL c'est pas ce que tu cherche ?


"La liberté est une plante qui croît vite, une fois qu'elle a pris racine."
George Washington

Hors ligne

#5 Le 06/06/2007, à 00:33

bodylove

Re : travailler sur une image en c/c++

J'avais pas tilté mais ca va peut etre m'aider en effet, même si je veux pas aller aussi loin.
Je veux juste travailler sur les pixels d'une image 2D, l'agrandir, la modifier...bref ca va pas loin je pense.

mais merci de me rappeler qu'il y a un tut sur openGL, je regarderais ca et j'up ce topic si ca m'aide pas.

Hors ligne

#6 Le 06/06/2007, à 02:24

O1ivier

Re : travailler sur une image en c/c++

Sauf erreur, le tuto OpenGL est conçu pour l'affichage et non pour modifier une image de plus il est orienté 3D et non 2D... Bref je pense plus qu'il cherche une librairie permettant l'édition d'image comme The Gimp doit certainement utiliser. Mais je ne peux répondre de ce coté smile

Hors ligne

#7 Le 06/06/2007, à 07:46

RBC

Re : travailler sur une image en c/c++

Alors, pour lire et charger ton image en mémoire il te suffit d'utiliser les fonctions de base du langage c ou c++ (fopen, sscanf,...)

ensuite tu fait des modifications en modifiant directement l'endoirt de la memoire ou est stoké ton image. Moi j'ai chargé mon image dans un buffer d'unsigned char (pour la place en mémoire)

et puis pour réenregistrer ton image tu prend juste ce qu'il il a en mémoire puis tu le réécrit dans un fichier au format que tu veux (png, jpeg, bmp...), toujours en utilisant les fonctions de base de la bibliothèque, (fprintf,...).

Voil`a c'est pas tr`es complique en soit mais fut avoir un minimum de programmation derrière soit si tu veux pas trop galérer. Au pire si tu veux avoir des infos sur les modifications d'image cherche sur le theme de la segmentation (growing algo, split and merge) ou d'autres ça devrai te donner des idées bien sympa.

RBC

Hors ligne

#8 Le 06/06/2007, à 08:39

murlock

Re : travailler sur une image en c/c++

Quelques liens :
http://fr.wikipedia.org/wiki/Traitement_d'image
http://rockefeller.univ-lyon1.fr/~romeu … ou/mf.html

Le TNI (traitement numérique de l'image) est beaucoup utilisé en astronomie et en biologie.

Tu peux te renseigner aussi sur les transformés de Fourrier 2D qui est un autre moyen de travailler sur les images.


Gloire à mon Saigneur Arioch

Hors ligne

#9 Le 06/06/2007, à 17:35

Catleod

Re : travailler sur une image en c/c++

je me permet de corriger le lien Wikipédia précédant :

http://fr.wikipedia.org/wiki/Traitement_d%27image

Ensuite, que veux tu faire au niveau du traitement ?

Si tu veux reduire une image, un façon de faire, à mon humble avis, est de calculer par un système de maillage à 9 points (en gros tu exprime la valeur en un point comme étant la moyenne pondéré des valeurs aux points proches). Cette méthode ne se limite pas au problème du traitement de l'image. C'est de cette façon, par exemple, qu'on résout les équation de la chaleur pour en déterminer l'équilibre.
Pour agrandir une image, tu peux interpoler linéairement les valeurs pour les nouveaux pixels (mais je n'est jamais essayer en C/C++)

Si tu veux supprimer du bruit sur une image, les transformées en ondelettes ou de Fourier sont des outils puissants et usuel (les transformées en ondelettes sont par exemple utilisées dans la norme de compression JPEG 2000, et contrairement  à ce que tu peux lire sur Wikipédia ne se limite pas à la compression).

Je ne vais pas faire une liste des possibilités de traitement, 1°) parce que je ne les connais pas toutes, 2°) car je ne veux pas y passé la soirée big_smile

Dernière modification par Catleod (Le 06/06/2007, à 19:29)


Ceux qui aiment marcher en rangs sur une musique : ce ne peut être que par erreur qu'ils ont reçu un cerveau, une moelle épinière leur suffirait amplement. (Albert Einstein, Extrait de Comment je vois le monde)

Hors ligne

#10 Le 07/06/2007, à 06:55

slapierre

Re : travailler sur une image en c/c++

Tu peux développer tes algorithmes avec GNU Octave (ou Matlab, si tu en as les moyens!) puis transposer tes trucs en langage C/C++, ces logiciels sont spécialisés dans le calcul matriciel. Tu peux aussi utiliser la librairie GSL (GNU Scientific  Library) pour faire les calculs mathématiques (courbes de Bézier, interpolation et extrapolation, ...). Un bon début serait de faire un code qui génère des matrices de filtrage (filtre passe-bas, passe-haut, ...) pour faire la convolution de ces matrices avec ton image.

J'affirme que tu dois être posséder une librairie qui te permettra de compresser/décompresser les images du format de ton choix que tu ouvres/ferme. La librairie glib (je lance ça au hasard, sinon tappes toi tous le code de Gimp tongue) le fait surement pour toi.

>> Commentaires à des fins de discussions :

@Catleod
la FFT / transformée de cosinus (< JPEG2k) n'est pas très intéressante car elle entraîne la propagation d'abérations chromatiques dans le voisinage d'un point.
Je suis perplexe quant à l'implémentation d'un algo de différences finies, je suis justement en train de travailler sur le problème de la répartition de la chaleur en 2D et une matrice 1000 x 1000 de double prend environ 10 secondes à calculer, avec un code fortement optimisé en vitesse...

@RBC
Ne dois-tu pas décompresser l'image que tu ouvres avant de faire des modifications?
Les transformations de domaine appliquées aux images compressées font que tu travailles à l'aveuglette, par exemple, pour une transformée de Fourrier, la convolution dans le domaine temporel devient une multiplication dans le domaine fréquentiel... Pour la transformée en ondelettes, les propriétés doivent être similaires bien que l'on "ne traite pas toujours avec un espace de Hilbert" (http://www.ondelette.com/forum/FAQ/French/faqondelette/node9.html) -- ce qui revient à dire que le produit scalaire n'est pas toujours défini... Bref il faut absolument décompresser les images pour pouvoir appliquer un algorithe de filtrage, à moins que le traitement se fasse entièrement dans le domaine d'arrivée, ce qui est faisable en Fourrier, mais pour les ondelettes, il faut être vachement musclé!

---
Il apparaît que GNU Octave offre des fonctions pour effectuer le traitement d'images :
http://www.pscom.uji.es/manuals/octave.www/octave_28.html

Simon


"Le spectre de la folie nous empêchera-t-il de hisser l'étendard de l'imagination?" - André Breton

Hors ligne

#11 Le 07/06/2007, à 07:08

slapierre

Re : travailler sur une image en c/c++

Recherche par mot clefs : "gtk image processing", "gtk traitement image", ...

> GTK Processing Home : http://cybernetics.freewebspace.com/gtk/

> Un petit exemple :
http://www.mail-archive.com/gtk-app-devel-list@gnome.org/msg01401.html


"Le spectre de la folie nous empêchera-t-il de hisser l'étendard de l'imagination?" - André Breton

Hors ligne

#12 Le 07/06/2007, à 08:58

Catleod

Re : travailler sur une image en c/c++

slapierre a écrit :

la FFT / transformée de cosinus (< JPEG2k) n'est pas très intéressante car elle entraîne la propagation d'abérations chromatiques dans le voisinage d'un point.

Je suis d'accord avec toi sur l'utilisation de la FFT en elle-même. Néanmoins celle-ci est utilisé dans les algorithmes de déconvolution par inversion et descente de gradient (du moins dans les miens wink ). Je l'ai également utilisée lors de "cross-corrélation". Cela fait de la FFT un outils puissant à mon humble avis.

slapierre a écrit :

Je suis perplexe quant à l'implémentation d'un algo de différences finies, je suis justement en train de travailler sur le problème de la répartition de la chaleur en 2D et une matrice 1000 x 1000 de double prend environ 10 secondes à calculer, avec un code fortement optimisé en vitesse...

Je ne proposai pas les différences finies comme un outils optimal pour le traitement d'images, mais comme un outils intéressant car exploitable dans de nombreux problèmes de discrétisation. 

Pour tes interrogations sur la vitesse, mon programme convergeait plus vite avec l'utilisation d'une maille à 9 points régulières. Quelle discrétisation utilises-tu ? Une façon d'optimiser ce genre de code au niveau de la vitesse, se trouve dans la construction de l'état initiale de la plaque : par exemple, un a priori sur la valeur moyenne de la plaque permet de limiter le nombre d'itération.
Je ne vais pas par contre de donner mes "time" car mon cpu est actuellement en charge pour un travail en cours, dsl


Ceux qui aiment marcher en rangs sur une musique : ce ne peut être que par erreur qu'ils ont reçu un cerveau, une moelle épinière leur suffirait amplement. (Albert Einstein, Extrait de Comment je vois le monde)

Hors ligne

#13 Le 07/06/2007, à 17:04

slapierre

Re : travailler sur une image en c/c++

Catleod à écrit :
Néanmoins celle-ci est utilisé dans les algorithmes de déconvolution par inversion et descente de gradient

Je trouve très intéressante l'idée d'appliquer la FFT à la descente du gradient!!! La différentiation du signal se fait directement, mais est-ce que tu filtres passe-bas ton signal transformé avant de calculer sa dérivée directionnelle? J'ai expérimenté des résultats assez étranges en HF avec des fonctions d'ordre élevés, ouais bon disont que le prof avait choisi sa fonction...

À propos de la distribution de la chaleur : maillage à cinq point, utilisation de la "formule discrétisée d'Euler", je ne voudrais pas dire trop de conneries, mais on dirait bien que c'est une version de la formule de Poisson, lorsque "le membre de droite est non nul". Le temps d'exécution est mesuré seulement pour le calcul de distribution de la chaleur, l'initialisation n'est pas mesurée -- c'est dans le cadre d'un cours sur le traitement en parallèle, on focus donc sur la mesure de la performance du calcul et non pas du programme complet.

Simon


"Le spectre de la folie nous empêchera-t-il de hisser l'étendard de l'imagination?" - André Breton

Hors ligne

#14 Le 07/06/2007, à 21:13

Catleod

Re : travailler sur une image en c/c++

slapierre a écrit :

Je trouve très intéressante l'idée d'appliquer la FFT à la descente du gradient!!! La différentiation du signal se fait directement, mais est-ce que tu filtres passe-bas ton signal transformé avant de calculer sa dérivée directionnelle? J'ai expérimenté des résultats assez étranges en HF avec des fonctions d'ordre élevés, ouais bon disont que le prof avait choisi sa fonction...

Dans le cas de la descente de gradient que j'utilise pour déconvoluer une image, la FFT me sert avant tout à effectuer les convolutions nécessaires (remplacé par de "bêtes" multiplications dans l'espace de Fourier)  (si tu le désir je peux poster la procédure). La FFT en elle même est plus utile dans l'inversion par approximation circulante.

Par contre ton idée est assez intéressante, la descente de gradients ne se limite au problème de traitement d'image, il s'agit avant tout de méthodes de minimisation de critère convergeant rapidement. La question primordiale au problème est la définition du critère. Un problème dans notre cas m'apparaît néanmoins : comment avec un filtre différencies-tu les contours dans l'image avec le bruit en lui même ? as-tu essayé de définir un critère en utilisant un fonction de hilbert ?

slapierre a écrit :

À propos de la distribution de la chaleur : maillage à cinq point, utilisation de la "formule discrétisée d'Euler", je ne voudrais pas dire trop de conneries, mais on dirait bien que c'est une version de la formule de Poisson, lorsque "le membre de droite est non nul". Le temps d'exécution est mesuré seulement pour le calcul de distribution de la chaleur, l'initialisation n'est pas mesurée -- c'est dans le cadre d'un cours sur le traitement en parallèle, on focus donc sur la mesure de la performance du calcul et non pas du programme complet.

Ce qui se cache derrière ta discrétisation est un développement de Taylor (qui, dans le cas d'une maille à cinq points, se trouve derrière le fait que les quatre points périphériques ont le même "poids").
si tu ne cherches "qu'à" mesurer l'efficacité de ta parallélisation, le temps de calcul absolue n'est pas ton problème principale, c'est plutôt le gain relatif en fonction du nombre de processeur en jeu wink. Je doute, en effet, que ton but dans la vie est de déterminer l'état d'équilibre thermique d'une plaque, à la rigueur la diffusion de la chaleur dans un modèle 3D en prenant en compte des effets de convexions big_smile


Ceux qui aiment marcher en rangs sur une musique : ce ne peut être que par erreur qu'ils ont reçu un cerveau, une moelle épinière leur suffirait amplement. (Albert Einstein, Extrait de Comment je vois le monde)

Hors ligne

#15 Le 08/06/2007, à 05:51

slapierre

Re : travailler sur une image en c/c++

Catleod à écrit :
Par contre ton idée est assez intéressante, la descente de gradients ne se limite au problème de traitement d'image, il s'agit avant tout de méthodes de minimisation de critère convergeant rapidement. La question primordiale au problème est la définition du critère. Un problème dans notre cas m'apparaît néanmoins : comment avec un filtre différencies-tu les contours dans l'image avec le bruit en lui même ? as-tu essayé de définir un critère en utilisant un fonction de hilbert ?

Je dois avouer que je suis beaucoup plus familier avec le traitement de signaux électriques échantillonnés qu'avec le traitement d'images. Toutefois, pour les filtres de contour on peut toujours utiliser une combinaison contraste / seuillage (demande toutefois un code plus élaboré pour avoir de bons résultats avec la majorité des images traitées) ou alors la bonne vieille gaussienne! Comme m'a fait remarqué un ami qui s'y connait à fond le domaine : "Ce n'est pas avec toutes les images que l'on obtient de bons résultats, d'où l'importance d'avoir plus d'un tour dans son sac!"

Quant à la descente du gradient, pour obtenir une convergence rapide j'utilise un petit algorithme de relaxation qui fait diminuer le pas lorsqu'on approche du minima (ou, par malheur, d'un des minimums locaux), donc, idéalement, lorsque le nombre d'itérations augmente - le pas est inversement proportionnel au nombre d'itérations? Je ne suis pas aussi optimiste. On peut aussi fixer des valeurs de départ très grossières et répéter la boucle en réinjectant le résultat obtenu. J'ai déjà entendu parlé de recherche de candidats (bornes) avec la bissection ou autre méthode Newtonienne, si vous me permettez l'expression! Aussi, c'est loin dans ma tête mais il me semble avoir vu une méthode de Lagrange pour l'optimisation de fonctions à plusieurs variables parfaite pour le calcul matriciel.

Catleod à écrit :
Je doute, en effet, que ton but dans la vie est de déterminer l'état d'équilibre thermique d'une plaque, à la rigueur la diffusion de la chaleur dans un modèle 3D en prenant en compte des effets de convexions

En effet, il faut débuter par la résolution d'un problème qui doit être assez complexe pour justifier le traitement // tout en demeurant assez simple pour ne pas nous embourber dans des questions qui demandent une connaissance poussée en thermo et en analyse par éléments/différences fini(e)s. Le commentaire est tout à fait pertinent, on teste l'algo sur deux systèmes : une grape de calcul reliées par un lien ethernet et un "mainframe" à mémoire partagée : dans un premier temps, variation de la taille de la plaque, par la suite variation du nombre de CPU pour une taille fixe.

Commentaire : tout et son contraire peuvent être représentés par une développement taylorien autour du point a tongue

---
> À propos de la convergence (FFT) --  Convergence L1 : http://fr.wikipedia.org/wiki/Th%C3%A9or%C3%A8me_de_convergence_monotone

---
edit : ajout d'une balise de formatage, supprimer un "et et"

Dernière modification par slapierre (Le 08/06/2007, à 06:06)


"Le spectre de la folie nous empêchera-t-il de hisser l'étendard de l'imagination?" - André Breton

Hors ligne

#16 Le 08/06/2007, à 09:28

Catleod

Re : travailler sur une image en c/c++

slapierre a écrit :

"Ce n'est pas avec toutes les images que l'on obtient de bons résultats, d'où l'importance d'avoir plus d'un tour dans son sac!"

D'où ma proposition des fonctions de Hilbert, qui sont quadratiques au niveau de leur extrema et linéaire ensuite, avec la possibilité de choisir facilement le seuil entre bruit et contour (malheureusement, on ne peut pas automatiser la sélection du meilleur résultat car c'est purement subjectif). Autre problème, le critère ainsi défini n'est pas quadratique, d'où l'interrogation sur l'existence de minima locaux.

Je n'ai survolé que de (très) loin la // de code, mais si tu connais de bon cours, je suis preneur!


Ceux qui aiment marcher en rangs sur une musique : ce ne peut être que par erreur qu'ils ont reçu un cerveau, une moelle épinière leur suffirait amplement. (Albert Einstein, Extrait de Comment je vois le monde)

Hors ligne

#17 Le 08/06/2007, à 17:01

slapierre

Re : travailler sur une image en c/c++

Tous les départements de génie électrique / logiciel ont un cours de traitement parallèle, est-ce que le statut d'étudiant libre existe en France? Au Québec il est possible de suivre des cours de n'importe quellle faculté, en autant qu'on remplisse les conditions d'admission.

Il n'y a pas beaucoup d'information "de première qualité" sur la Toile, ce sujet ne semble pas encore très populaire pour le moment. Il y a la librairie MPI (Message Passing Interface) qui est un standard, voir le lien vers le CCS de l'université de Sherbrooke, sinon les livres de William Gropp, qui est un des principaux architecte du standard. Naturellement, on peut programmer avec des Pthreads mais dans ce cas il faut partir de zéro, contrairement à MPI, qui offre des fonctions pour partitionner et agglomérer les tâches (par exemple, si on créée une plaque, il y a des fonctions pour la diviser en sous-matrices, chaque sous-matrice est envoyée à un processeur, chaque processeur applique le traitement voulu - passage d'un pointeur de fonction, pour enfin retourner les résultats au processeur maître). Il y a aussi un nouveau standard, OpenMP, mais nous ne sommes pas rendu là dans le cours.

Note à propos de MPI : la distribution Debian et ses dérivées ont un problème avec l'implémentation libre du standard, on se retrouve donc avec un gcc cassé. Le problème est connu mais pas la solution, je donc installé MPI sous Gentoo et ça fonctionne très bien, aucune idée s'il y a des problèmes sous Fedora ou Suse.

---
http://www.ccs.usherbrooke.ca/?t%5B%5D=tt.207


Simon

Dernière modification par slapierre (Le 08/06/2007, à 17:02)


"Le spectre de la folie nous empêchera-t-il de hisser l'étendard de l'imagination?" - André Breton

Hors ligne

#18 Le 08/06/2007, à 17:11

Catleod

Re : travailler sur une image en c/c++

slapierre a écrit :

Tous les départements de génie électrique / logiciel ont un cours de traitement parallèle, est-ce que le statut d'étudiant libre existe en France? Au Québec il est possible de suivre des cours de n'importe quelle faculté, en autant qu'on remplisse les conditions d'admission.

Le statut existe en effet, je choisirais cette solution si le besoin s'en fait sentir et que je trouve du temps pendant ma thèse.

Je te remercie pour toutes ces références, ça me donnera des pistes quand je m'y mettrai.


Ceux qui aiment marcher en rangs sur une musique : ce ne peut être que par erreur qu'ils ont reçu un cerveau, une moelle épinière leur suffirait amplement. (Albert Einstein, Extrait de Comment je vois le monde)

Hors ligne

#19 Le 08/06/2007, à 18:40

slapierre

Re : travailler sur une image en c/c++

Je te remercie pour la discussion, il est rare que l'on échange sur des sujet plus pointus que "béryl ne fonctionne pas" sur ce forum!

Personellement, je te conseille la voie universitaire seulement pour obtenir l'accès à une grape de calcul, le contenu du cours est tellement "free style" que l'on tombe rapidement dans des considérations philosophiques...

Simon


"Le spectre de la folie nous empêchera-t-il de hisser l'étendard de l'imagination?" - André Breton

Hors ligne

#20 Le 29/06/2007, à 12:07

Ronounours

Re : travailler sur une image en c/c++

Pour traiter des images facilement en C++, tu peux utiliser CImg, la bibliothèque template de traitement d'images, dispo à :

http://cimg.sourceforge.net

C'est très facile à utiliser (un simple header à inclure), multi-plateforme, et elle contient pas mal de fonctions toutes faites dont on a généralement besoin quand on fait du traitement d'images.

Hors ligne

#21 Le 30/06/2007, à 11:19

Fabounet

Re : travailler sur une image en c/c++

je peux te conseiller la lib GDK (la sous-couche de GTK, celle qui dessine tes fenetres sous GNOME)

tu ouvres une image (n'importe quel format), tu obtiens un "pixbuf", après tu a accès à des fonctions élémentaires de dessins, et tu peux aussi de travailler pixels par pixels. J'ai fait des fonctions de traitement d'images de terrain numérisé (genre rajouter de l'ombrage sur une vue 2D d'un terrain).

Si tu veux des fonctions de plus haut niveau, tu peux regarder dans le code de GIMP, il y'a une foultitude de filtres et autres.


"Quiconque est prêt à sacrifier sa liberté pour une sécurité provisoire ne mérite ni l'un ni l'autre." (Benjamin Franklin)
>> Changez le look de votre bureau, essayez Glx-Dock ! [http://glx-dock.org] <<

Hors ligne