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 :

Masque de convolution


Sujet :

Traitement d'images

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Inscrit en
    Janvier 2003
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 9
    Par défaut Masque de convolution
    Bonjour je cherche un algorithme de convolution, j'explique : je veux appliquer un masque (de taille 3*3 ou 5*5) à un tableau bidimensionnel.

    Connaissez vous un algo rapide pouvant faire ça.

    J'avais entendu parler de l'algo de KARATSUBA de multiplications de matrice, quelqu'un l'a t'il adapté à la convolution ?

    Ma matrice est creuse (i.e. c'est un tableau représentant une image, un tableau de 622*622 cases avec moins de 10000 points contenant une valeur non nulle) appliquer un masque à tout mon tableau serait une perte de temps. Une idée, une solution ?

  2. #2
    Membre émérite
    Avatar de Kangourou
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    579
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 579
    Par défaut
    Salut,

    Une solution classique pour accelerer la convolution (mais peut-etre pas forcement la plus adaptee dans ce cas) est de passer par la transformee de Fourier :
    en effet, la transfomee de fourier d'un produit de convolution est egale au produit des transformees de Fourier de chaque signal. Comme la FFT est rapide, ca permet de faire une convolution lineaire (il me semble...)
    ca te donne :
    conv(img, filtre) = ifft( fft(img) * fft(fil))

    A+

  3. #3
    Ol'
    Ol' est déconnecté
    Membre actif
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 56
    Par défaut
    Tu peux essayer de décomposer ta matrice de convolution en produit de convolution de deux vecteurs. Cela fait tomber la complexité de ton algo d'un degré.

    Ensuite, tu utilises la distributivité du produit de convolution

    J'espère que cela pourra t'aider

    A+
    Ol'

  4. #4
    Membre averti
    Inscrit en
    Juin 2002
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 58
    Par défaut
    salut
    a mon avis
    tu dois faire une convoluiton normale mais, il ne faut pas se tromper de sens:

    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
    B=conv(A,K) K est ton masque
    for(i sur les X de A)
    for(j sur les Y de A){
       si A(i,j)<>0
       alors{
          for(ii sur les X de K)
          for(jj sur les Y de K){
            B(i-ii,j-jj)=B(i-ii,j-jj)+A(i,j)*K(ii,jj)
          }
       }
    }
     
    et pas 
     
    for(i sur les X de A)
    for(j sur les Y de A){
        for(ii sur les X de K)
        for(jj sur les Y de K){
          B(i-ii,j-jj)=B(i-ii,j-jj)+A(i,j)*K(ii,jj)
        }
    }
    je ne suis pas sur d'avoir eté clair... mais bon
    bye
    Vic

  5. #5
    Membre habitué
    Inscrit en
    Janvier 2003
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 9
    Par défaut
    j'ai bien compris, c'est la méthode basique d'une convolution, je voulais en fait surtout savoir si dans le cas de matrice (500*500 environs) creuses (uniquement 1500 points valides i.e. 1500 points de valeur non nulle), il existait d'autres méthodes plus rapides ! Sinon l'algo le plus rapide de multiplication de matrices est celui de KARATSUBA (cf + haut) est ce qu'il a été adapté pour des masques de convolution ? Est ce quelqu'un à un bout de code de cet algo que je pourrai adapter, car j'en ai entendu parler, mais je ne l'ai pas encore vu (comme le père noël ... désolé )


    je viens de trouver une adresse :
    http://gersoo.free.fr/docs/docs.html
    Il ya l'algo de KARASUBA et bien d'autres choses

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 5
    Par défaut masque de convolution
    puisque vous parlez du masque de convolution je demande juste de savoir comment on calcule le masque en 3*3 ou 5*5 et la je parle du coté purement théorique.

    merci d avance pour votre réponse

    cordialement
    fadoua

  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
    Par défaut
    La convolution n'a aucun rapport avec la multiplication matricielle.

    Si le masque de convolution est gros, comme l'a dit Kangourou, il faut passer dans le domaine de Fourier.

    Tu peux regarder :
    http://humbert-florent.developpez.co...ement/fourier/

    http://humbert-florent.developpez.co.../introduction/

  8. #8
    Membre confirmé
    Inscrit en
    Avril 2006
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 36
    Par défaut
    L'algorithme de Karatsuba est à l'origine destiné au produit de polynômes, d'après le principe du diviser pour mieux régner. En réalité cette méthode permet de réduire le nombre de multiplications au détriment du nombre d'additions / soustractions, dans la mesure où le coût de ces opérations est moindre.

    En gros, l'idée est de ramener le produit de polynômes de degrés quelconques à une succession de produits de polynômes du premier degré, lesquels sont optimisés de la façon suivante :
    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
     
    {
      double p1[2] = { /* coeff. du 1er polynome */ };
      double p2[2] = { /* coeff. du 2nd polynome */ };
      double p3[3];  /* produit de p1 par p2 */
      double temp1, temp2, temp3;
     
      temp1 = p1[0] * p2[0];
      temp2 = (p1[0] + p1[1]) * (p2[0] + p2[1]);
      temp3 = p1[1] * p2[1];
     
      p3[0] = temp1;
      p3[1] = temp2 - temp3 - temp1;
      p3[2] = temp3;
    }
    La convolution 1D étant une opération similaire au produit de polynôme (en considérant un signal comme un polynôme dont les coefficients correspondent aux éléments du signal), on peut y employer cet algorithme. J'ai pu le vérifier en l'implémentant par moi-même, avant de l'étendre à des signaux 2D (il y a quelques temps déjà), donc si tu veux quelque détails je dois pouvoir t'aider.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 6
    Dernier message: 30/04/2012, 10h25
  2. Réponses: 0
    Dernier message: 30/03/2012, 14h52
  3. produit de convolution avec masque gaussien 13*13?
    Par AYDIWALID dans le forum Images
    Réponses: 1
    Dernier message: 31/12/2010, 14h13
  4. Réponses: 0
    Dernier message: 18/12/2010, 12h44
  5. Convolution d'une image par plusiers masques
    Par khcomm dans le forum Images
    Réponses: 11
    Dernier message: 18/05/2008, 16h08

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