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

C++ Discussion :

Lissage (filtre deriche)


Sujet :

C++

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 38
    Par défaut Lissage (filtre deriche)
    Bonjour je voudrais comprendre, comment marche le lissage en x et y pour une image donné , ceci permettant d'utilisé un filtrage de deriche.

    Je vous fait parvenir le code si vous pouvez m'éclaicir un peu.

    Code C++ : 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
    void HorizontalSmoothing (CImg<double> in, CImg<double> & out, double alpha)
    {
    	double a1,b1,c1,d1,a2,b2,c2,d2,ea,b;
    	int dx=in.dimx(), dy=in.dimy();
    	CImg<double> B1(dx);
    	CImg<double> B2(dx);
     
    	ea = exp(-alpha);
    	b = (1-ea)*(1-ea)/(1+2*alpha*ea - ea*ea);
    	a1 = b;
    	a2 = b*ea * (alpha+1);
    	b1 = b * ea * (alpha-1);
    	b2 = -b *ea *ea;
    	c1 = 2 * ea;
    	c2 = c1;
    	d1 = -ea * ea;
    	d2 = d1;
     
    	for (int j=0; j<dy; j++)
    	{
    		B1(0) = in(0,j) * (a1+b1) / (1-c1-d1);
    		B1(1) = in(1,j) * a1 + b1 * in(0,j) + B1(0) * (c1+d1);
    		for (int i=2; i<dx; i++)
    			B1(i) = a1 * in(i,j) + b1 * in(i-1, j) + c1 * B1(i-1) + d1 * B1(i-2) ;
     
    		B2(dx-1) = in(dx-1,j) * (a2+b2)/(1-c2-d2);
    		B2(dx-2) = in(dx-2,j) * a2 + in(dx-1,j) * b2 + B2(dx-1) * (c2+d2);
    		for (int i=dx-3; i>=0; i--)
    			B2(i) = a2 * in(i,j) + b2 * in(i+1,j) + c2 * B2(i+1) + d2 * B2(i+2);
     
    		for (int i=0; i<dx; i++)
    			out(i,j) = B1(i) + B2(i);
    	}
    }

    Merci encore.

  2. #2
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Par défaut
    Citation Envoyé par nicodu43 Voir le message
    Bonjour je voudrais comprendre, comment marche le lissage en x et y pour une image donné , ceci permettant d'utilisé un filtrage de deriche.

    Je vous fait parvenir le code si vous pouvez m'éclaicir un peu.

    Code C++ : 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
    void HorizontalSmoothing (CImg<double> in, CImg<double> & out, double alpha)
    {
    	double a1,b1,c1,d1,a2,b2,c2,d2,ea,b;
    	int dx=in.dimx(), dy=in.dimy();
    	CImg<double> B1(dx);
    	CImg<double> B2(dx);
     
    	ea = exp(-alpha);
    	b = (1-ea)*(1-ea)/(1+2*alpha*ea - ea*ea);
    	a1 = b;
    	a2 = b*ea * (alpha+1);
    	b1 = b * ea * (alpha-1);
    	b2 = -b *ea *ea;
    	c1 = 2 * ea;
    	c2 = c1;
    	d1 = -ea * ea;
    	d2 = d1;
     
    	for (int j=0; j<dy; j++)
    	{
    		B1(0) = in(0,j) * (a1+b1) / (1-c1-d1);
    		B1(1) = in(1,j) * a1 + b1 * in(0,j) + B1(0) * (c1+d1);
    		for (int i=2; i<dx; i++)
    			B1(i) = a1 * in(i,j) + b1 * in(i-1, j) + c1 * B1(i-1) + d1 * B1(i-2) ;
     
    		B2(dx-1) = in(dx-1,j) * (a2+b2)/(1-c2-d2);
    		B2(dx-2) = in(dx-2,j) * a2 + in(dx-1,j) * b2 + B2(dx-1) * (c2+d2);
    		for (int i=dx-3; i>=0; i--)
    			B2(i) = a2 * in(i,j) + b2 * in(i+1,j) + c2 * B2(i+1) + d2 * B2(i+2);
     
    		for (int i=0; i<dx; i++)
    			out(i,j) = B1(i) + B2(i);
    	}
    }

    Merci encore.
    Dériver un algorithme d'un code aussi peu lisible me semble difficile. Ceci dit, son idée est la suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    pour chaque ligne J de l'image
      pour chaque pixel I de la ligne
        out(I,J) = op(in, J, I-2, I-1, I, I+1, I+2)
    Ou, en clair, chaque pixel de chaque ligne est créé en appliquant une formule complexe sur le pixel correspondant de la même ligne de l'image source - cette opération touchant le pixel en question ainsi que les deux plus proches à droite et à gauche. Des cas particuliers sont prévus pour traiter les pixels du bord de l'image.

    L'opération en elle même est trop complexe pour être compréhensible. Il s'agit d'affecter à chaque pixel un poids, calculé grâce à une formule complexe que je ne reconnais pas.

    Ensuite, la question est difficilement compréhensible : soit ta fonction fait ce qu'il faut faire, et c'est très bien. Soit elle ne fait pas ce qu'il faut faire, et tu dois la modifier ou la refaire. S'il faut la modifier, et vu que je ne comprends pas l'algorithme de base, je ne peux pas donner d'indication sur la partie qu'il faut modifier.

    Donc : est-ce que tu pourrais préciser ton problème ? D'ou est-ce que tu part, quel est le problème dans le code actuel, qu'est-ce qui ne marche pas, pourquoi, et ce qu'il faut faire ?

    Bref : des informations et des questions, de manière à ce qu'on puisse comprendre.
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

Discussions similaires

  1. filtre de canny-deriche
    Par ouss747 dans le forum Images
    Réponses: 10
    Dernier message: 29/05/2011, 16h09
  2. Réponses: 0
    Dernier message: 14/05/2011, 11h50
  3. Lissage par filtre RIF
    Par fatenov dans le forum Signal
    Réponses: 2
    Dernier message: 06/10/2009, 15h18
  4. [Débutant] filtre de Deriche sous matlab
    Par Imène_23 dans le forum Images
    Réponses: 1
    Dernier message: 31/05/2009, 11h12
  5. Filtre de lissage ISEF
    Par malikakika dans le forum C++Builder
    Réponses: 1
    Dernier message: 06/08/2007, 20h16

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