IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Traitement d'images Discussion :

Convolution trop lente...


Sujet :

Traitement d'images

  1. #1
    Membre éclairé

    Inscrit en
    Juin 2004
    Messages
    1 397
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 1 397
    Points : 763
    Points
    763
    Par défaut Convolution trop lente...
    Salut !
    J'utilise une librairie nommée ImageFilter, qui contient un certain nombre de méthodes de traitement du signal appliquées à l'image.
    Le fait est qu'il existe un méthode pour appliquer une matrice 3x3 (par convolution, donc), mais elle est lente, même sur de petites images !
    Pouvez-vous m'aider à l'améliorer ?
    Existe-t-il des méthodes rapides pour ce genre de convolution ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
     
    function applyMatrix3x3($matrix)
     
    	{
     
    		$info=$this->getImageSize();
     
    		$img2=$this->imagecreate($info['w']-2,$info['h']-2);
     
     
     
    		for($x=1;$x<$info['w']-1;$x++)
     
    		{
     
    			for($y=1;$y<$info['h']-1;$y++)
     
    			{
     
    				$r=$g=$b=0;
     
     
     
    				for($Mx=0;$Mx<3;$Mx++)
     
    				{
     
    					for($My=0;$My<3;$My++)
     
    					{
     
    						$rgb=imagecolorat($this->resourceImage,$x-1+$Mx,$y-1+$My);
     
     
     
    						$r += $matrix[$Mx][$My]*(($rgb >> 16) & 0xFF); //r
     
    						$g += $matrix[$Mx][$My]*(($rgb >>  8) & 0xFF); //g
     
    						$b += $matrix[$Mx][$My]*(($rgb      ) & 0xFF); //b
     
    					}
     
    				}
     
    				$r=min(255,max(0,$r));
     
    				$g=min(255,max(0,$g));
     
    				$b=min(255,max(0,$b));
     
     
     
    				if(!isset($cols[$r][$g][$b]))
     
    				{
     
    					//on minimise les allocation de couleur
     
    					$cols[$r][$g][$b]=imagecolorallocate($img2,$r,$g,$b);
     
    				}
     
    				imagesetpixel($img2,$x-1,$y-1,$cols[$r][$g][$b]);
     
    			}
     
    		}
     
    		imagedestroy($this->resourceImage);
     
    		$this->resourceImage=$img2;
     
    	}
    Ce code est écrit en PHP, mais je pense qu'il est suffisament clair pour être considéré comme du code quelconque. Peu importe les méthodes, ce qui compte, c'est l'application de la matrice, je pense.
    Aucune réponse à une question technique par MP.
    Ce qui vous pose problème peut poser problème à un(e) autre

    http://thebrutace.labrute.fr

  2. #2
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    La convolution, ça consomme beaucoup de temps de calcul. Le mieux, c'est de faire une FFT de ton image et de la matrice 3x3 - en fait, tu vas faire une FFT sur l'image avec 3 pixels en plus dans toutes les dimensions, et pour la matrice de convolution, tu rajoutes les dims de ton image -, tu fais le produit et tu refais une FFT iverse sur le résultat. Tu auras alors l'image résultat
    Bon, le truc, c'est que normalement pour du 3x3, c'est pas si coûteux quand même.

  3. #3
    Membre actif Avatar de ronan99999
    Inscrit en
    Juillet 2003
    Messages
    279
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Juillet 2003
    Messages : 279
    Points : 299
    Points
    299
    Par défaut
    Miles: On a interet à passer en fréquence, pour filtrer que pour des noyaux de taille importante pour un noyau 3*3 théoriquement ce serait plus couteux de passer en frequence que de faire une convolution direct.

    Progman: Ce n'est que la partie filtrage qui est longue ou toute l'execution du code (allocation + filtrage + destruction) peut etre es-ce dut à l'allocation???
    Sinon as tu pensé à séparer ton filtre (si il est séparable bien sure).
    Si tu ne te plantes pas, comment veux tu pousser?

  4. #4
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    C'est ce que j'indique dans ma dernière phrase, c'est quand même pas normal...

  5. #5
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Points : 9 818
    Points
    9 818
    Par défaut
    On dirait du php... C'est peut être pas le mieux pour faire du traîtement d'image.

    Sinon, pour convoluer une image avec une matrice 3*3, c'est vrai que cela ne devrait pas être très lent (enfin, si tu le fais sur une image 5000 * 5000, ça va prendre un peu de temps, c'est sûr).
    Je ne répondrai à aucune question technique en privé

  6. #6
    Membre éclairé

    Inscrit en
    Juin 2004
    Messages
    1 397
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 1 397
    Points : 763
    Points
    763
    Par défaut
    Millie: Ce post date de Septembre 2005...
    C'était du PHP, oui (c'est écrit dans le premier post), et c'était l'intérêt de la chose.
    Depuis, j'ai lâché l'affaire, mais merci quand même .
    Aucune réponse à une question technique par MP.
    Ce qui vous pose problème peut poser problème à un(e) autre

    http://thebrutace.labrute.fr

  7. #7
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Points : 9 818
    Points
    9 818
    Par défaut
    Désolé, mais en fait, je cherchais une aide en traitement de l'image et donc j'ai parcouru tous les posts concernant ce type de sujet, mais j'ai pas du tout fait attention à la date... Enfin, spa grave, ça peut servir pour qq d'autre qui serait interessé par ça.
    Je ne répondrai à aucune question technique en privé

Discussions similaires

  1. OpenGL trop lent pour la 2D !!!
    Par kagemusha dans le forum OpenGL
    Réponses: 17
    Dernier message: 14/12/2005, 11h06
  2. [Eclipse] Editeur de code trop lent
    Par Benzeghiba dans le forum Eclipse Java
    Réponses: 6
    Dernier message: 10/11/2005, 14h02
  3. boucle while trop lente
    Par atouze dans le forum Access
    Réponses: 17
    Dernier message: 15/06/2005, 16h35
  4. [SAGE] ODBC trop lent
    Par tileffeleauzed dans le forum Décisions SGBD
    Réponses: 1
    Dernier message: 14/11/2004, 09h56
  5. Envoi de mail trop lent
    Par MASSAKA dans le forum ASP
    Réponses: 3
    Dernier message: 15/10/2004, 10h57

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo