-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmedian_main.c
executable file
·79 lines (66 loc) · 2.12 KB
/
median_main.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
#include <stdio.h>
#include <stdlib.h>
#include "pgm.h"
#define N_IMAGES 9
void swap(unsigned char *arr, int i, int j);
int partition(unsigned char* arr, int l, int r);
void quick_sort(unsigned char* arr, int l, int r);
unsigned char sort_and_get_median(unsigned char *pixels, int size);
int main(int argc, const char *argv[]) {
const char fileloc[] = "median_images/", extension[] = "pgm";
char file[50], newfile[50];
PGMInfo images[N_IMAGES];
PGMInfo filtered;
unsigned char pixels[N_IMAGES];
printf("\n===== PROCESSED IMAGES\n");
for(int i = 0; i < N_IMAGES; ++i) {
sprintf(file, "%s%d.%s", fileloc, i + 1, extension);
if(i == 1)
filtered = pgm_read(file);
images[i] = pgm_read(file);
if(images[i].error != 0) {
pgm_print_error(images[i]);
exit(1);
} pgm_print_header(images[i]);
}
for(int i = 0; i < filtered.width * filtered.height; ++i) {
for(int j = 0; j < N_IMAGES; ++j)
pixels[j] = images[j].pixels[i];
filtered.pixels[i] = sort_and_get_median(pixels, N_IMAGES);
}
sprintf(newfile, "%sfiltered.%s", fileloc, extension);
if(!pgm_write(newfile, filtered)) {
printf("Error while writing PMG file.\n");
}
printf("\n===== FILE NAMED '%s' IS CREATED.\n", newfile);
for(int i = 0; i < N_IMAGES; ++i)
free(images[i].pixels);
free(filtered.pixels);
return 0;
}
void swap(unsigned char *arr, int i, int j) {
unsigned char temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
int partition(unsigned char* arr, int l, int r) {
unsigned char pivot = arr[r];
int i = l - 1, j = l;
for(; j < r; ++j) {
if(arr[j] < pivot) {
++i;
swap(arr, i, j);
}
} swap(arr, i + 1, r);
return (i + 1);
}
void quick_sort(unsigned char* arr, int l, int r) {
if(l >= r) return;
int p = partition(arr, l, r);
quick_sort(arr, l, p - 1);
quick_sort(arr, p + 1, r);
}
unsigned char sort_and_get_median(unsigned char *pixels, int size) {
quick_sort(pixels, 0, size - 1);
return pixels[(size - 1) / 2];
}