Filtre de sobel [Résolu]

dwarfo 5 Messages postés vendredi 10 février 2012Date d'inscription 14 mars 2012 Dernière intervention - 8 mars 2012 à 09:58 - Dernière réponse : BunoCS 13843 Messages postés lundi 11 juillet 2005Date d'inscription 23 mai 2018 Dernière intervention
- 8 mars 2012 à 11:56
Bonjour,
je cherche à appliquer un filtre de sobel sur une image bitmap 8 bits mais sans librairies.
J'ai vu qu'il existait de nombreux code mais souvent avec des librairies donc ça ne correspond pas à ce que je recherche.
Voilà le code que j'ai fait jusque là. Mais je sais qu'il y a un problème puisque je n'arrive pas à mettre les données d'un pixel dans la matrice pixel.
De plus j'ai un autre problème, quand je retourne les variables : printf("%ld\n",source_info.height);
printf("%ld\n",source_info.width); les nombres ne sont pas ceux de l'image que j'utilise.
Je tiens juste à dire que mes compétences en langage c sont limités...
Je remercie d'avance tout ceux qui pourront m'aider.



#include<stdio.h>

#include<stdlib.h>
#include<math.h>

//structure defiens bitmap header
struct BITMAPFILEHEADER{
unsigned short type;//type of file (bit map)
unsigned long size;//size of file
unsigned short reserved1;//
unsigned short reserved2;//
unsigned long offsetbits;//off set bits
};



struct BITMAPINFOHEADER{
unsigned long size;//bitmap size
unsigned long width;//width of bitmap
unsigned long height;//hight of bitmap
unsigned short planes;
unsigned short bitcount;
unsigned long compression;// compression ratio (zero for no compression)
unsigned long sizeimage;//size of image
long xpelspermeter;
long ypelspermeter;
unsigned long colorsused;
unsigned long colorsimportant;
};



struct SINGLE_PIXEL{
unsigned char blue; //Blue level 0-255
unsigned char green;//Green level 0-255
unsigned char red; //Red level 0-255
};


int main()
{

unsigned long int i=0;//to count pixels readed
unsigned long int j=0;
unsigned long long int S=0;//number of pixcels to read

struct BITMAPFILEHEADER source_head;//to store file header
struct BITMAPINFOHEADER source_info;//to store bitmap info header
//struct SINGLE_PIXEL source_pix;// to store pixcels
int source_pix;

FILE *fp;//file pointer for source file
FILE *Dfp;//file ponter for distenation file

if(!(fp=fopen("Image1.bmp","rb")))//open in binery read mode
{
printf("\can not open file");//prind and exit if file open error
exit(-1);
}


Dfp=fopen("dist.bmp","wb");//opne in binery write mode
//read the headers to souirce file
fread(&source_head,sizeof(struct BITMAPFILEHEADER),1,fp);
fread(&source_info,sizeof(struct BITMAPINFOHEADER),1,fp);

//write the headers to distenation file
fwrite(&source_head,sizeof(struct BITMAPFILEHEADER),1,Dfp);
fwrite(&source_info,sizeof(struct BITMAPINFOHEADER),1,Dfp);

//read, modefy and write pixcels
int pixel [513][514];
int pixel_res[514];
for(i=1;i<512;i++)
{
for(j=2;j<513;j++)
{
//read pixcel form source file
fread(&source_pix,sizeof(struct SINGLE_PIXEL),1,fp);
//printf("%d\n",pixel[i][j]);


float deltaX, deltaY;

deltaX = -pixel[0][j-1]+pixel[0][j+1]-2*pixel[1][j-1]+2*pixel[1][j+1]-pixel[2][j-1]+pixel[2][j+1];

deltaY = pixel[2][j+1]+2*pixel[2][j]+pixel[2][j-1]-pixel[0][j+1]-2*pixel[0][j]-pixel[0][j];

pixel_res[j]=sqrt(deltaX*deltaX+deltaY*deltaY)/4;


if (pixel_res[j]<0) pixel_res[j]=0;
if (pixel_res[j]>255) pixel_res[j]=255;
//printf("%d\n",pixel_res[j]);
source_pix = pixel_res[j];



/*modefy
//source_pix.green;
//source_pix.blue;
//source_pix.blue;
*/
//write pixcels to distenation file
fwrite(&source_pix,sizeof(struct SINGLE_PIXEL),1,Dfp);
}
}
//close all fiels
fclose(fp);
fclose(Dfp);
return 0;
}
Afficher la suite 

Votre réponse

4 réponses

BunoCS 13843 Messages postés lundi 11 juillet 2005Date d'inscription 23 mai 2018 Dernière intervention - 8 mars 2012 à 11:56
+3
Utile
Facilement transposable, notamment la partie convolution...


@+
Buno, Admin CS
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de BunoCS
BunoCS 13843 Messages postés lundi 11 juillet 2005Date d'inscription 23 mai 2018 Dernière intervention - 8 mars 2012 à 10:17
0
Utile
Hello,
Ma source semble toute indiquée pour t'aider...


@+
Buno, Admin CS
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Commenter la réponse de BunoCS
dwarfo 5 Messages postés vendredi 10 février 2012Date d'inscription 14 mars 2012 Dernière intervention - 8 mars 2012 à 10:33
0
Utile
Bonjour bruno et merci de votre aide. J'avais déjà regardé vos sources, Mais le soucis c'est qu'ils sont en C++ et c'est encore plus vague pour moi...
Commenter la réponse de dwarfo
dwarfo 5 Messages postés vendredi 10 février 2012Date d'inscription 14 mars 2012 Dernière intervention - 8 mars 2012 à 10:40
0
Utile
*Buno,
au temps pour moi !
Commenter la réponse de dwarfo

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.