Advertisement
Guest User

Untitled

a guest
Dec 14th, 2019
109
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 12.26 KB | None | 0 0
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <stdlib.h>
  3. #include <math.h>
  4. #include <stdio.h>
  5. #include <locale.h>
  6. #include <Windows.h>
  7.  
  8. #define MAXSTRLEN 100
  9.  
  10. int odczyt_pliku(struct obraz* hp1);
  11. int zapis_pliku(struct obraz hp1);
  12. void zapis_histogram(int* ile, struct obraz hp1);
  13. void zwalnianie_pamieci(struct obraz* hp1);
  14. void zwalnianie_blad(struct obraz* hp1, int ile);
  15. int obrot(struct obraz* hp1);
  16. void histogram(struct obraz* hp1);
  17. void negatyw(struct obraz* hp1);
  18. void pieprz_sol(struct obraz* hp1);
  19. int filtr(struct obraz* hp1);
  20. void progowanie(struct obraz* hp1);
  21. struct obraz kopia_zapasowa(struct obraz* hp1);
  22.  
  23. struct obraz
  24. {
  25. char* nazwa_pliku;
  26. char* standard;
  27. int szerokosc;
  28. int wysokosc;
  29. int zakres;
  30. int** piksele; //tablica na piksele
  31.  
  32.  
  33. };
  34.  
  35.  
  36. int main()
  37. {
  38. char nazwa[MAXSTRLEN];
  39. int x;
  40. int k = 0;
  41. //int* ile;
  42. int wybor = 1;//menu 1
  43. int krok_programu = 0;//menu 2
  44. struct obraz* hp1;//deklaracja zmiennej strukturalnej
  45. struct obraz kopia_robocza;
  46. hp1 = (struct obraz*)malloc(1 * sizeof(struct obraz));//alokacja pamieci
  47.  
  48. srand(time(NULL));
  49.  
  50. do
  51. {
  52. switch (wybor)
  53. {
  54. case 1:
  55.  
  56. x = odczyt_pliku(hp1);// odczyt z pliku
  57. if (x == 0)
  58. break;
  59. if (x == 1)
  60. {
  61. kopia_robocza = kopia_zapasowa(hp1);//kopia robocza danego pliku
  62. do {
  63. puts("Mozliwe operacje na odczytanym obrazie:");
  64. puts("wpisz 'obrot' aby obrocic obraz");
  65. puts("wpisz 'histogram' aby stworzyc histogram dla wczytanego obrazu");
  66. puts("wpisz 'neg' aby uzyc negatywa");
  67. puts("wpisz 'szum' aby uzyc efektu pieprz i sol");
  68. puts("wpisz 'filtr' aby uzyc filtru na obraz");
  69. puts("wpisz 'save' aby zapisac obraz");
  70. puts("wpisz 'exit' aby wyjsc z programu");
  71.  
  72. while (!scanf("%s", nazwa))
  73. {
  74. char c;
  75. while (c = getchar() != '\n');
  76. }
  77. if (!strcmp(nazwa, "obrot"))
  78. {
  79. krok_programu = 1;
  80. }
  81. else if (!strcmp(nazwa, "histogram"))
  82. {
  83. krok_programu = 2;
  84. }
  85. else if (!strcmp(nazwa, "neg"))
  86. {
  87. krok_programu = 3;
  88. }
  89. else if (!strcmp(nazwa, "szum"))
  90. {
  91. krok_programu = 4;
  92. }
  93. else if (!strcmp(nazwa, "filtr"))
  94. {
  95. krok_programu = 5;
  96. }
  97. else if (!strcmp(nazwa, "save"))
  98. {
  99. krok_programu = 6;
  100. }
  101. else if (!strcmp(nazwa, "exit"))
  102. {
  103. krok_programu = 7;
  104. }
  105. switch (krok_programu)
  106. {
  107.  
  108. case 1:
  109. puts("Podaj wielokrotnosc kata 90 stopni:");
  110. k = getch();
  111. for (int i = 0; i < k - 48; i++)
  112. {
  113. obrot(&kopia_robocza);//przekazanie kopii
  114. }
  115.  
  116. puts("Wykonano obrot");
  117. Sleep(1000);
  118. break;
  119.  
  120. case 2:
  121.  
  122. histogram(&kopia_robocza);
  123. puts("histogram zostal utworzony");
  124. Sleep(10000);
  125. break;
  126. case 3:
  127.  
  128. negatyw(&kopia_robocza);
  129. puts("wykonano negatyw");
  130. Sleep(3000);
  131. break;
  132.  
  133. case 4:
  134. pieprz_sol(&kopia_robocza);
  135. puts("Przyprawy");
  136. Sleep(1000);
  137. break;
  138.  
  139. case 5:
  140. filtr(&kopia_robocza);
  141. puts("przefiltrowano");
  142. Sleep(1000);
  143. break;
  144.  
  145. case 6:
  146.  
  147. zapis_pliku(kopia_robocza);//zapis musi byc oddzielna funkcja, dodac petle do
  148. zwalnianie_pamieci(hp1);
  149. break;
  150.  
  151. case 0:
  152. puts("Podano nieprawidlowa wartosc");
  153. Sleep(1000);
  154. break;
  155.  
  156. default:
  157. wybor = 2;
  158. break;
  159.  
  160. }
  161.  
  162. system("cls");
  163.  
  164. } while (krok_programu != 7);
  165. }
  166. else
  167. {
  168. printf("Problem z alokacja %d wiersza, zwalniam pamiec\n", x);
  169. zwalnianie_blad(hp1, x);
  170. exit(0);
  171. }
  172. break;
  173.  
  174. case 2:
  175. exit(0);
  176. break;
  177.  
  178. default:
  179. break;
  180. }
  181.  
  182. } while (wybor != '2');
  183. return 0;
  184.  
  185.  
  186. }
  187.  
  188. int odczyt_pliku(struct obraz* hp1)
  189. {
  190. FILE* plik;
  191. char komentarze;
  192. hp1->nazwa_pliku = (char*)malloc(100 * sizeof(char));//alokacja tablicy z nazwa
  193.  
  194. printf("Podaj nazwe pliku:\n");
  195. scanf("%s", hp1->nazwa_pliku);//wczytanie nazwy obrazu
  196.  
  197. plik = fopen(hp1->nazwa_pliku, "r");//otwarcie pliku o podanej nazwie
  198. if (plik == NULL)//czy plik sie otworzyl
  199. {
  200. puts("Plik nie zostal odnaleziony");//komunikat dlaczego blad
  201. return 0;
  202. }
  203. else
  204. puts("Znaleziono plik");
  205.  
  206.  
  207. //czytanie standardu
  208. //Jezeli napotka # to usuwa wszystko co jest dalej po nim (wrzuca do zmiennej komentarz ktora przyjmuje kolejno wartosci pobrane) az do nowej lini a jezeli nie bedzie to # to sie cofnie o 1 i zapisze to wszystko do standardu
  209.  
  210. fscanf(plik, "%c", &komentarze); //czytanie pojedynczego znaku
  211. while (komentarze == '#')//szukanie komentarzy
  212. {
  213. while (komentarze != '\n')//dopoki nie jest nowa linia (spacja)
  214. {
  215. fscanf(plik, "%c", &komentarze);
  216.  
  217. }
  218. fscanf(plik, "%c", &komentarze);//przeskok do nowej lini
  219. }
  220.  
  221. fseek(plik, -1, SEEK_CUR); //przesuniecie znacznika pliku o jeden w tył
  222. fscanf(plik, "%s\n", &hp1->standard);//musi być na adres :)(hp1->wysokosc) * sizeof&(hp1->piksele) //czytanie do nowej linii
  223.  
  224. //czytanie szerokosci
  225. //taka sama zasada
  226.  
  227. fscanf(plik, "%c", &komentarze);
  228. while (komentarze == '#')
  229. {
  230. while (komentarze != '\n')
  231. {
  232. fscanf(plik, "%c", &komentarze);
  233.  
  234. }
  235. fscanf(plik, "%c", &komentarze);
  236.  
  237. }
  238.  
  239. fseek(plik, -1, SEEK_CUR);
  240. fscanf(plik, "%d", &hp1->szerokosc);
  241.  
  242. //czytanie wysokosci
  243.  
  244. fscanf(plik, "%c", &komentarze);
  245. while (komentarze == '#')
  246. {
  247. while (komentarze != '\n')
  248. {
  249. fscanf(plik, "%c", &komentarze);
  250.  
  251. }
  252. fscanf(plik, "%c", &komentarze);
  253.  
  254. }
  255.  
  256. fseek(plik, -1, SEEK_CUR);
  257. fscanf(plik, "%d", &hp1->wysokosc);
  258.  
  259. //czytanie maksWartosciSzarosci
  260.  
  261. fscanf(plik, "%c", &komentarze);
  262. while (komentarze == '#')
  263. {
  264. while (komentarze != '\n')
  265. {
  266. fscanf(plik, "%c", &komentarze);
  267.  
  268. }
  269. fscanf(plik, "%c", &komentarze);
  270.  
  271. }
  272. fseek(plik, -1, SEEK_CUR);
  273. fscanf(plik, "%d", &hp1->zakres);
  274.  
  275. //DEKLARACJA pamieci na tablice 2 wymiary
  276.  
  277. hp1->piksele = (int**)malloc(hp1->wysokosc * sizeof(int)); //tworzenie tablicy dynamicznej w pionie
  278. if (hp1->piksele != NULL)
  279. {
  280. for (int i = 0; i < (hp1->wysokosc); i++)
  281. {
  282.  
  283. hp1->piksele[i] = (int*)malloc(hp1->szerokosc * sizeof(int)); //tworzenie tablic dynamicznych w poziomie - w kazdym elemencie tablicy z pionu powstaje tablica w poziomie tworzac macierz
  284. if (hp1->piksele[i] == NULL)
  285. {
  286. return i;
  287. }
  288.  
  289. }
  290.  
  291. //Odczytanie wartosci pikseli z pliku i przepisanie ich do utworzonej tablicy dynamicznej
  292.  
  293. for (int i = 0; i < hp1->wysokosc; i++)
  294. {
  295. for (int j = 0; j < hp1->szerokosc; j++)
  296. {
  297. fscanf(plik, "%c", &komentarze);//czyta znak
  298.  
  299.  
  300. while (komentarze == '#')//jezeli komentarz
  301. {
  302. while (komentarze != '\n')//dopóki nie \n
  303. {
  304. fscanf(plik, "%c", &komentarze);
  305.  
  306. }
  307. fscanf(plik, "%c", &komentarze);
  308.  
  309. }
  310. fseek(plik, -1, SEEK_CUR); //jezeli nie komentarz to cofa sie o 1
  311. fscanf(plik, "%d", &hp1->piksele[i][j]); //i pobiera go do macierzy
  312. }
  313.  
  314. }
  315. printf("standard:%s\n", &hp1->standard);
  316. }
  317. else
  318. {
  319. puts("problem z alokacja tablicy");
  320. fclose(plik);
  321. return 0;
  322. }
  323.  
  324. fclose(plik);
  325. return 1;
  326.  
  327. }
  328.  
  329. int zapis_pliku(struct obraz hp1)
  330. {
  331. FILE* plik;
  332. char x = 0;
  333. hp1.nazwa_pliku = (char*)malloc(100 * sizeof(char));//alokacja tablicy z nazwa
  334. puts("Podaj nazwe pliku:");
  335. scanf("%s", hp1.nazwa_pliku);//wczytanie nazyw obrazu
  336. plik = fopen(hp1.nazwa_pliku, "w");//otwarcie pliku o podanej nazwie
  337. if (plik == NULL)//czy plik sie utworzyl
  338. {
  339. perror("Tablice.csv");//komunikat dlaczego blad
  340. return 0;
  341. }
  342.  
  343.  
  344. fprintf(plik, "%s\n", &hp1.standard);
  345. fprintf(plik, "%d %d\n", hp1.szerokosc, hp1.wysokosc);
  346. fprintf(plik, "%d\n", hp1.zakres);
  347.  
  348. for (int i = 0; i < hp1.wysokosc; i++)//wpisanie wartosci z pliku
  349. {
  350. for (int j = 0; j < hp1.szerokosc; j++)
  351. {
  352.  
  353. fprintf(plik, "%d ", hp1.piksele[i][j]);
  354.  
  355. }
  356. fprintf(plik, "\n");
  357. }
  358. fclose(plik);
  359. puts("Utworzono plik");
  360. Sleep(1000);
  361.  
  362. return 1;
  363. }
  364.  
  365. void zwalnianie_pamieci(struct obraz* hp1)
  366. {
  367.  
  368. for (int i = 0; i < (hp1->wysokosc); i++)
  369. {
  370. free((hp1->piksele[i]));
  371. }
  372. free((hp1->piksele));
  373.  
  374.  
  375. }
  376.  
  377. void zwalnianie_blad(struct obraz* hp1, int ile)
  378. {
  379. for (int i = 0; i < ile; i++)
  380. {
  381. free((hp1->piksele[i]));
  382. }
  383. free((hp1->piksele));
  384.  
  385. }
  386.  
  387. struct obraz kopia_zapasowa(struct obraz* hp1)//kopia robocza aby mozna ten sam obraz przekształcać
  388. {
  389. int i, j;
  390. struct obraz kopia_robocza;
  391. kopia_robocza.zakres = hp1->zakres;//przepisanie wartosci
  392. kopia_robocza.szerokosc = hp1->szerokosc;
  393. kopia_robocza.wysokosc = hp1->wysokosc;
  394. kopia_robocza.standard = hp1->standard;
  395. kopia_robocza.nazwa_pliku = hp1->nazwa_pliku;
  396. kopia_robocza.piksele = (int**)malloc(hp1->wysokosc * sizeof(int));//alokacja pamieci
  397. if (kopia_robocza.piksele != NULL)
  398. {
  399. for (i = 0; i < hp1->wysokosc; i++)
  400. {
  401. kopia_robocza.piksele[i] = (int*)malloc(hp1->szerokosc * sizeof(int));
  402. if (kopia_robocza.piksele == NULL)
  403. {
  404. printf("BLAD!!!");
  405. zwalnianie_blad(&kopia_robocza, i);
  406. }
  407. }
  408. }
  409. else printf("BLAD!!!");
  410. for (i = 0; i < hp1->wysokosc; i++)
  411. {
  412. for (j = 0; j < hp1->szerokosc; j++)
  413. {
  414. kopia_robocza.piksele[i][j] = hp1->piksele[i][j];
  415.  
  416. }
  417. }
  418. return kopia_robocza;
  419.  
  420. }
  421.  
  422. int obrot(struct obraz* hp1)
  423. {
  424. int i, j;
  425. struct obraz kopia_robocza;
  426. kopia_robocza = kopia_zapasowa(hp1);//utworzenie lokalnej kopi
  427. for (i = 0; i < hp1->wysokosc; i++)//pamieci sie sypala dlatego czyszczenie
  428. {
  429. free(hp1->piksele[i]);
  430. }
  431. free(hp1->piksele);
  432.  
  433. hp1->szerokosc = kopia_robocza.wysokosc;//przepisanie wartosci
  434. hp1->wysokosc = kopia_robocza.szerokosc;
  435. hp1->piksele = (int**)malloc(hp1->wysokosc * sizeof(int));//alokacja
  436. if (hp1->piksele != NULL)
  437. {
  438. for (i = 0; i < hp1->wysokosc; i++)
  439. {
  440. hp1->piksele[i] = (int*)malloc(hp1->szerokosc * sizeof(int));
  441. if (hp1->piksele == NULL)
  442. return 1;
  443. }
  444. }
  445. for (i = 0; i < hp1->wysokosc; i++)
  446. {
  447. for (j = 0; j < hp1->szerokosc; j++)
  448. {
  449. hp1->piksele[i][j] = kopia_robocza.piksele[j][kopia_robocza.szerokosc - i - 1];//obrot
  450. }
  451. }
  452. for (i = 0; i < kopia_robocza.wysokosc; i++)
  453. {
  454. free(kopia_robocza.piksele[i]);//zwalnianie lokalnej
  455. }
  456. free(kopia_robocza.piksele);
  457. return 0;
  458.  
  459.  
  460.  
  461.  
  462. }
  463.  
  464. void histogram(struct obraz* hp1)//to dziala, problem z zapisem
  465. {
  466. int i, j, z;
  467. int licznik = 0;
  468. int max = 0;
  469. int* tab;
  470. //deklaracja tablicy na zapisywanie wynikow do histogramu
  471. tab = (int**)malloc(hp1->zakres * sizeof(int));
  472.  
  473. for (z = 0; z < hp1->zakres + 1; z++) //+1 bo nie lapalo maksymalnej wartosci piksela
  474. {
  475. for (i = 0; i < hp1->wysokosc; i++)
  476. {
  477. for (j = 0; j < hp1->szerokosc; j++)
  478. {
  479. if (hp1->piksele[i][j] == z)
  480. {
  481. licznik++;
  482. }
  483.  
  484. }
  485. }
  486. printf("pikseli o wartosci [%d] jest %d\n", z, licznik);
  487. tab[z] = licznik;
  488. licznik = 0;
  489. }
  490.  
  491. //zapis do pliku csv
  492.  
  493. FILE* plik;
  494.  
  495. z = 0;
  496. plik = fopen("histogram.csv", "w");
  497.  
  498. if (plik == NULL)//czy plik sie otworzyl
  499. {
  500. perror("histogram.csv");//komunikat dlaczego blad
  501.  
  502. }
  503.  
  504. for (z = 0; z < hp1->zakres + 1; z++)
  505. {
  506. fprintf(plik, "%d; %d\n", z, tab[z]);
  507.  
  508. }
  509.  
  510. fclose(plik);
  511. printf("histogram zostal zapisany do pliku csv\n");
  512.  
  513. }
  514.  
  515.  
  516. void negatyw(struct obraz* hp1)
  517. {
  518. int i, j;
  519. for (i = 0; i < hp1->wysokosc; i++)
  520. {
  521. for (j = 0; j < hp1->szerokosc; j++)
  522. {
  523. hp1->piksele[i][j] = hp1->zakres - hp1->piksele[i][j];//wzor z instrukcji
  524. }
  525. }
  526.  
  527. }
  528. void pieprz_sol(struct obraz* hp1)
  529. {
  530. int i, j;
  531. for (i = 0; i < hp1->wysokosc; i++)
  532. {
  533. for (j = 0; j < hp1->szerokosc; j++)
  534. {
  535. if (rand() % 11 < 1)//prawdopodobienstwo
  536. {
  537. if (rand() % 2) hp1->piksele[i][j] = 0;
  538. else
  539. {
  540. hp1->piksele[i][j] = hp1->zakres;
  541. }
  542. }
  543.  
  544. }
  545. }
  546. }
  547. int filtr(struct obraz* hp1)
  548. {
  549. int gauss[3][3] = {
  550. {1,2,1},
  551. {2,4,2},
  552. {1,2,1}
  553. };
  554.  
  555. int i, j, k, l;
  556. int okno = 0;
  557. int suma = 16;
  558. struct obraz kopia_robocza;
  559. kopia_robocza = kopia_zapasowa(hp1);
  560. for (i = 0; i < hp1->wysokosc - 2; i++)
  561. {
  562. for (j = 0; j < hp1->szerokosc - 2; j++)
  563. {
  564. for (k = 0; k < 3; k++)
  565. {
  566. for (l = 0; l < 3; l++)
  567. {
  568. okno = okno + kopia_robocza.piksele[i + k][j + l] * gauss[k][l];
  569. }
  570. }
  571. hp1->piksele[i + 1][j + 1] = okno / suma;
  572. okno = 0;
  573. }
  574. }
  575. for (i = 0; i < kopia_robocza.wysokosc; i++)
  576. {
  577. free(kopia_robocza.piksele[i]);
  578. }
  579. free(kopia_robocza.piksele);
  580. return 0;
  581.  
  582.  
  583.  
  584.  
  585. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement