Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define _CRT_SECURE_NO_WARNINGS
- #include <stdio.h>
- #include <stdlib.h>
- #include <math.h>
- #include <time.h>
- struct IMAGE
- {
- int height;
- int width;
- int max;
- int **data;
- };
- int SOBEL_POZIOMY[9] = {
- 1, 2, 1,
- 0, 0, 0,
- -1, -2, -1
- };
- int GAUSS1[9] = {
- 1, 2, 1,
- 2, 4, 2,
- 1, 2, 1
- };
- struct IMAGE* newIMAGE(int height, int width, int max);
- struct IMAGE* loadIMAGE(char *name);
- void saveIMAGE(struct IMAGE *img);
- void skipCOMMENT(FILE *fp);
- void freeIMAGE(struct IMAGE **img);
- void odbicie_poziom(struct IMAGE *img);
- void odbicie_pion(struct IMAGE * img);
- void progowanie(struct IMAGE *img);
- void erozja(struct IMAGE * img);
- void histogram(struct IMAGE *img);
- void filtr(struct IMAGE * img, int * fil, int size);
- int main()
- {
- int numer;
- int exit = 0;
- struct IMAGE *img = NULL;
- char name[50];
- while (!exit)
- {
- printf("Menu:\n");
- printf("1:wczytaj obraz\n");
- printf("2:zapisz obraz\n");
- printf("3:wykonaj erozje (UWAGA: opcja dostepna tylko dla obrazow binarnych)\n");
- printf("4:odbij w poziomie\n");
- printf("5:odbij w pionie\n");
- printf("6:progowanie\n");
- printf("7:utworz histogram\n");
- printf("8:zastosuj filtr Gaussa\n");
- printf("9:zastosuj filtr Sobela\n");
- printf("10:zakoncz program\n");
- scanf("%d", &numer);
- switch (numer)
- {
- case 1:
- printf("Podaj nazwe pliku z dopiskiem '.pgm'\n");
- scanf("%s", name);
- img = loadIMAGE(name);
- if (img == NULL)
- {
- printf("nie ma takiego pliku");
- return 0;
- }
- break;
- case 2:
- saveIMAGE(img);
- break;
- case 3:
- erozja(img);
- break;
- case 4:
- odbicie_poziom(img);
- break;
- case 5:
- odbicie_pion(img);
- break;
- case 6:
- progowanie(img);
- break;
- case 7:
- histogram(img);
- break;
- case 8:
- filtr(img, SOBEL_POZIOMY, sizeof(SOBEL_POZIOMY));
- break;
- case 9:
- filtr(img, GAUSS1, sizeof(GAUSS1));
- break;
- case 10:
- exit = 1;
- printf("KONIEC\n");
- freeIMAGE(&img);
- return 0;
- break;
- default:
- printf("zly numer\n");
- break;
- }
- }
- return 0;
- }
- struct IMAGE* newIMAGE(int width, int height, int max)
- {
- int i;
- struct IMAGE* img = NULL;
- img = (struct IMAGE *) malloc(sizeof(struct IMAGE));
- if (img == NULL)
- {
- printf("blad w alokacji pamieci");
- return NULL;
- }
- img->height = height;
- img->width = width;
- img->max = max;
- img->data = (int**)calloc(height, sizeof(int*));
- if (img->data == NULL)
- {
- printf("blad w alokacji pamieci");
- free(img);
- return NULL;
- }
- for (i = 0; i < height; i++)
- {
- img->data[i] = (int*)calloc(width, sizeof(int));
- if (img->data == NULL)
- {
- printf("blad w alokacji pamieci");
- freeIMAGE(&img);
- return NULL;
- }
- }
- return img;
- }
- void freeIMAGE(struct IMAGE **img)
- {
- int i;
- if (*img == NULL) return;
- if ((*img)->data != NULL)
- {
- for (i = 0; i < (*img)->height; i++)
- {
- if ((*img)->data[i] != NULL) free((*img)->data[i]);
- }
- //free(*img);
- //*img = NULL;
- }
- else return;
- free((*img)->data);
- free(*img);
- *img = NULL;
- }
- void saveIMAGE(struct IMAGE* img)
- {
- int i, j;
- char name[30];
- FILE *fp;
- if (img == NULL)
- {
- printf("Nie wczytales obrazu");
- return;
- }
- printf("Podaj nazwe pliku z dopiskiem '.PGM':\n");
- scanf("%s", name);
- fp = fopen(name, "wt");
- if (fp == NULL)
- {
- printf("blad w utowrzeniu pliku\n");
- return;
- }
- fprintf(fp, "P2\n%d %d\n%d\n", img->width, img->height, img->max);
- for (i = 0; i < img->height; i++)
- {
- for (j = 0; j < img->width; j++)
- {
- fprintf(fp, "%d ", img->data[i][j]);
- }
- fprintf(fp, "\n");
- }
- fclose(fp);
- }
- struct IMAGE* loadIMAGE(char *name)
- {
- FILE *fp;
- char buf[3];
- int w, h, max, i, j, value;
- struct IMAGE* img;
- fp = fopen(name, "rt");
- if (fp == NULL) return NULL;
- fscanf(fp, "%2s", buf);
- if (buf[0] != 'P' || (buf[1] != '2' && buf[1] != '5'))
- {
- printf("typ pliku rozny od .pgm");
- fclose(fp);
- return NULL;
- }
- skipCOMMENT(fp);
- if (fscanf(fp, "%d%d%d", &w, &h, &max) != 3)
- {
- printf("typ pliku rozny od .pgm");
- fclose(fp);
- return NULL;
- }
- img = newIMAGE(w, h, max);
- if (img == NULL)
- {
- printf("blad w tworzeniu pamieci dla obrazka");
- fclose(fp);
- return NULL;
- }
- for (i = 0; i < img->height; i++)
- {
- for (j = 0; j < img->width; j++)
- {
- if (fscanf(fp, "%d", &value) != 1)
- {
- freeIMAGE(&img);
- fclose(fp);
- return NULL;
- }
- img->data[i][j] = value;
- }
- }
- fclose(fp);
- return img;
- }
- void skipCOMMENT(FILE *fp)
- {
- int ch;
- while (1)
- {
- do
- {
- ch = fgetc(fp);
- } while (ch == ' ' || ch == '\r' || ch == '\n' || ch == '\t');
- if (ch == '#')
- {
- do
- {
- ch = fgetc(fp);
- } while (ch != '\r' && ch != '\n' && ch >= 0);
- }
- else
- {
- ungetc(ch, fp);//zwraca wczytany znak do pliku
- return;
- }
- }
- }
- void odbicie_pion(struct IMAGE * img)
- {
- int **temp, i, j, k;
- if (img == NULL)
- {
- printf("Nie wczytales obrazu");
- return;
- }
- temp = (int**)calloc(img->height, sizeof(int));
- for (i = 0; i < img->height; i++)
- {
- temp[i] = (int*)calloc(img->width, sizeof(int));
- }
- for (i = 0; i < img->height; i++)
- {
- k = (img->height) - 1 - i;
- for (j = 0; j < img->width; j++)
- {
- temp[i][j] = img->data[k][j];
- }
- }
- for (i = 0; i < img->height; i++)
- {
- for (j = 0; j < img->width; j++)
- {
- img->data[i][j] = temp[i][j];
- }
- }
- for (i = 0; i < img->height; i++)
- {
- free(temp[i]);
- }
- free(temp);
- }
- void odbicie_poziom(struct IMAGE *img)
- {
- int **temp, i, j, k;
- if (img == NULL)
- {
- printf("Nie wczytales obrazu");
- return;
- }
- temp = (int**)calloc(img->height, sizeof(int));
- for (i = 0; i < img->height; i++)
- {
- temp[i] = (int*)calloc(img->width, sizeof(int));
- }
- for (i = 0; i < img->height; i++)
- {
- for (j = 0; j < img->width; j++)
- {
- k = (img->width) - 1 - j;
- temp[i][j] = img->data[i][k];
- }
- }
- for (i = 0; i < img->height; i++)
- {
- for (j = 0; j < img->width; j++)
- {
- img->data[i][j] = temp[i][j];
- }
- }
- for (i = 0; i < img->height; i++)
- {
- free(temp[i]);
- }
- free(temp);
- }
- void progowanie(struct IMAGE *img)
- {
- int i, j, prog;
- if (img == NULL)
- {
- printf("Nie wczytales obrazu");
- return;
- }
- prog = img->max / 2;
- for (i = 0; i < img->height; i++)
- {
- for (j = 0; j < img->width; j++)
- {
- if (img->data[i][j] >= prog)
- {
- img->data[i][j] = img->max;
- }
- else img->data[i][j] = 0;
- }
- }
- }
- void histogram(struct IMAGE *img) {
- FILE * hist;
- int * tab_hist;
- int i, j;
- tab_hist = (int*)malloc((img->max + 1) * sizeof(int));
- if (tab_hist == NULL) {
- printf("Brak pamieci\n");
- return;
- }
- for (i = 0; i < img->max + 1; i++) {
- tab_hist[i] = 0;
- }
- hist = fopen("histogram.CSV", "wt");
- if (hist == NULL) {
- printf("Nie udalo sie otworzyc pliku do zapisu\n");
- return;
- }
- for (i = 0; i < img->height; i++) {
- for (j = 0; j < img->width; j++) {
- tab_hist[img->data[i][j]]++;
- }
- }
- for (i = 0; i < img->max + 1; i++) {
- fprintf(hist, "%d;%d\n", i, tab_hist[i]);
- }
- free(tab_hist);
- fclose(hist);
- }
- void erozja(struct IMAGE * img) {
- int i, j, k, m;
- int temp;
- int ** tab2;
- tab2 = (int**)malloc((img->height)*sizeof(int*));
- if (tab2 == NULL) {
- printf("Brak pamieci\n");
- return;
- }
- for (i = 0; i < img->height; i++) {
- tab2[i] = (int*)malloc((img->width)*sizeof(int));
- if (tab2[i] == NULL) {
- printf("Brak pamieci\n");
- for (j = 0; i < img->height; j++)
- free(tab2[j]);
- free(tab2);
- return;
- }
- }
- for (i = 0; i < img->height; i++) {
- for (j = 0; j < img->width; j++) {
- tab2[i][j] = img->data[i][j];
- }
- }
- for (i = 0; i < img->height; i++) {
- for (j = 0; j < img->width; j++) {
- temp = 0;
- for (k = 0; k < 3; k++) {
- for (m = 0; m < 3; m++) {
- if (i == 0 || j == 0 || i == img->width - 1 || j == img->height - 1) {
- temp = 0;
- }
- else {
- temp = temp + tab2[i + k - 1][j + m - 1];
- }
- }
- }
- if (temp == 9) {
- img->data[i][j] = 1;
- }
- else
- img->data[i][j] = 0;
- }
- }
- for (i = 0; i < img->height; i++) {
- free(tab2[i]);
- }
- free(tab2);
- }
- void filtr(struct IMAGE * img, int * fil, int size) {
- int **tab;
- printf("%d ", size);
- size = size / sizeof(int);
- int suma, suma_wag = 0, i, j, k, m, rozm = (int)sqrt(size);
- int przesun = rozm / 2;
- tab = (int**)malloc(img->height*sizeof(int*));
- for (i = 0; i < img->height; i++)
- {
- tab[i] = (int*)malloc(img->width*sizeof(int));
- }
- for (i = 0; i < img->height; i++)
- {
- for (j = 0; j < img->width; j++)
- {
- tab[i][j] = img->data[i][j];
- }
- }
- for (i = 0; i < size; i++)
- {
- suma_wag = suma_wag + fil[i];
- }
- for (i = przesun; i < ((img->height) - przesun); i++) {
- for (j = przesun; j < ((img->width) - przesun); j++) {
- suma = 0;
- for (k = 0; k < rozm; k++) {
- for (m = 0; m < rozm; m++) {
- suma = suma + fil[k*rozm + m] * (tab[i + k - przesun][j + m - przesun]);
- }
- }
- if (suma_wag != 0)
- suma = suma / suma_wag;
- if (suma < 0)
- suma = 0;
- if (suma > img->max)
- suma = img->max;
- img->data[i][j] = suma;
- }
- }
- for (i = 0; i < img->height; i++)
- free(tab[i]);
- free(tab);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement