Advertisement
Guest User

Untitled

a guest
Feb 8th, 2016
53
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.08 KB | None | 0 0
  1. #define _CRT_SECURE_NO_WARNINGS
  2.  
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <math.h>
  6. #include <time.h>
  7.  
  8. /*struktura opisujaca obrazek w formacie PGM
  9. zawiera jego parametry : wysokosc, szerokosc, wartosc maksymalna czernii oraz wskaznik na dwuwymiarowa tablice elementow obrazka*/
  10. struct IMAGE
  11. {
  12. int height;
  13. int width;
  14. int max;
  15. int **data;
  16. };
  17. int SOBEL_POZIOMY[9] = {
  18. 1, 2, 1,
  19. 0, 0, 0,
  20. -1, -2, -1
  21. };
  22. int GAUSS1[9] = {
  23. 1, 2, 1,
  24. 2, 4, 2,
  25. 1, 2, 1
  26. };
  27. struct IMAGE* newIMAGE(int height, int width, int max);
  28. struct IMAGE* loadIMAGE(char *name);
  29. void saveIMAGE(struct IMAGE *img);
  30. void skipCOMMENT(FILE *fp);
  31. void freeIMAGE(struct IMAGE **img);
  32. void odbicie_poziom(struct IMAGE *img);
  33. void odbicie_pion(struct IMAGE * img);
  34. void progowanie(struct IMAGE *img);
  35. void erozja(struct IMAGE * img);
  36. void histogram(struct IMAGE *img);
  37. void filtr(struct IMAGE * img, int * fil, int size);
  38.  
  39. int main()
  40. {
  41. int numer;
  42. int exit = 0;
  43. struct IMAGE *img = NULL;
  44. char name[50];
  45. while (!exit)
  46. {
  47. printf("Menu:\n");
  48. printf("1:wczytaj obraz\n");
  49. printf("2:zapisz obraz\n");
  50. printf("3:wykonaj erozje (UWAGA: opcja dostepna tylko dla obrazow binarnych)\n");
  51. printf("4:odbij w poziomie\n");
  52. printf("5:odbij w pionie\n");
  53. printf("6:progowanie\n");
  54. printf("7:utworz histogram\n");
  55. printf("8:zastosuj filtr Gaussa\n");
  56. printf("9:zastosuj filtr Sobela\n");
  57. printf("10:zakoncz program\n");
  58. scanf("%d", &numer);
  59. switch (numer)
  60. {
  61. case 1:
  62. printf("Podaj nazwe pliku z dopiskiem '.pgm'\n");
  63. scanf("%s", name);
  64. img = loadIMAGE(name);
  65. if (img == NULL)
  66. {
  67. printf("nie ma takiego pliku");
  68. return 0;
  69. }
  70. break;
  71. case 2:
  72. saveIMAGE(img);
  73. break;
  74. case 3:
  75. erozja(img);
  76. break;
  77. case 4:
  78. odbicie_poziom(img);
  79. break;
  80. case 5:
  81. odbicie_pion(img);
  82. break;
  83. case 6:
  84. progowanie(img);
  85. break;
  86. case 7:
  87. histogram(img);
  88. break;
  89. case 8:
  90. filtr(img, SOBEL_POZIOMY, sizeof(SOBEL_POZIOMY[9]));
  91. case 9:
  92. filtr(img, GAUSS1, sizeof(GAUSS1[9]));
  93. case 10:
  94. exit = 1;
  95. printf("KONIEC\n");
  96. freeIMAGE(&img);
  97. return 0;
  98. break;
  99. default:
  100. printf("zly numer\n");
  101. break;
  102. }
  103. }
  104. return 0;
  105. }
  106.  
  107. struct IMAGE* newIMAGE(int width, int height, int max)
  108. {
  109. int i;
  110. struct IMAGE* img = NULL;
  111. img = (struct IMAGE *) malloc(sizeof(struct IMAGE));
  112. if (img == NULL)
  113. {
  114. printf("blad w alokacji pamieci");
  115. return NULL;
  116. }
  117. img->height = height;
  118. img->width = width;
  119. img->max = max;
  120. img->data = (int**)calloc(height, sizeof(int*));
  121. if (img->data == NULL)
  122. {
  123. printf("blad w alokacji pamieci");
  124. free(img);
  125. return NULL;
  126. }
  127. for (i = 0; i < height; i++)
  128. {
  129. img->data[i] = (int*)calloc(width, sizeof(int));
  130. if (img->data == NULL)
  131. {
  132. printf("blad w alokacji pamieci");
  133. freeIMAGE(&img);
  134. return NULL;
  135. }
  136. }
  137. return img;
  138. }
  139.  
  140.  
  141. void freeIMAGE(struct IMAGE **img)
  142. {
  143. int i;
  144. if (*img == NULL) return;
  145. if ((*img)->data != NULL)
  146. {
  147. for (i = 0; i < (*img)->height; i++)
  148. {
  149. if ((*img)->data[i] != NULL) free((*img)->data[i]);
  150. }
  151. //free(*img);
  152. //*img = NULL;
  153. }
  154. else return;
  155. free((*img)->data);
  156. free(*img);
  157. *img = NULL;
  158. }
  159.  
  160. void saveIMAGE(struct IMAGE* img)
  161. {
  162. int i, j;
  163. char name[30];
  164. FILE *fp;
  165. if (img == NULL)
  166. {
  167. printf("Nie wczytales obrazu");
  168. return;
  169. }
  170. printf("Podaj nazwe pliku z dopiskiem '.PGM':\n");
  171. scanf("%s", name);
  172. fp = fopen(name, "wt");
  173. if (fp == NULL)
  174. {
  175. printf("blad w utowrzeniu pliku\n");
  176. return;
  177. }
  178. fprintf(fp, "P2\n%d %d\n%d\n", img->width, img->height, img->max);
  179. for (i = 0; i < img->height; i++)
  180. {
  181. for (j = 0; j < img->width; j++)
  182. {
  183. fprintf(fp, "%d ", img->data[i][j]);
  184. }
  185. fprintf(fp, "\n");
  186. }
  187. fclose(fp);
  188. }
  189.  
  190. struct IMAGE* loadIMAGE(char *name)
  191. {
  192. FILE *fp;
  193. char buf[3];
  194. int w, h, max, i, j, value;
  195. struct IMAGE* img;
  196. fp = fopen(name, "rt");
  197. if (fp == NULL) return NULL;
  198. fscanf(fp, "%2s", buf);
  199. if (buf[0] != 'P' || (buf[1] != '2' && buf[1] != '5'))
  200. {
  201. printf("typ pliku rozny od .pgm");
  202. fclose(fp);
  203. return NULL;
  204. }
  205. skipCOMMENT(fp);
  206. if (fscanf(fp, "%d%d%d", &w, &h, &max) != 3)
  207. {
  208. printf("typ pliku rozny od .pgm");
  209. fclose(fp);
  210. return NULL;
  211. }
  212. img = newIMAGE(w, h, max);
  213. if (img == NULL)
  214. {
  215. printf("blad w tworzeniu pamieci dla obrazka");
  216. fclose(fp);
  217. return NULL;
  218. }
  219. for (i = 0; i < img->height; i++)
  220. {
  221. for (j = 0; j < img->width; j++)
  222. {
  223. if (fscanf(fp, "%d", &value) != 1)
  224. {
  225. freeIMAGE(&img);
  226. fclose(fp);
  227. return NULL;
  228. }
  229. img->data[i][j] = value;
  230. }
  231. }
  232. fclose(fp);
  233. return img;
  234. }
  235.  
  236. void skipCOMMENT(FILE *fp)
  237. {
  238. int ch;
  239. while (1)
  240. {
  241. do
  242. {
  243. ch = fgetc(fp);
  244. } while (ch == ' ' || ch == '\r' || ch == '\n' || ch == '\t');
  245.  
  246. if (ch == '#')
  247. {
  248. do
  249. {
  250. ch = fgetc(fp);
  251. } while (ch != '\r' && ch != '\n' && ch >= 0);
  252. }
  253. else
  254. {
  255. ungetc(ch, fp);//zwraca wczytany znak do pliku
  256. return;
  257. }
  258. }
  259. }
  260. void odbicie_pion(struct IMAGE * img)
  261. {
  262. int **temp, i, j, k;
  263. if (img == NULL)
  264. {
  265. printf("Nie wczytales obrazu");
  266. return;
  267. }
  268. temp = (int**)calloc(img->height, sizeof(int));
  269. for (i = 0; i < img->height; i++)
  270. {
  271. temp[i] = (int*)calloc(img->width, sizeof(int));
  272. }
  273. for (i = 0; i < img->height; i++)
  274. {
  275. k = (img->height) - 1 - i;
  276. for (j = 0; j < img->width; j++)
  277. {
  278. temp[i][j] =img->data[k][j];
  279. }
  280. }
  281. for (i = 0; i < img->height; i++)
  282. {
  283. for (j = 0; j < img->width; j++)
  284. {
  285. img->data[i][j] = temp[i][j];
  286. }
  287. }
  288. for (i = 0; i < img->height; i++)
  289. {
  290. free(temp[i]);
  291. }
  292. free(temp);
  293. }
  294. void odbicie_poziom(struct IMAGE *img)
  295. {
  296. int **temp, i, j, k;
  297. if (img == NULL)
  298. {
  299. printf("Nie wczytales obrazu");
  300. return;
  301. }
  302. temp = (int**)calloc(img->height, sizeof(int));
  303. for (i = 0; i < img->height; i++)
  304. {
  305. temp[i] = (int*)calloc(img->width, sizeof(int));
  306. }
  307. for (i = 0; i < img->height; i++)
  308. {
  309. for (j = 0; j < img->width; j++)
  310. {
  311. k = (img->width) - 1 - j;
  312. temp[i][j] = img->data[i][k];
  313. }
  314. }
  315. for (i = 0; i < img->height; i++)
  316. {
  317. for (j = 0; j < img->width; j++)
  318. {
  319. img->data[i][j] = temp[i][j];
  320. }
  321. }
  322. for (i = 0; i < img->height; i++)
  323. {
  324. free(temp[i]);
  325. }
  326. free(temp);
  327.  
  328. }
  329. void progowanie(struct IMAGE *img)
  330. {
  331. int i, j, prog;
  332. if (img == NULL)
  333. {
  334. printf("Nie wczytales obrazu");
  335. return;
  336. }
  337. prog = img->max / 2;
  338. for (i = 0; i < img->height; i++)
  339. {
  340. for (j = 0; j < img->width; j++)
  341. {
  342. if (img->data[i][j] >= prog)
  343. {
  344. img->data[i][j] = img->max;
  345. }
  346. else img->data[i][j] = 0;
  347. }
  348. }
  349. }
  350.  
  351. void histogram(struct IMAGE *img) {
  352. FILE * hist;
  353. int * tab_hist;
  354. int i, j;
  355.  
  356. tab_hist = (int*)malloc((img->max + 1) * sizeof(int));
  357.  
  358. if (tab_hist == NULL) {
  359. printf("Brak pamieci\n");
  360. return;
  361. }
  362.  
  363. for (i = 0; i < img->max + 1; i++) {
  364. tab_hist[i] = 0;
  365. }
  366.  
  367. hist = fopen("histogram.CSV", "wt");
  368.  
  369. if (hist == NULL) {
  370. printf("Nie udalo sie otworzyc pliku do zapisu\n");
  371. return;
  372. }
  373.  
  374. for (i = 0; i < img->height; i++) {
  375. for (j = 0; j < img->width; j++) {
  376. tab_hist[img->data[i][j]]++;
  377. }
  378. }
  379.  
  380. for (i = 0; i < img->max + 1; i++) {
  381. fprintf(hist, "%d;%d\n", i, tab_hist[i]);
  382. }
  383.  
  384. free(tab_hist);
  385. fclose(hist);
  386. }
  387. void erozja(struct IMAGE * img) {
  388. int i, j, k, m;
  389. int temp;
  390. int ** tab2;
  391. tab2 = (int**)calloc(img->width, sizeof(int*));
  392. if (tab2 == NULL) {
  393. printf("Brak pamieci\n");
  394. return;
  395. }
  396. for (i = 0; i < img->width; i++) {
  397. tab2[i] = (int*)calloc(img->height, sizeof(int));
  398. if (tab2[i] == NULL) {
  399. printf("Brak pamieci\n");
  400. for (j = 0; i < img->width; j++)
  401. free(tab2[j]);
  402. free(tab2);
  403. return;
  404. }
  405. }
  406.  
  407. for (i = 0; i < img->width; i++) {
  408. for (j = 0; j < img->height; j++) {
  409. tab2[i][j] = img->data[i][j];
  410. }
  411. }
  412.  
  413. for (i = 0; i < img->width; i++) {
  414. for (j = 0; j < img->height; j++) {
  415. temp = 0;
  416. for (k = 0; k < 3; k++) {
  417. for (m = 0; m < 3; m++) {
  418. if (i == 0 || j == 0 || i == img->width - 1 || j == img->height - 1) {
  419. temp = 0;
  420. }
  421. else {
  422. temp = temp + tab2[i + k - 1][j + m - 1];
  423. }
  424. }
  425. }
  426. if (temp == 9) {
  427. img->data[i][j] = 1;
  428. }
  429. else
  430. img->data[i][j] = 0;
  431. }
  432. }
  433. for (i = 0; i < img->width; i++) {
  434. free(tab2[i]);
  435. }
  436. free(tab2);
  437. }
  438. void filtr(struct IMAGE * obr_pgm, int * fil, int size) {
  439. int **tab;
  440. size = size / sizeof(int);
  441. int suma, suma_wag = 0, i, j, k, m, rozm = (int)sqrt(size);
  442. int przesun = rozm / 2;
  443. tab = (int**)malloc(obr_pgm->width*sizeof(int*));
  444. for ( i = 0; i < obr_pgm->width; i++)
  445. tab[i] = (int*)malloc(obr_pgm->height*sizeof(int));
  446.  
  447. for ( i = 0; i < obr_pgm->width; i++)
  448. {
  449. for ( j = 0; j < obr_pgm->height; j++)
  450. {
  451. tab[i][j] = obr_pgm->data[i][j];
  452. }
  453. }
  454.  
  455. for (i = 0; i < size; i++)
  456. {
  457. suma_wag = suma_wag + fil[i];
  458. }
  459.  
  460. for (i = przesun; i < ((obr_pgm->width) - przesun); i++) {
  461. for (j = przesun; j < ((obr_pgm->height) - przesun); j++) {
  462. suma = 0;
  463. for (k = 0; k < rozm; k++) {
  464. for (m = 0; m < rozm; m++) {
  465. suma = suma + fil[k + m*rozm] * (tab[j + m - przesun][i + k - przesun]);
  466. }
  467. }
  468. if (suma_wag != 0)
  469. suma = suma / suma_wag;
  470. if (suma < 0)
  471. suma = 0;
  472. if (suma > obr_pgm->max)
  473. suma = obr_pgm->max;
  474. obr_pgm->data[j][i] = suma;
  475. }
  476. }
  477. for (i = 0; i < obr_pgm->width; i++)
  478. free(tab[i]);
  479. free(tab);
  480. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement