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

<< Mappa dei contorni >>

visiste: 1935


Semplice algoritmo inventato da me che prende in input un'immagine bmp e restituisce un'immagine in cui sono segnati solo i contorni. Segna i contorni con solo due colori, il nero e il grigio.
Ci sono due parametri nel programma che servono a decidere quanto rendere sensibile l'algoritmo.




  1. //*************************************//
  2. //******** created by mamo139 *********//
  3. //*** http://mamo139.altervista.org ***//
  4. //*************************************//
  5. #include <stdio.h>
  6. #include <windows.h>
  7.  
  8. unsigned char* dammibit(unsigned char numero);
  9. unsigned char dammichar(unsigned char *bits);
  10.  
  11. int main (void){
  12.  
  13. char nomefileb[20];
  14. printf("nome del file base:");
  15. scanf("%s",nomefileb);
  16. printf("%s!\n",nomefileb);
  17. FILE * pFile;
  18. long lSize;
  19. pFile = fopen ( nomefileb , "rb" );
  20. fseek (pFile , 0 , SEEK_END);
  21. lSize = ftell (pFile);
  22. fclose (pFile);
  23.  
  24.  
  25. long lbuffer = lSize; //byte letti alla volta nella base
  26. printf("buffer impostato a %d bytes\n",lbuffer);
  27.  
  28. unsigned char *buf; //buffer di lettura
  29. buf = new unsigned char [(lbuffer)+100]; //grandezza del buffer della base
  30. unsigned char *nbuf; //buffer di lettura
  31. nbuf = new unsigned char [(lbuffer)+100]; //grandezza del buffer della base
  32.  
  33. FILE *file, *f_out;
  34. if ((file = fopen(nomefileb, "rb")) && (f_out = fopen("cript10.bmp", "wb"))){
  35.  
  36. printf("files aperti con successo!!\n");
  37.  
  38. long b; //byte letti
  39. b = fread( buf, 1, 54, file);
  40.  
  41. unsigned int coordx = buf[18]+buf[19]*256;
  42. unsigned int coordy = buf[22]+buf[23]*256;
  43. printf("caratteristiche immagine: %d x %d\n",coordx,coordy);
  44.  
  45.  
  46. fwrite( buf, 1, b, f_out);
  47. printf("header scritto...\n");
  48. //******************************INIZIO MODE DEL FILE*********************************//
  49. b = fread( buf, 1, lbuffer, file);
  50. printf("file caricato nel buffer...\n");
  51.  
  52. long x;
  53. int tc = 4, tc2 = 10;//filtri....
  54. printf("LA SENSIBILITą DEI TRATTI SONO: %d-%d \n",tc,tc2);
  55.  
  56. for(x=coordx*3+1;x < b-coordx*3-1;x=x+3){
  57. unsigned char media = ( buf[x]+buf[(x+1)]+buf[(x+2)] ) / 3;
  58.  
  59. unsigned char media_s = ( buf[x-3]+buf[(x-2)]+buf[(x-1)] ) / 3;
  60. unsigned char media_d = ( buf[x+3]+buf[(x+4)]+buf[(x+5)] ) / 3;
  61.  
  62. unsigned char media_u = ( buf[x-(coordx*3)]+buf[(x-(coordx*3)+1)]+buf[(x-(coordx*3)+2)] ) / 3;
  63. unsigned char media_g = ( buf[x+(coordx*3)]+buf[(x+(coordx*3)+1)]+buf[(x+(coordx*3)+2)] ) / 3;
  64.  
  65. unsigned char media_us = ( buf[x-(coordx*3)-3]+buf[(x-(coordx*3)+1)-3]+buf[(x-(coordx*3)+2)-3] ) / 3;
  66. unsigned char media_gd = ( buf[x+(coordx*3)+3]+buf[(x+(coordx*3)+1)+3]+buf[(x+(coordx*3)+2)+3] ) / 3;
  67.  
  68. unsigned char media_ud = ( buf[x-(coordx*3)+3]+buf[(x-(coordx*3)+1)+3]+buf[(x-(coordx*3)+2)+3] ) / 3;
  69. unsigned char media_gs = ( buf[x+(coordx*3)-3]+buf[(x+(coordx*3)+1)-3]+buf[(x+(coordx*3)+2)-3] ) / 3;
  70.  
  71. int result1, result2,result3,result4;
  72. int temp1 = media_s - media_d;
  73. int temp2 = media_u - media_g;
  74. int temp3 = media_us - media_gd;
  75. int temp4 = media_ud - media_gs;
  76. if(temp1 > 0 ) { result1 = (media_s - media_d); }
  77. else result1 = 0 - (media_s - media_d);
  78. if(temp2 > 0 ) { result2 = (media_u - media_g); }
  79. else result2 = 0 - (media_u - media_g);
  80. if(temp3 > 0 ) { result3 = (media_us - media_gd); }
  81. else result3 = 0 - (media_us - media_gd);
  82. if(temp4 > 0 ) { result4 = (media_ud - media_gs); }
  83. else result4 = 0 - (media_ud - media_gs);
  84.  
  85.  
  86.  
  87. if( //filtro del bianco
  88. ( result1 < tc ) &&
  89. ( result2 < tc ) &&
  90. ( result3 < tc ) &&
  91. ( result4 < tc )
  92. )
  93. { nbuf[x] = 255;nbuf[x+1]=255;nbuf[x+2]=255; }
  94.  
  95. else if( //filtro del secondo colore
  96. ( result1 < tc2 ) &&
  97. ( result2 < tc2 ) &&
  98. ( result3 < tc2 ) &&
  99. ( result4 < tc2 )
  100. )
  101. { nbuf[x] = 192;nbuf[x+1]=192;nbuf[x+2]=192; }
  102.  
  103. else { nbuf[x] = 0;nbuf[x+1]=0;nbuf[x+2]=0; } //nero
  104.  
  105.  
  106.  
  107. }
  108.  
  109.  
  110. fwrite( nbuf, 1, b, f_out);
  111. }
  112.  
  113.  
  114. fclose(file);
  115. fclose(f_out);
  116.  
  117. system("PAUSE");
  118. return 1;
  119. }
  120.  
Versione sito: 1.03.01 by mamo139. - Tutti i sorgenti presenti su questo sito sono rilasciati sotto licenza "GNU GPL version 3".