Advertisement
Guest User

obrazy PGM

a guest
Jan 27th, 2017
211
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 9.19 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. #define MAX 512         // maksymalny rozmiar obrazu
  6. #define DL_LINII 1024   // dlugosc buforow pomocniczych
  7.  
  8. // ODCZYT OBRAZU Z PLIKU DO TABLICY:
  9. int czytaj (FILE *plik_wej, int obraz_pgm [][512], int *wymX, int *wymY, int *szarosci)
  10. {
  11.     char buff [DL_LINII];   // bufor pomocniczy
  12.     int znak;               // zmienna pomocnicza
  13.     int koniec;             // monitorowanie konca danych w pliku
  14.     int i, j;
  15.  
  16.     // KONTROLA POPRAWNOSCI PLIKU:
  17.     if (plik_wej == NULL)
  18.     {
  19.         fprintf (stderr, "Blad: podany plik jest nieprawidlowy!\n");
  20.         return 0;
  21.     }
  22.  
  23.     // "NUMER MAGICZNY":
  24.     if (fgets (buff, DL_LINII, plik_wej) == NULL)   koniec = 1;     // wczytanie pierwsze linii z pliku
  25.     if (buff [0] != 'P' || buff [1] != '2' || koniec)
  26.     {
  27.         fprintf (stderr, "Blad: podany plik nie jest plikiem PGM!\n");
  28.         return 0;
  29.     }
  30.  
  31.     // POMIJANIE KOMENTARZY:
  32.     do {
  33.         if ((znak = fgetc(plik_wej)) == '#')
  34.         {
  35.             if (fgets(buff, DL_LINII, plik_wej) == NULL)    koniec=1;
  36.             else    ungetc(znak, plik_wej);
  37.         }
  38.     } while (znak == '#' && !koniec);
  39.  
  40.     // POBRANIE PARAMETROW OBRAZU:
  41.     if (fscanf (plik_wej, "%d %d %d", wymX, wymY, szarosci) != 3)
  42.     {
  43.         fprintf (stderr, "Blad: Brak wymiarow obrazu lub liczby stopni szarosci\n");
  44.         return(0);
  45.     }
  46.  
  47.     // ZAPISANIE OBRAZU W TABLICY:
  48.     for (i=0; i<*wymY; i++)
  49.     {
  50.         for (j=0; j<*wymX; j++)
  51.         {
  52.             if (fscanf(plik_wej, "%d " ,&(obraz_pgm [i][j])) != 1)
  53.             {
  54.                 fprintf (stderr, "Blad: Niewlasciwe wymiary obrazu\n");
  55.                 return(0);
  56.             }
  57.         }
  58.     }
  59.     return *wymX * *wymY;
  60. }
  61.  
  62. // WYSWIETLANIE OBRAZU:
  63. void wyswietl (char *nazwa_pliku)
  64. {
  65.     char polecenie [DL_LINII];          // bufor pomocniczy do zestawienia polecenia
  66.  
  67.     strcpy (polecenie, "display ");     // konstrukcja polecenia postaci
  68.     strcat (polecenie, nazwa_pliku);        // display "nazwa_pliku" &
  69.     strcat (polecenie, " &");
  70.     printf ("%s\n", polecenie);         // wydruk kontrolny polecenia
  71.     system (polecenie);                 // wykonanie polecenia
  72. }
  73.  
  74. // ZAPISYWANIE OBRAZU DO PLIKU PGM:
  75. int zapisz (FILE *plik_wyj, int obraz_pgm [][MAX], int wymX, int wymY, int szarosci)
  76. {
  77.     int i, j;
  78.  
  79.     fprintf (plik_wyj, "P2\n");
  80.     fprintf (plik_wyj, "%d %d\n", wymX, wymY);
  81.     fprintf (plik_wyj, "%d\n", szarosci);
  82.  
  83.     for (i=0; i<wymY; i++)
  84.     {
  85.         for (j=0; j<wymX; j++)
  86.         {
  87.             fprintf (plik_wyj, "%d ", obraz_pgm [i][j]);
  88.         }
  89.     fprintf (plik_wyj, "\n");
  90.     }
  91.  
  92.     return 0;
  93. }
  94.  
  95. // NEGATYW:
  96. int negatyw (int obraz_pgm [][MAX], int *wymX, int *wymY, int szarosci)
  97. {
  98.     int i, j;
  99.  
  100.     for (i=0; i<*wymY;++i)
  101.     {
  102.         for (j=0; j<*wymX;++j) obraz_pgm [i][j] = szarosci - obraz_pgm [i][j];
  103.     }
  104.  
  105. }
  106.  
  107. // KONTUROWANIE:
  108. int konturowanie (int obraz_pgm [][MAX], int *wymX, int *wymY)
  109. {
  110.     int i, j;
  111.     for (i=0; i<*wymY; ++i)
  112.     {
  113.         for (j=0; j<*wymX; ++j)
  114.         {
  115.             obraz_pgm [i][j] = (abs(obraz_pgm [i+1][j] - obraz_pgm [i][j]) + abs(obraz_pgm [i][j+1] - obraz_pgm [i][j]))/2;
  116.         }
  117.     }
  118. }
  119.  
  120. // PROGOWANIE:
  121. int progowanie (int obraz_pgm [][MAX], int *wymX, int *wymY, int szarosci, int prog)
  122. {
  123.     int i, j;
  124.     for (i=0; i<*wymY; ++i)
  125.     {
  126.         for (j=0; j<*wymX; ++j)
  127.         {
  128.             if (obraz_pgm [i][j] <= (szarosci * prog/100)) obraz_pgm [i][j] = 0;
  129.             else obraz_pgm [i][j] = szarosci;
  130.         }
  131.     }
  132. }
  133.  
  134. // PROG BIELI:
  135. int prog_bieli (int obraz_pgm [][MAX], int *wymX, int *wymY, int szarosci, int prog)
  136. {
  137.     int i, j;
  138.     for (i=0; i<*wymY; ++i)
  139.         {
  140.             for (j=0; j<*wymX; ++j)
  141.             {
  142.                 if (obraz_pgm [i][j] > prog) obraz_pgm [i][j] = szarosci;
  143.             }
  144.         }
  145. }
  146.  
  147. // PROG CZERNI:
  148. int prog_czerni (int obraz_pgm [][MAX], int *wymX, int *wymY, int szarosci, int prog)
  149. {
  150.     int i, j;
  151.     for (i=0; i<*wymY; ++i)
  152.         {
  153.             for (j=0; j<*wymX; ++j)
  154.             {
  155.                 if (obraz_pgm [i][j] <= prog) obraz_pgm [i][j] = 0;
  156.             }
  157.         }
  158. }
  159.  
  160. int main ()
  161. {
  162.     int Wybor, Koniec=0;
  163.     int obraz [MAX][MAX], wymX, wymY, szarosci, prog;
  164.     int CzyWczytany = 0;
  165.     FILE *plik;
  166.     char *nazwa_wej;
  167.     char *nazwa_wyj;
  168.  
  169.     do {
  170.     printf ("\n\n\nProgram do przetwarzania obrazow PGM\n\n");
  171.     printf ("******************************************************\n\n");
  172.     printf ("   1 - WCZYTAJ OBRAZ\n");
  173.     printf ("   2 - ZAPISZ OBRAZ\n");
  174.     printf ("   3 - NEGATYW\n");
  175.     printf ("   4 - KONTUROWANIE\n");
  176.     printf ("   5 - PROGOWANIE\n");
  177.     printf ("   6 - PROG BIELI\n");
  178.     printf ("   7 - PROG CZERNI\n");
  179.     printf ("   8 - WYSWIETL OBRAZ\n");
  180.     printf ("   9 - KONIEC\n\n");
  181.     printf ("******************************************************\n");
  182.  
  183.     printf ("Twoj wybor: ");
  184.     scanf ("%d", &Wybor);
  185.  
  186.     switch (Wybor)
  187.     {
  188.         // WCZYTANIE:
  189.         case 1:     CzyWczytany = 0;
  190.                     printf ("Podaj nazwe pliku: ");
  191.                     scanf ("%s", &nazwa_wej);
  192.                     printf ("%s", nazwa_wej);
  193.                     plik = fopen (nazwa_wej, "r");
  194.                     if (czytaj (plik, obraz, &wymX, &wymY, &szarosci) != 0);
  195.                     printf ("Obraz wczytany pomyslnie\n");
  196.                     CzyWczytany = 1;
  197.                     fclose (plik);
  198.                     break;
  199.  
  200.         // ZAPIS:
  201.         case 2:     if (CzyWczytany == 0)
  202.                     {
  203.                         printf ("Blad: Najpierw musisz wczytac obraz!\n");
  204.                         break;
  205.                     }
  206.                     printf ("Podaj nazwe zapisywanego pliku razem z rozszerzeniem: ");
  207.                     scanf ("%s", &nazwa_wyj);
  208.                     plik = fopen (nazwa_wyj, "w");
  209.                     zapisz (plik, obraz, wymX, wymY, szarosci);
  210.                     fclose (plik);
  211.                     printf ("Plik %s zapisany pomyslnie\n", nazwa_wyj);
  212.  
  213.         // NEGATYW:
  214.         case 3:     if (CzyWczytany == 0)
  215.                     {
  216.                         printf ("Blad: Najpierw musisz wczytac obraz!\n");
  217.                         break;
  218.                     }
  219.                     negatyw (obraz, &wymX, &wymY, szarosci);
  220.                     printf ("Negatywowanie zakonczone\n");
  221.                     break;
  222.  
  223.         // KONTUROWANIE:
  224.         case 4:     if (CzyWczytany == 0)
  225.                     {
  226.                         printf ("Blad: Najpierw musisz wczytac obraz!\n");
  227.                         break;
  228.                     }
  229.                     konturowanie (obraz, &wymX, &wymY);
  230.                     printf ("Konturowanie zakonczone\n");
  231.                     break;
  232.  
  233.         // PROGOWANIE:
  234.         case 5:     if (CzyWczytany == 0)
  235.                     {
  236.                         printf ("Blad: Najpierw musisz wczytac obraz!\n");
  237.                         break;
  238.                     }
  239.                     printf ("Podaj wartosc progu (1-100): ");
  240.                     scanf ("%d", &prog);
  241.                     if (prog<=100 && prog>=1)
  242.                     {
  243.                         progowanie (obraz, &wymX, &wymY, szarosci, prog);
  244.                         printf ("Progowanie zakonczone\n");
  245.                     }
  246.                     else    printf ("Blad: Nieprawidlowa wartosc progu!\n");
  247.                     break;
  248.  
  249.         // PROGOWANIE BIELI:
  250.         case 6:     if (CzyWczytany == 0)
  251.                     {
  252.                         printf ("Blad: Najpierw musisz wczytac obraz!\n");
  253.                         break;
  254.                     }
  255.                     printf ("Podaj wartosc progu (1-100): ");
  256.                     scanf ("%d", &prog);
  257.                     if (prog<=100 && prog>=1)
  258.                     {
  259.                         prog_bieli (obraz, &wymX, &wymY, szarosci, prog);
  260.                         printf ("Progowanie bieli zakonczone\n");
  261.                     }
  262.                     else    printf ("Blad: Nieprawidlowa wartosc progu!\n");
  263.                     break;
  264.  
  265.         // PROGOWANIE CZERNI:
  266.         case 7:     if (CzyWczytany == 0)
  267.                     {
  268.                         printf ("Blad: Najpierw musisz wczytac obraz!\n");
  269.                         break;
  270.                     }
  271.                     printf ("Podaj wartosc progu (1-100): ");
  272.                     scanf ("%d", &prog);
  273.                     if (prog<=100 && prog>=1)
  274.                     {
  275.                         prog_czerni (obraz, &wymX, &wymY, szarosci, prog);
  276.                         printf ("Progowanie czerni zakonczone\n");
  277.                     }
  278.                     else    printf ("Blad: Nieprawidlowa wartosc progu!\n");
  279.                     break;
  280.  
  281.         // WYSWIETLENIE OBRAZU:
  282.         case 8:     if (CzyWczytany == 0)
  283.                     {
  284.                         printf ("Blad: Najpierw musisz wczytac obraz!\n");
  285.                         break;
  286.                     }
  287.                     wyswietl (nazwa_wej);
  288.                     break;
  289.  
  290.         case 9:     printf ("Program zakonczyl dzialanie\n");
  291.                     Koniec = 1;
  292.     }
  293.     }   while (Koniec == 0);
  294.  
  295. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement