· 7 years ago · Dec 31, 2018, 01:04 AM
1#include <stdio.h>
2#include <stdlib.h>
3#include <malloc.h>
4///#include "XORSHIFT32.h"
5#include <math.h>
6#define presumed_detections 500
7#if 1
8typedef struct
9{
10 unsigned char b, g, r;
11}pixel;
12
13typedef struct
14{
15 unsigned int inaltime;
16 unsigned int latime;
17 pixel *vector_valori;
18}BMP_image;
19// |-----------------------------------|---/||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||\
20// | PARTEA INTAI - IMAGE CRIPTING |---/||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||\
21// |-----------------------------------|---/||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||\
22
23#if 0
24
25BMP_image* citire_si_liniarizare(char *nume_img)
26{
27 BMP_image *img = (BMP_image*)malloc(sizeof(BMP_image) * 1);
28
29 int i, j;
30 FILE *fin = NULL;
31 fin = fopen(nume_img, "rb");
32 //FILE *fout = fopen("test_citire.bmp", "wb");
33 if (fin == NULL)
34 {
35 printf("nu am gasit imaginea sursa din care citesc\n");
36 system("pause");
37 exit(1);
38 }
39 //if (fout == NULL)
40 //{
41 // printf("nu am gasit imaginea sursa din care citesc\n");
42 // system("pause");
43 // exit(1);
44 //}
45
46 ///
47
48 fseek(fin, 18, SEEK_SET);
49 fread(&img->latime, sizeof(unsigned int), 1, fin);
50 fread(&img->inaltime, sizeof(unsigned int), 1, fin);
51 printf("Dimensiunea imaginii in pixeli (latime x inaltime): %u x %u\n", img->latime, img->inaltime);
52
53 ///
54
55 //fseek(fin, 0, SEEK_SET);
56
57 char *temp_pixel = (char*)malloc(3 * sizeof(char));
58
59 img->vector_valori = (pixel*)malloc((img->inaltime*img->latime) * sizeof(pixel));
60
61 int padding;
62 if (img->latime % 4 != 0)
63 padding = 4 - (3 * img->latime) % 4;
64 else
65 padding = 0;
66
67 /*char header[54];
68 fread(header, sizeof(char), 54, fin);
69 fwrite(header, sizeof(char), 54, fout);*/
70 fseek(fin, 54, SEEK_SET);
71
72
73
74 for (i = img->inaltime - 1; i >= 0; i--)
75 {
76
77 for (j = 0; j < img->latime; j++)
78 {
79 fread(temp_pixel, sizeof(char), 3, fin);
80 //fwrite(&temp_pixel, sizeof(char), 3, fout);
81 //fflush(fout);
82 img->vector_valori[i*img->latime + j].b = temp_pixel[0];
83 img->vector_valori[i*img->latime + j].g = temp_pixel[1];
84 img->vector_valori[i*img->latime + j].r = temp_pixel[2];
85 //fwrite(&img->vector_valori[i*img->latime + j].b, sizeof(char), 1, fout);
86 //fwrite(&img->vector_valori[i*img->latime + j].g, sizeof(char), 1, fout);
87 //fwrite(&img->vector_valori[i*img->latime + j].r, sizeof(char), 1, fout);
88 fflush(fin);
89 }
90
91 fseek(fin, padding, SEEK_CUR);
92 //fseek(fout, padding, SEEK_CUR);
93 }
94
95 for (i = 0; i < img->latime*img->inaltime; i++)
96 printf("%u ", img->vector_valori[i].b);
97
98 fclose(fin);
99 //fclose(fout);
100 free(temp_pixel);
101 return img;
102}
103BMP_image* permutare(BMP_image *img, unsigned int *aleatoare)
104{
105 pixel p;
106
107 int *sigma = (int*)malloc((img->inaltime*img->latime) * sizeof(int));
108 for (int i = 0; i <= img->inaltime*img->latime - 1; i++)
109 sigma[i] = i;
110
111 for (int i = img->latime*img->inaltime - 1, k = 0; i >= 1; i--)
112 {
113 unsigned int r = aleatoare[k++] % (i + 1);
114 int aux = sigma[r];
115 sigma[r] = sigma[i];
116 sigma[i] = aux;
117 }
118
119 BMP_image *intermediare;
120 intermediare = (BMP_image*)malloc(sizeof(BMP_image));
121
122 intermediare->inaltime = img->inaltime;
123 intermediare->latime = img->latime;
124
125 intermediare->vector_valori = (pixel*)malloc((img->latime*img->inaltime) * sizeof(pixel));
126
127 for (int i = 0; i <= img->inaltime*img->latime - 1; i++)
128 intermediare->vector_valori[sigma[i]] = img->vector_valori[i];
129
130 return intermediare;
131}
132void criptare(BMP_image *img, unsigned int *aleatoare, char *secret_key)
133{
134 FILE *fin = fopen(secret_key, "rt");
135 if (fin == NULL)
136 {
137 fprintf(stderr, "nu s a gasit secret key");
138 system("pause");
139 exit(1);
140
141 }
142 unsigned int seed, SV;
143
144 fscanf(fin, "%u", &seed);
145 fscanf(fin, "%u", &SV);
146
147 int i;
148 img->vector_valori[0].b = SV ^ img->vector_valori[0].b ^ aleatoare[img->inaltime*img->latime - 1];
149 img->vector_valori[0].g = (SV >> 8) ^ img->vector_valori[0].g ^ (aleatoare[img->inaltime*img->latime - 1] >> 8);
150 img->vector_valori[0].r = (SV >> 16) ^ img->vector_valori[0].r ^ (aleatoare[img->inaltime*img->latime - 1] >> 16);
151
152 for (i = 1; i <= img->inaltime*img->latime - 1; i++)
153 {
154 img->vector_valori[i].b = img->vector_valori[i - 1].b ^ img->vector_valori[i].b ^ aleatoare[img->inaltime*img->latime - 1 + i];//ma duc cu -1 mereu unde am aleatoriu
155 img->vector_valori[i].g = img->vector_valori[i - 1].g ^ img->vector_valori[i].g ^ (aleatoare[img->inaltime*img->latime - 1 + i] >> 8);
156 img->vector_valori[i].r = img->vector_valori[i - 1].r ^ img->vector_valori[i].r ^ (aleatoare[img->inaltime*img->latime - 1 + i] >> 16);
157 }
158 fclose(fin);
159}
160void creare_img(BMP_image *img, char *nume_img_sursa, char *nume_img_dest)
161{
162 FILE *fin = NULL;
163 FILE *fout = NULL;
164 fin = fopen(nume_img_sursa, "rb");
165 fout = fopen(nume_img_dest, "wb");
166
167 if (fin == NULL)
168 {
169 perror("fopen");
170 fprintf(stderr, "can't open file %s", nume_img_sursa);
171 exit(1);
172 }
173
174 if (fout == NULL)
175 {
176 perror("fopen");
177 fprintf(stderr, "can't open file %s", nume_img_dest);
178 exit(1);
179 }
180
181 unsigned char c;
182 int i, j;
183
184 //padding :
185 int padding;
186 if (img->latime % 4 != 0)
187 padding = 4 - (3 * img->latime) % 4;
188 else
189 padding = 0;
190
191 char header[54];
192 fread(header, sizeof(char), 54, fin);
193 fwrite(header, sizeof(char), 54, fout);
194
195 /*for (i = 0; i < 54; i++)
196 {
197 fread(&c, sizeof(char), 1, fin);
198 fwrite(&c, sizeof(char), 1, fout);
199 fflush(fout);
200 }*/
201
202 // pixel p;
203 for (i = img->inaltime - 1; i >= 0; i--)
204 {
205 for (j = 0; j < img->latime; j++)
206 {
207
208 fwrite(&img->vector_valori[i*img->latime + j].b, sizeof(char), 1, fout);
209 fflush(fout);
210 fwrite(&img->vector_valori[i*img->latime + j].g, sizeof(char), 1, fout);
211 fflush(fout);
212 fwrite(&img->vector_valori[i*img->latime + j].r, sizeof(char), 1, fout);
213 fflush(fout);
214 }
215 if (i != 0)
216 fseek(fout, padding, SEEK_CUR);
217 }
218
219 char *end_of_file = (char*)calloc(padding, sizeof(char));
220 fwrite(end_of_file, sizeof(char), padding, fout);
221
222 free(end_of_file);
223 fclose(fin);
224 fclose(fout);
225}
226void testul_chi_patrat(BMP_image *img)
227{
228 unsigned int *frecventa_blue = (int*)malloc(256 * sizeof(unsigned int));
229 unsigned int *frecventa_green = (int*)malloc(256 * sizeof(unsigned int));
230 unsigned int *frecventa_red = (int*)malloc(256 * sizeof(unsigned int));
231
232 memset(frecventa_blue, 0, sizeof(int) * 256);
233 memset(frecventa_green, 0, sizeof(int) * 256);
234 memset(frecventa_red, 0, sizeof(int) * 256);
235
236 int k, i;
237
238 double suma_blue = 0, suma_green = 0, suma_red = 0;
239 double frecventa_medie = (img->inaltime*img->latime) / 256.0;
240
241 for (i = 0; i < img->latime*img->inaltime; i++)
242 {
243 frecventa_blue[(unsigned char)img->vector_valori[i].b]++;
244 frecventa_green[(unsigned char)img->vector_valori[i].g]++;
245 frecventa_red[(unsigned char)img->vector_valori[i].r]++;
246 }
247
248 for (i = 0; i < 256; i++)
249 {
250 suma_blue = suma_blue + ((frecventa_blue[i] - frecventa_medie)*(frecventa_blue[i] - frecventa_medie)) / frecventa_medie;
251 suma_green = suma_green + ((frecventa_green[i] - frecventa_medie)*(frecventa_green[i] - frecventa_medie)) / frecventa_medie;
252 suma_red = suma_red + ((frecventa_red[i] - frecventa_medie)*(frecventa_red[i] - frecventa_medie)) / frecventa_medie;
253 }
254
255 printf("Red = %.2f \nGreen = %.2f \nBlue = %.2f \n\n", suma_red, suma_green, suma_blue);
256
257 free(frecventa_blue);
258 free(frecventa_green);
259 free(frecventa_red);
260
261}
262BMP_image* decriptare(BMP_image *img, unsigned int *aleatoare, char *secret_key)
263{
264 FILE *fin = fopen(secret_key, "rt");
265 if (fin == NULL)
266 {
267 fprintf(stderr, "nu s a gasit secret key");
268 system("pause");
269 exit(1);
270
271 }
272 unsigned int seed, SV;
273
274 fscanf(fin, "%u", &seed);
275 fscanf(fin, "%u", &SV);
276
277 BMP_image *vector_decriptat = (BMP_image*)malloc(sizeof(BMP_image));
278 vector_decriptat->vector_valori = (pixel*)malloc((img->inaltime * img->latime) * sizeof(pixel));
279
280 vector_decriptat->inaltime = img->inaltime;
281 vector_decriptat->latime = img->latime;
282
283 vector_decriptat->vector_valori[0].b = SV ^ img->vector_valori[0].b ^ (aleatoare[img->inaltime * img->latime - 1]);
284 vector_decriptat->vector_valori[0].g = (SV >> 8) ^ img->vector_valori[0].g ^ (aleatoare[img->inaltime * img->latime - 1] >> 8);
285 vector_decriptat->vector_valori[0].r = (SV >> 16) ^ img->vector_valori[0].r ^ (aleatoare[img->inaltime * img->latime - 1] >> 16);
286
287 for (int i = 1; i < img->inaltime * img->latime; i++)
288 {
289 vector_decriptat->vector_valori[i].b = img->vector_valori[i - 1].b ^ img->vector_valori[i].b ^ aleatoare[img->inaltime*img->latime - 1 + i];//ma duc cu -1 mereu unde am aleatoriu
290 vector_decriptat->vector_valori[i].g = img->vector_valori[i - 1].g ^ img->vector_valori[i].g ^ (aleatoare[img->inaltime*img->latime - 1 + i] >> 8);
291 vector_decriptat->vector_valori[i].r = img->vector_valori[i - 1].r ^ img->vector_valori[i].r ^ (aleatoare[img->inaltime*img->latime - 1 + i] >> 16);
292 }
293
294 unsigned int *sigma = (unsigned int*)malloc((img->inaltime*img->latime) * sizeof(unsigned int));
295
296 for (int i = 0; i <= img->inaltime*img->latime - 1; i++)
297 sigma[i] = i;
298
299 for (int i = img->latime*img->inaltime - 1, k = 0; i >= 1; i--)
300 {
301 unsigned int r = aleatoare[k++] % (i + 1);
302 int aux = sigma[r];
303 sigma[r] = sigma[i];
304 sigma[i] = aux;
305 }
306 BMP_image *img_decriptata = (BMP_image*)malloc(sizeof(BMP_image));
307 img_decriptata->vector_valori = (pixel*)malloc((img->inaltime * img->latime) * sizeof(pixel));
308
309 img_decriptata->inaltime = img->inaltime;
310 img_decriptata->latime = img->latime;
311
312 unsigned int *sigma_invers = (unsigned int*)malloc((img->inaltime*img->latime) * sizeof(unsigned int));
313 for (long i = (long)(img->latime*img->inaltime) - 1; i >= 0; i--)
314 sigma_invers[sigma[i]] = i;
315
316 for (unsigned i = 0; i < img->latime*img->inaltime; i++)
317 {
318 img_decriptata->vector_valori[sigma_invers[i]] = vector_decriptat->vector_valori[i];
319 }
320 return img_decriptata;
321}
322
323#endif
324// |--------------------------------------|---/||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||\
325// | PARTEA A 2 A - TEMPLATE MATCHING |---/||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||\
326// |--------------------------------------|---/||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||\
327
328typedef struct
329{
330 int indiceI;
331 int indiceJ;
332 double corelatie;
333 pixel culoare;
334
335}detectie;
336
337typedef struct
338{
339 int inaltime;
340 int latime;
341 pixel **matrice;
342}BMP_matrice;
343
344void grayscale_image(char* nume_fisier_sursa, char* nume_fisier_destinatie)
345{
346 FILE *fin, *fout;
347 unsigned int dim_img, latime_img, inaltime_img;
348 unsigned char pRGB[3], header[54], aux;
349
350 //printf("nume_fisier_sursa = %s \n", nume_fisier_sursa);
351
352 fin = fopen(nume_fisier_sursa, "rb");
353 if (fin == NULL)
354 {
355 printf("nu am gasit imaginea sursa din care citesc");
356 return;
357 }
358
359 fout = fopen(nume_fisier_destinatie, "wb+");
360
361 fseek(fin, 2, SEEK_SET);
362 fread(&dim_img, sizeof(unsigned int), 1, fin);
363 //printf("Dimensiunea imaginii in octeti: %u\n", dim_img);
364
365 fseek(fin, 18, SEEK_SET);
366 fread(&latime_img, sizeof(unsigned int), 1, fin);
367 fread(&inaltime_img, sizeof(unsigned int), 1, fin);
368 //printf("Dimensiunea imaginii in pixeli (latime x inaltime): %u x %u\n", latime_img, inaltime_img);
369
370 //copiaza octet cu octet imaginea initiala in cea noua
371 fseek(fin, 0, SEEK_SET);
372 unsigned char c;
373 while (fread(&c, 1, 1, fin) == 1)
374 {
375 fwrite(&c, 1, 1, fout);
376 fflush(fout);
377 }
378 fclose(fin);
379
380 //calculam padding-ul pentru o linie
381 int padding;
382 if (latime_img % 4 != 0)
383 padding = 4 - (3 * latime_img) % 4;
384 else
385 padding = 0;
386
387 //printf("padding = %d \n", padding);
388
389 fseek(fout, 54, SEEK_SET);
390 int i, j;
391 for (i = 0; i < inaltime_img; i++)
392 {
393 for (j = 0; j < latime_img; j++)
394 {
395 //citesc culorile pixelului
396 fread(pRGB, 3, 1, fout);
397 //fac conversia in pixel gri
398 aux = 0.299*pRGB[2] + 0.587*pRGB[1] + 0.114*pRGB[0];
399 pRGB[0] = pRGB[1] = pRGB[2] = aux;
400 fseek(fout, -3, SEEK_CUR);
401 fwrite(pRGB, 3, 1, fout);
402 fflush(fout);
403 }
404 fseek(fout, padding, SEEK_CUR);
405 }
406 fclose(fout);
407}
408
409BMP_matrice* creare_matrice(char *nume_img_sursa)
410{
411 FILE *fin = NULL;
412 FILE *fout = NULL;
413 fin = fopen(nume_img_sursa, "rb");
414 fout = fopen("test_citire.bmp", "wb");
415 if (fin == NULL)
416 {
417 fprintf(stderr, "Imaginea %s nu a putut fi gasita", nume_img_sursa);
418 system("pause");
419 exit(1);
420 }
421 if (fout == NULL)
422 {
423 fprintf(stderr, "Imaginea %s nu a putut fi gasita", "test_citire.bmp");
424 system("pause");
425 exit(1);
426 }
427
428 BMP_matrice *img = (BMP_matrice*)malloc(sizeof(BMP_matrice));
429 ///
430 fseek(fin, 18, SEEK_SET);
431 fread(&img->latime, sizeof(unsigned int), 1, fin);
432 fread(&img->inaltime, sizeof(unsigned int), 1, fin);
433 //printf("Dimensiunea imaginii in pixeli (latime x inaltime): %u x %u\n", img->latime, img->inaltime);
434 ///
435
436 img->matrice = (pixel**)malloc(img->inaltime * sizeof(pixel*));
437 for (int i = 0; i < img->inaltime; i++)
438 img->matrice[i] = (pixel*)malloc(img->latime * sizeof(pixel));
439
440 char *temp_pixel = (char*)malloc(3 * sizeof(char));
441
442 fseek(fin, 0, SEEK_SET);
443 char header[54];
444 fread(header, sizeof(char), 54, fin);
445 fwrite(header, sizeof(char), 54, fout);
446
447 int padding;
448 if (img->latime % 4 != 0)
449 padding = 4 - (3 * img->latime) % 4;
450 else
451 padding = 0;
452
453 fseek(fin, 54, SEEK_SET);
454 unsigned char a = 0;
455 for (int i = img->inaltime - 1; i >= 0; i--)
456 {
457 for (int j = 0; j < img->latime; j++)
458 {
459 fread(temp_pixel, sizeof(char), 3, fin);
460 // fwrite(temp_pixel, sizeof(char), 3, fout);
461 //fflush(fout);
462 img->matrice[i][j].b = temp_pixel[0];
463 img->matrice[i][j].g = temp_pixel[1];
464 img->matrice[i][j].r = temp_pixel[2];
465 fwrite(&img->matrice[i][j].b, sizeof(char), 1, fout);
466 fwrite(&img->matrice[i][j].g, sizeof(char), 1, fout);
467 fwrite(&img->matrice[i][j].r, sizeof(char), 1, fout);
468 fflush(fout);
469 //fflush(fin);
470 }
471
472 fseek(fin, padding, SEEK_CUR);
473 fwrite(&a, sizeof(char), padding, fout);
474 //fseek(fout, padding, SEEK_CUR);
475
476 }
477 //printf(". ");
478
479 /*for (int j = 0; j < img->inaltime; j++)
480 for (int k = 0; k < img->latime; k++)
481 printf("%u ", img->matrice[j][k].b);
482 printf("\n\n\n\n\n\n");*/
483
484 fclose(fin);
485 fclose(fout);
486 free(temp_pixel);
487 return img;
488}
489
490double deviatie_s(double S_mediu, BMP_matrice *sablon)
491{
492 double suma_s = 0;
493 double n = (double)(sablon->latime * sablon->inaltime);
494
495 for (int i = 0; i < sablon->inaltime; i++)
496 for (int j = 0; j < sablon->latime; j++)
497 {
498 suma_s = suma_s + (sablon->matrice[i][j].r - S_mediu)*(sablon->matrice[i][j].r - S_mediu);
499 }
500 suma_s = sqrt(suma_s / (n - 1));
501 return suma_s;
502}
503
504double deviatie_fi(int i, int j, double fi_mediu, BMP_matrice *sablon, BMP_matrice *img)
505{
506 double suma_fi = 0;
507 double n = (double)(sablon->latime * sablon->inaltime);
508
509 for (int k = i; k < i + sablon->inaltime; k++)
510 for (int q = j; q < j + sablon->latime; q++)
511 {
512 suma_fi = suma_fi + (img->matrice[k][q].r - fi_mediu)*(img->matrice[k][q].r - fi_mediu);
513 }
514
515 suma_fi = sqrt(suma_fi / (n - 1));
516 return suma_fi;
517}
518
519void contur_fereastra(BMP_matrice **img, int W, int H, detectie *detectii, int i)
520{
521 //printf("contur1\n");
522 for (int k = detectii[i].indiceI; k < detectii[i].indiceI + H; k++)
523 {
524 (*img)->matrice[k][detectii[i].indiceJ].r = detectii[i].culoare.r;
525 (*img)->matrice[k][detectii[i].indiceJ].g = detectii[i].culoare.g;
526 (*img)->matrice[k][detectii[i].indiceJ].b = detectii[i].culoare.b;
527
528 (*img)->matrice[k][detectii[i].indiceJ + W - 1].r = detectii[i].culoare.r;
529 (*img)->matrice[k][detectii[i].indiceJ + W - 1].g = detectii[i].culoare.g;
530 (*img)->matrice[k][detectii[i].indiceJ + W - 1].b = detectii[i].culoare.b;
531 }
532 //printf("contur2\n");
533 for (int k = detectii[i].indiceJ; k < detectii[i].indiceJ + W; k++)
534 {
535 (*img)->matrice[detectii[i].indiceI][k].r = detectii[i].culoare.r;
536 (*img)->matrice[detectii[i].indiceI][k].g = detectii[i].culoare.g;
537 (*img)->matrice[detectii[i].indiceI][k].b = detectii[i].culoare.b;
538
539 (*img)->matrice[detectii[i].indiceI + H - 1][k].r = detectii[i].culoare.r;
540 (*img)->matrice[detectii[i].indiceI + H - 1][k].g = detectii[i].culoare.g;
541 (*img)->matrice[detectii[i].indiceI + H - 1][k].b = detectii[i].culoare.b;
542 }
543
544 //for (int i = 0; i < (*size_detectii); i++)
545 // contur_fereastra(&img, W, H, (*detectii), i);
546}
547
548double calculeaza_S_mediu(BMP_matrice *sablon, double *S_mediu)
549{
550 for (int i = 0; i < sablon->inaltime; i++)
551 for (int j = 0; j < sablon->latime; j++)
552 *S_mediu = *S_mediu + sablon->matrice[i][j].r;
553 *S_mediu = *S_mediu / (double)(sablon->latime * sablon->inaltime);
554
555 return *S_mediu;
556}
557
558double calculeaza_fi_mediu(BMP_matrice *img, BMP_matrice *sablon, double *fi_mediu, int i, int j)
559{
560 for (int k = i; k < i + sablon->inaltime; k++)
561 for (int q = j; q < j + sablon->latime; q++)
562 *fi_mediu = *fi_mediu + img->matrice[k][q].r;
563
564 *fi_mediu = *fi_mediu / (sablon->latime*sablon->inaltime);
565 return *fi_mediu;
566}
567
568BMP_matrice* matching_si_corelatie(char *nume_img_sursa, char **vector_sabloane, float prag, detectie **detectii, int *size_detectii)
569{
570 printf("Se proceseaza ");
571 *size_detectii = 0;
572 int test = 0;
573 double dev_s;
574 double dev_fi;
575 double corelatie = 0;
576 BMP_matrice *img = creare_matrice(nume_img_sursa);
577 //BMP_matrice *sablon = creare_matrice(vector_sabloane[0]);
578
579 BMP_matrice *sablon = creare_matrice(vector_sabloane[0]);
580 int W = sablon->latime;
581 int H = sablon->inaltime;
582 free(sablon);
583
584 double fi_mediu = 0;
585 double S_mediu = 0;
586
587 for (int nr_sablon = 0; nr_sablon < 10; nr_sablon++)
588 {
589 BMP_matrice *sablon = creare_matrice(vector_sabloane[nr_sablon]);
590 // printf("NUMAR SABLON = %d\n", nr_sablon);
591 printf(". ");
592 S_mediu = calculeaza_S_mediu(sablon, &S_mediu);
593 dev_s = deviatie_s(S_mediu, sablon);
594
595 for (int i = 0; i < img->inaltime - sablon->inaltime; i++)
596 {
597 for (int j = 0; j < img->latime - sablon->latime; j++)
598 {
599 calculeaza_fi_mediu(img, sablon, &fi_mediu, i, j);
600 dev_fi = deviatie_fi(i, j, fi_mediu, sablon, img);
601 //printf("i = %d, j = %d\n", i, j);
602 for (int k = i; k < i + sablon->inaltime; k++)
603 {
604 for (int q = j; q < j + sablon->latime; q++)
605 corelatie += (img->matrice[k][q].r - fi_mediu) * (sablon->matrice[k - i][q - j].r - S_mediu);
606
607 }
608
609 corelatie /= (dev_fi*dev_s);
610 corelatie = corelatie / (sablon->inaltime*sablon->latime);
611
612 if (corelatie >= prag)
613 {
614
615
616 test++;
617
618 if (*size_detectii == 0)
619 (*detectii) = (detectie*)malloc(sizeof(detectie) * presumed_detections);
620 else if ((*size_detectii) >= presumed_detections)
621 (*detectii) = (detectie*)realloc((*detectii), sizeof(detectie)*(1 + *size_detectii));
622
623 (*detectii)[*size_detectii].corelatie = corelatie;
624 (*detectii)[*size_detectii].indiceI = i;
625 (*detectii)[*size_detectii].indiceJ = j;
626
627 switch (nr_sablon)
628 {
629 case 0:
630 {
631 (*detectii)[*size_detectii].culoare.r = 255;
632 (*detectii)[*size_detectii].culoare.g = 0;
633 (*detectii)[*size_detectii].culoare.b = 0;
634 }
635 break;
636
637 case 1:
638 {
639 (*detectii)[*size_detectii].culoare.r = 255;
640 (*detectii)[*size_detectii].culoare.g = 255;
641 (*detectii)[*size_detectii].culoare.b = 0;
642 }
643 break;
644
645 case 2:
646 {
647 (*detectii)[*size_detectii].culoare.r = 0;
648 (*detectii)[*size_detectii].culoare.g = 255;
649 (*detectii)[*size_detectii].culoare.b = 0;
650 }
651 break;
652
653 case 3:
654 {
655 (*detectii)[*size_detectii].culoare.r = 0;
656 (*detectii)[*size_detectii].culoare.g = 255;
657 (*detectii)[*size_detectii].culoare.b = 0;
658 }
659 break;
660
661 case 4:
662 {
663 (*detectii)[*size_detectii].culoare.r = 255;
664 (*detectii)[*size_detectii].culoare.g = 0;
665 (*detectii)[*size_detectii].culoare.b = 255;
666 }
667 break;
668
669 case 5:
670 {
671 (*detectii)[*size_detectii].culoare.r = 0;
672 (*detectii)[*size_detectii].culoare.g = 0;
673 (*detectii)[*size_detectii].culoare.b = 255;
674 }
675 break;
676
677 case 6:
678 {
679 (*detectii)[*size_detectii].culoare.r = 192;
680 (*detectii)[*size_detectii].culoare.g = 192;
681 (*detectii)[*size_detectii].culoare.b = 192;
682 }
683 break;
684
685 case 7:
686 {
687
688 (*detectii)[*size_detectii].culoare.r = 255;
689 (*detectii)[*size_detectii].culoare.g = 140;
690 (*detectii)[*size_detectii].culoare.b = 0;
691 }
692 break;
693
694 case 8:
695 {
696 (*detectii)[*size_detectii].culoare.r = 128;
697 (*detectii)[*size_detectii].culoare.g = 0;
698 (*detectii)[*size_detectii].culoare.b = 128;
699 }
700 break;
701
702 case 9:
703 {
704 (*detectii)[*size_detectii].culoare.r = 128;
705 (*detectii)[*size_detectii].culoare.g = 0;
706 (*detectii)[*size_detectii].culoare.b = 0;
707 }
708 break;
709
710 default:
711 break;
712 }
713
714 (*size_detectii)++;
715 }
716
717 corelatie = 0;
718 }
719 //printf("un loop\n");
720 }
721 //printf("a iesti din for-SABLOANE\n");
722
723 }
724
725 for (int i = 0; i < (*size_detectii); i++)
726 contur_fereastra(&img, W, H, (*detectii), i);
727
728 //printf("SIZE_DETECTII === %d\n", (*size_detectii));
729 printf("\n");
730 return img;
731}
732
733void afisare_matrice(BMP_matrice *img, char *nume_img_sursa, char *nume_img_dest)
734{
735 FILE *fin = NULL;
736 FILE *fout = NULL;
737 fin = fopen(nume_img_sursa, "rb");
738 fout = fopen(nume_img_dest, "wb");
739
740 if (fin == NULL)
741 {
742 perror("fopen");
743 fprintf(stderr, "can't open file %s", nume_img_sursa);
744 exit(1);
745 }
746
747 if (fout == NULL)
748 {
749 perror("fopen");
750 fprintf(stderr, "can't write in file %s", nume_img_dest);
751 exit(1);
752 }
753
754 unsigned char c;
755 int i, j;
756
757 //padding :
758 int padding;
759 if (img->latime % 4 != 0)
760 padding = 4 - (3 * img->latime) % 4;
761 else
762 padding = 0;
763
764 char header[54];
765 fread(header, sizeof(char), 54, fin);
766 fwrite(header, sizeof(char), 54, fout);
767 fclose(fin);
768 /*for (i = 0; i < 54; i++)
769 {
770 fread(&c, sizeof(char), 1, fin);
771 fwrite(&c, sizeof(char), 1, fout);
772 fflush(fout);
773 }*/
774
775 // pixel p;
776 for (i = img->inaltime - 1; i >= 0; i--)
777 {
778 for (j = 0; j < img->latime; j++)
779 {
780 fwrite(&img->matrice[i][j].b, sizeof(char), 1, fout);
781 fflush(fout);
782 fwrite(&img->matrice[i][j].g, sizeof(char), 1, fout);
783 fflush(fout);
784 fwrite(&img->matrice[i][j].r, sizeof(char), 1, fout);
785 fflush(fout);
786 }
787 if (i != 0)
788 fseek(fout, padding, SEEK_CUR);
789 }
790
791 char *end_of_file = (char*)calloc(padding, sizeof(char));
792 fwrite(end_of_file, sizeof(char), padding, fout);
793
794 free(end_of_file);
795
796 fclose(fout);
797}
798
799#if 1
800int main()/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
801{
802 printf("A intrat in main : \n\n");
803
804 // ---PARTEA INTAI--- //
805
806#if 0
807 char *nume_img_sursa = (char*)malloc(100 * sizeof(char));
808 char *nume_img_dest = (char*)malloc(100 * sizeof(char));
809 char *nume_img_decriptata = (char*)malloc(100 * sizeof(char));
810 char *secret_key = (char*)malloc(100 * sizeof(char));
811
812
813 /// CITIRE SI LINIARIZARE + TEST CHI ///
814 printf("\nCum sa se numeasca imaginea sursa : \n");
815 scanf("%s", nume_img_sursa);
816
817 BMP_image *imagine_sursa = citire_si_liniarizare(nume_img_sursa);
818 printf("TESTUL CHI INAINTE DE CRIPTARE :\n\n");
819 testul_chi_patrat(imagine_sursa);
820
821 /// XORSHIFT32 ///
822
823
824 printf("\nCare este numele fisierului care contine cheia secreta : \n");
825 scanf("%s", secret_key);
826 FILE *fin = fopen(secret_key, "rt");
827 unsigned int seed;
828 fscanf(fin, "%u", &seed);
829 unsigned int *aleatoare = xorshift32(seed, imagine_sursa->latime*imagine_sursa->inaltime * 2 - 1);
830 fclose(fin);
831 /// PERRMUTARE ///
832 BMP_image *imagine_permutata = permutare(imagine_sursa, aleatoare);
833 //creare_img(imagine_permutata, nume_img_sursa, "peppers_permutat.bmp");
834
835
836 /// CRIPTARE + TEST CHI///
837 printf("\nCum sa se numeasca imaginea criptata : \n");
838 scanf("%s", nume_img_dest);
839
840 criptare(imagine_permutata, aleatoare, secret_key);
841 creare_img(imagine_permutata, nume_img_sursa, nume_img_dest);
842 printf("TESTUL CHI DUPA CRIPTARE :\n\n");
843 testul_chi_patrat(imagine_permutata);
844
845 /// DECRIPTARE ///
846
847 printf("\nCum sa se numeasca imaginea decriptata : \n");
848 scanf("%s", nume_img_decriptata);
849 BMP_image *imagine_partial_decriptata = decriptare(imagine_permutata, aleatoare, secret_key);
850 printf("\nSe creeaza imaginea decriptata...\n");
851 creare_img(imagine_partial_decriptata, nume_img_sursa, nume_img_decriptata);
852 printf("\nImaginea decriptata a fost creata\n");
853 /// DEZALOCARE DE MEMORIE ///
854
855 free(imagine_permutata->vector_valori);
856 free(imagine_permutata);
857 free(imagine_sursa->vector_valori);
858 free(imagine_sursa);
859 free(aleatoare);
860#endif
861 // ---PARTEA A 2 A--- //
862
863#if 1
864 char *imagine_sursa_1 = (char*)malloc(100 * sizeof(char));
865 char *nume_img_finala = (char*)malloc(100 * sizeof(char));
866
867 char **vector_sabloane;
868 BMP_matrice *img_matrice;
869 //img_matrice = creare_matrice(imagine_sursa);
870
871 //img_matrice = creare_matrice(imagine_sursa_1);
872
873 vector_sabloane = (char**)malloc(10 * sizeof(char*));
874 for (int i = 0; i < 10; i++)
875 vector_sabloane[i] = (char*)malloc(10 * sizeof(char));
876 printf("Cum se numeste imaginea sursa ? : ");
877 scanf("%s", imagine_sursa_1);
878 grayscale_image(imagine_sursa_1, "test_grayscaled.bmp");
879
880 /// ////////////////////////////////
881
882 grayscale_image("cifra0.bmp", "cifra0_gs.bmp");
883 grayscale_image("cifra1.bmp", "cifra1_gs.bmp");
884 grayscale_image("cifra2.bmp", "cifra2_gs.bmp");
885 grayscale_image("cifra3.bmp", "cifra3_gs.bmp");
886 grayscale_image("cifra4.bmp", "cifra4_gs.bmp");
887 grayscale_image("cifra5.bmp", "cifra5_gs.bmp");
888 grayscale_image("cifra6.bmp", "cifra6_gs.bmp");
889 grayscale_image("cifra7.bmp", "cifra7_gs.bmp");
890 grayscale_image("cifra8.bmp", "cifra8_gs.bmp");
891 grayscale_image("cifra9.bmp", "cifra9_gs.bmp");
892
893 vector_sabloane[0] = "cifra0_gs.bmp";
894 vector_sabloane[1] = "cifra1_gs.bmp";
895 vector_sabloane[2] = "cifra2_gs.bmp";
896 vector_sabloane[3] = "cifra3_gs.bmp";
897 vector_sabloane[4] = "cifra4_gs.bmp";
898 vector_sabloane[5] = "cifra5_gs.bmp";
899 vector_sabloane[6] = "cifra6_gs.bmp";
900 vector_sabloane[7] = "cifra7_gs.bmp";
901 vector_sabloane[8] = "cifra8_gs.bmp";
902 vector_sabloane[9] = "cifra9_gs.bmp";
903
904 /// ////////////////////////////////
905
906 detectie *detectii = NULL;
907 float prag;
908 printf("Pragul dorit? : ");
909 scanf("%f", &prag);
910 int size_detectii = 0;
911
912 img_matrice = matching_si_corelatie("test_grayscaled.bmp", vector_sabloane, prag, &detectii, &size_detectii);
913 printf("Cum sa se numeasca imaginea finala? : ");
914 scanf("%s", nume_img_finala);
915 printf("\n");
916 afisare_matrice(img_matrice, imagine_sursa_1, nume_img_finala);
917
918 /// DEZALOCARE MEMORIE ///
919
920#endif
921 system("pause");
922}
923#endif
924#endif