Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- image_t *convoluer(image_t *src, noyau_t *pn){
- image_t *nouvelle=copier_image(src);
- int i,j,k,nombrepixels=src->h*src->w,rang=0, coef, somme, cpt;
- for(i=0;i<nombrepixels;i++){ // on itere de pixel en pixel
- coef=0,somme=0,rang=0;
- for(j=i-((pn->dim-1)/2);j<=i+((pn->dim-1)/2);j++){ // on itere de gauche a droite
- cpt=rang;
- rang++;
- if(i/src->w==j/src->w){ // on teste si i et j sont dans la mm ligne
- 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
- if(k<0 || k>nombrepixels){ // k dehors de limage on applique transformation avec le bord du coup
- coef+=pn->coeffs[cpt];
- somme+=pn->coeffs[cpt]*src->buff[j];
- cpt+=pn->dim;
- }
- else{
- coef+=pn->coeffs[cpt];
- somme+=pn->coeffs[cpt]*src->buff[k];
- cpt+=pn->dim;
- }
- }
- }
- else{
- coef+=pn->coeffs[cpt];
- somme+=pn->coeffs[cpt]*src->buff[i];
- cpt+=pn->dim;
- }
- }
- switch(coef){
- case 1:
- if(somme>255){
- nouvelle->buff[i]=255;
- }
- else if(somme<0){
- nouvelle->buff[i]=0;
- }
- else{
- nouvelle->buff[i]=somme;
- }
- break;
- case 0:
- if(somme>255){
- nouvelle->buff[i]=255;
- }
- else if(somme<0){
- nouvelle->buff[i]=0;
- }
- else{
- nouvelle->buff[i]=somme;
- }
- break;
- default:
- coef=(coef>0)?coef:-coef;
- if(somme/coef>255){
- nouvelle->buff[i]=255;
- }
- else if(somme/coef<0){
- nouvelle->buff[i]=0;
- }
- else{
- nouvelle->buff[i]=somme/coef;
- }
- break;
- }
- }
- return nouvelle;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement