Advertisement
Eastkap

Convolution de matrices et images

Oct 15th, 2016
133
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.32 KB | None | 0 0
  1. image_t *convoluer(image_t *src, noyau_t *pn){
  2.     image_t *nouvelle=copier_image(src);
  3.      int i,j,k,nombrepixels=src->h*src->w,rang=0, coef, somme, cpt;
  4.      for(i=0;i<nombrepixels;i++){ // on itere de pixel en pixel
  5.          coef=0,somme=0,rang=0;
  6.         for(j=i-((pn->dim-1)/2);j<=i+((pn->dim-1)/2);j++){ // on itere de gauche a droite
  7.             cpt=rang;
  8.             rang++;
  9.             if(i/src->w==j/src->w){ // on teste si i et j sont dans la mm ligne
  10.                 for(k=j-((pn->dim-1)/2)*src->w;k<=j+((pn->dim-1)/2)*src->w;k+=src->w){ // on itere de haut en bas
  11.                     if(k<0 || k>nombrepixels){ // k dehors de limage on applique transformation avec le bord du coup
  12.                         coef+=pn->coeffs[cpt];
  13.                         somme+=pn->coeffs[cpt]*src->buff[j];
  14.                         cpt+=pn->dim;
  15.                     }
  16.                     else{
  17.                         coef+=pn->coeffs[cpt];
  18.                         somme+=pn->coeffs[cpt]*src->buff[k];
  19.                         cpt+=pn->dim;
  20.                     }
  21.                 }
  22.             }
  23.             else{
  24.                 coef+=pn->coeffs[cpt];
  25.                 somme+=pn->coeffs[cpt]*src->buff[i];
  26.                 cpt+=pn->dim;
  27.             }
  28.         }
  29.         switch(coef){
  30.             case 1:
  31.                 if(somme>255){
  32.                     nouvelle->buff[i]=255;
  33.                 }
  34.                 else if(somme<0){
  35.                     nouvelle->buff[i]=0;
  36.                 }
  37.                 else{
  38.                     nouvelle->buff[i]=somme;
  39.                 }
  40.                 break;
  41.  
  42.             case 0:
  43.                 if(somme>255){
  44.                     nouvelle->buff[i]=255;
  45.                 }
  46.                 else if(somme<0){
  47.                     nouvelle->buff[i]=0;
  48.                 }
  49.                 else{
  50.                     nouvelle->buff[i]=somme;
  51.                 }
  52.                 break;
  53.  
  54.             default:
  55.                 coef=(coef>0)?coef:-coef;
  56.                 if(somme/coef>255){
  57.                     nouvelle->buff[i]=255;
  58.                 }
  59.                 else if(somme/coef<0){
  60.                     nouvelle->buff[i]=0;
  61.                 }
  62.                 else{
  63.                     nouvelle->buff[i]=somme/coef;
  64.                 }
  65.                 break;
  66.         }
  67.      }
  68.  
  69.       return nouvelle;
  70.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement