Italiano
HOME | PROGETTI | CLASSI C++ | Sorgenti c\c++ | Galleria | Guestbook | Server BW | Contattami | Login

<< Filtro di Sobel >>

visiste: 1744


Il filtro di Sobel č un algoritmo che serve per segnare la posizione e la direzione degli sbalzi di luminositą in un'immagine.



  1. //*************************************//
  2. //******** created by mamo139 *********//
  3. //*** http://mamo139.altervista.org ***//
  4. //*************************************//
  5. #include <stdio.h>
  6. #include <windows.h>
  7. #include <math.h>
  8.  
  9. unsigned char* dammibit(unsigned char numero);
  10. unsigned char dammichar(unsigned char *bits);
  11.  
  12.  
  13. int main (void){
  14.  
  15. char nomefileb[20];
  16. printf("nome del file base:");
  17. scanf("%s",nomefileb);
  18. printf("%s!\n",nomefileb);
  19.  
  20. FILE * pFile;
  21. long lSize;
  22. pFile = fopen ( nomefileb , "rb" );
  23. fseek (pFile , 0 , SEEK_END);
  24. lSize = ftell (pFile);
  25. fclose (pFile);
  26.  
  27.  
  28. long lbuffer = lSize; //byte letti alla volta nella base
  29. printf("buffer impostato a %d bytes\n",lbuffer);
  30.  
  31. unsigned char *buf; //buffer di lettura
  32. buf = new unsigned char [(lbuffer)+100]; //grandezza del buffer della base
  33.  
  34. FILE *file, *f_out;
  35. if ((file = fopen(nomefileb, "rb")) && (f_out = fopen("cript.bmp", "wb"))){
  36.  
  37. printf("files aperti con successo!!\n");
  38.  
  39. long b; //byte letti
  40. b = fread( buf, 1, 54, file);
  41.  
  42. unsigned int coordx = buf[18]+buf[19]*256;
  43. unsigned int coordy = buf[22]+buf[23]*256;
  44. printf("caratteristiche immagine: %d x %d\n",coordx,coordy);
  45.  
  46.  
  47. fwrite( buf, 1, b, f_out);
  48. printf("header scritto...\n");
  49.  
  50. //******************************INIZIO LETTURA DEL FILE*********************************//
  51. b = fread( buf, 1, lbuffer, file);
  52. printf("file caricato nel buffer...\n");
  53.  
  54. long x,y,z=0;
  55. //caricamento in array bidimensionale...
  56. //unsigned char mappa[coordx][coordy][4];
  57. int x1=coordx, y1=coordy, z1=3; // Le dimensioni
  58. unsigned char ***mappa;
  59. int i, j;
  60. mappa=(unsigned char***)malloc(x1 * sizeof(unsigned char *));
  61. for(i=0; i<x1; i++) {
  62. mappa[i]=(unsigned char**)malloc(y1 * sizeof(unsigned char *));
  63. for (j=0; j<y1; j++)
  64. mappa[i][j]=(unsigned char*)malloc(z1 * sizeof(unsigned char *));
  65. }
  66. printf("mappa a due dimensioni creata...\n");
  67.  
  68. for(y=0; y < coordy ;y++){
  69. printf("loaded: y=%d\n",y);
  70. for(x=0;x < coordx;x++){
  71. mappa[x][y][0] = buf[z];
  72. mappa[x][y][1] = buf[(z+1)];
  73. mappa[x][y][2] = buf[(z+2)];
  74. z=z+3;
  75. }}
  76. printf("byte immagazzinati nella mappa: %d \n",z);
  77.  
  78. //*****************************INIZIO MODE DEL FILE**********************************//
  79. //operatore di sobel
  80. double kernel[3][3]; //kernel
  81. kernel[0][0]= 1; kernel[0][1]= 0; kernel[0][2]= -1;
  82. kernel[1][0]= 2; kernel[1][1]= 0; kernel[1][2]= -2;
  83. kernel[2][0]= 1; kernel[2][1]= 0; kernel[2][2]= -1;
  84.  
  85. double kernel2[3][3]; //kernel
  86. kernel2[0][0]= 1; kernel2[0][1]= 2; kernel2[0][2]= 1;
  87. kernel2[1][0]= 0; kernel2[1][1]= 0; kernel2[1][2]= 0;
  88. kernel2[2][0]= -1; kernel2[2][1]= -2; kernel2[2][2]= -1;
  89.  
  90. /*
  91.   //filtro blurr
  92.   double kernel[3][3]; //kernel
  93.   kernel[0][0]= 0.1111; kernel[0][1]= 0.1111; kernel[0][2]= 0.1111;
  94.   kernel[1][0]= 0.1111; kernel[1][1]= 0.1111; kernel[1][2]= 0.1111;
  95.   kernel[2][0]= 0.1111; kernel[2][1]= 0.1111; kernel[2][2]= 0.1111;
  96.   */
  97.  
  98. double grigio,grigio2;
  99.  
  100. for(y=0; y < coordy ; y++){
  101. for(x=0; x < coordx ; x++){
  102. /*
  103.   unsigned char *wbuf;
  104.   wbuf = new unsigned char [4];
  105.   wbuf[0]= mappa[x][y][0];
  106.   wbuf[1]= mappa[x][y][1];
  107.   wbuf[2]= mappa[x][y][2];
  108.   */
  109. grigio = (mappa[x][y][0] + mappa[x][y][1] + mappa[x][y][2])/3;
  110. grigio2 = (mappa[x][y][0] + mappa[x][y][1] + mappa[x][y][2])/3;
  111. //printf("%f",grigio);
  112. if(x>=1 && y >=1 && x<coordx-1 && y<coordy-1){
  113.  
  114. //convoluzione
  115. grigio =
  116. ((mappa[x-1][y-1][0]+mappa[x-1][y-1][1]+mappa[x-1][y-1][2])/3) * kernel[0][0] +
  117. ((mappa[x][y-1][0]+mappa[x][y-1][1]+mappa[x][y-1][2])/3) * kernel[0][1] +
  118. ((mappa[x+1][y-1][0]+mappa[x+1][y-1][1]+mappa[x+1][y-1][2])/3) * kernel[0][2] +
  119.  
  120. ((mappa[x-1][y][0]+mappa[x-1][y][1]+mappa[x-1][y][2])/3) * kernel[1][0] +
  121. ((mappa[x][y][0]+mappa[x][y][1]+mappa[x][y][2])/3) * kernel[1][1] +
  122. ((mappa[x+1][y][0]+mappa[x+1][y][1]+mappa[x+1][y][2])/3) * kernel[1][2] +
  123.  
  124. ((mappa[x-1][y+1][0]+mappa[x-1][y+1][1]+mappa[x-1][y+1][2])/3) * kernel[2][0] +
  125. ((mappa[x][y+1][0]+mappa[x][y+1][1]+mappa[x][y+1][2])/3) * kernel[2][1] +
  126. ((mappa[x+1][y+1][0]+mappa[x+1][y+1][1]+mappa[x+1][y+1][2])/3) * kernel[2][2] ;
  127.  
  128. grigio2 =
  129. ((mappa[x-1][y-1][0]+mappa[x-1][y-1][1]+mappa[x-1][y-1][2])/3) * kernel2[0][0] +
  130. ((mappa[x][y-1][0]+mappa[x][y-1][1]+mappa[x][y-1][2])/3) * kernel2[0][1] +
  131. ((mappa[x+1][y-1][0]+mappa[x+1][y-1][1]+mappa[x+1][y-1][2])/3) * kernel2[0][2] +
  132.  
  133. ((mappa[x-1][y][0]+mappa[x-1][y][1]+mappa[x-1][y][2])/3) * kernel2[1][0] +
  134. ((mappa[x][y][0]+mappa[x][y][1]+mappa[x][y][2])/3) * kernel2[1][1] +
  135. ((mappa[x+1][y][0]+mappa[x+1][y][1]+mappa[x+1][y][2])/3) * kernel2[1][2] +
  136.  
  137. ((mappa[x-1][y+1][0]+mappa[x-1][y+1][1]+mappa[x-1][y+1][2])/3) * kernel2[2][0] +
  138. ((mappa[x][y+1][0]+mappa[x][y+1][1]+mappa[x][y+1][2])/3) * kernel2[2][1] +
  139. ((mappa[x+1][y+1][0]+mappa[x+1][y+1][1]+mappa[x+1][y+1][2])/3) * kernel2[2][2] ;
  140.  
  141. }
  142. //printf(" - %f\n",grigio);
  143. unsigned char *wbuf;
  144. wbuf = new unsigned char [3];
  145.  
  146. wbuf[0]= 255 - (char) sqrt(grigio*grigio+grigio2*grigio2);
  147. wbuf[1]= wbuf[0];
  148. wbuf[2]= wbuf[0];
  149. fwrite( wbuf, 1, 3, f_out);
  150. }}
  151.  
  152. //fwrite( buf, 1, b, f_out);
  153.  
  154. }
  155.  
  156.  
  157. fclose(file);
  158. fclose(f_out);
  159.  
  160. system("PAUSE");
  161. return 1;
  162. }
  163.  
Versione sito: 1.03.01 by mamo139. - Tutti i sorgenti presenti su questo sito sono rilasciati sotto licenza "GNU GPL version 3".