Produit de convolution

Résolu
alka - Modifié par BunoCS le 12/05/2016 à 16:11
cs_louis14 Messages postés 793 Date d'inscription mardi 8 juillet 2003 Statut Membre Dernière intervention 10 février 2021 - 23 mai 2016 à 10:40
Bonjour,
j'ai voulu faire le produit de convolution d'une image par une matrice carrée d'ordre 3 voici la procédure. j'ai besoins de votre coup de main pourqu'il marche

Mat produit(Mat im ,int tab[3][3])
{
 Mat dset;
 int somme = 0;
 for (int i =1; i <= im.rows; i++)
 {
  for (int j = 1; j <= im.cols; j++)
  {
   for (int x = 1; x <= 3; x++)
   {
    for (int y = 1; y <= 3; y++)
    {
   somme = somme + (int)im.at<uchar>[i][j] * tab[y + i][x + j];
    }
   }
   dset = somme;
  }
 }
 return dset;
}


EDIT : Ajout des balises de code (la coloration syntaxique).
Explications disponibles ICI

Merci d'y penser dans tes prochains messages.
A voir également:

3 réponses

cs_louis14 Messages postés 793 Date d'inscription mardi 8 juillet 2003 Statut Membre Dernière intervention 10 février 2021 8
23 mai 2016 à 10:40
Rebonjour,
Ton premier problème vient du fait que dans tes boucles, tu ne commences pas à l'indice 0. Les indices des tableaux sont toujours de 0 à taille-1.
Je pense qu'il faut que tu fasses ton code tout seul, sinon il suffit d'utiliser notre ami Google pour trouver le code qui existe sur pas mal de site de traitement d'image.
Bonne continuation
1
cs_louis14 Messages postés 793 Date d'inscription mardi 8 juillet 2003 Statut Membre Dernière intervention 10 février 2021 8
18 mai 2016 à 08:34
Bonjour,
Il faut déjà revoir les points suivants
1. il faudrait commencer à utiliser les bons indices des tableaux en sachant qu'ils commencent toujours à 0.
Remplace déjà toutes les instructions "for" par
for (int x = 0; x < Taille_tableau; i++)
{

}

2.Ensuite il y a la déclaration de dset qui doit prendre la même taille que l'image. L'allocation dynamique du tableau avec les paramètres de l'image est nécessaire.
3.En dernier lieu ,il faut affecter la somme à la case dset traitée
dset[i][j] = somme;

4. il faut normaliser la somme par rapport au nombre de points de la matrice de convolution , ici 9 .
dset[i][j] = somme/9;


Bonne suite de codage.
0
merci de votre réponse cs_Louis mais j'ai pas compris la méthode de remplacement de toutes les boucles " for " par
for (int x = 0; x < Taille_tableau; i++)
{

}si possible corrigé moi le code afin de bien marché. aussi j'ai réfléchi pour une autre méthode elle aussi elle a de lacune là voila
void produit2(int A[100][100] ,int tab[3][3])
{
int som = 0 ,mm,nn,ii,jj;
for (int i =0; i < 3; i++)
{
for (int j = 0; j < 3; j++)
{
for (int x = 0; x < 3; x++)
{
xx = 3-1-x;
for (int y = 0; y < 3; y++)
{
yy = 3-1-y;
ii = i+(x - 3/2);
jj = j+(y - 3/2);
if( ii>=0 && ii<5 && jj >= 0 && jj <5)
som += A[ii][jj] * tab[xx][yy];

}
}
P[i][j] = som;
}
}
}
0
Rejoignez-nous