-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathimage.c
More file actions
106 lines (85 loc) · 3.24 KB
/
image.c
File metadata and controls
106 lines (85 loc) · 3.24 KB
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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
#include <stdio.h>
#include <math.h>
#include "image.h"
#include "util.h"
#include "file.h"
void getImageGrid(FILE *input, uc **m, ull row, ull col, int type) {
int value;
// Imagem P2
if (type == 1) {
for(ull i = 0 ; i < row ; i++) {
for(ull j = 0 ; j < col ; j++) {
fscanf(input, " %d", &value);
m[i][j] = (uc)value;
}
}
}
// Imagem P5
else if (type == 2) {
for(ull i = 0 ; i < row ; i++) {
for(ull j = 0 ; j < col ; j++) {
value = fgetc(input);
m[i][j] = (uc)value;
}
}
}
}
void filtroNegativo(_PGMImage *inputImage, _PGMImage *outputImage) {
outputImage->type = inputImage->type;
outputImage->row = inputImage->row;
outputImage->col = inputImage->col;
outputImage->max_gray = inputImage->max_gray;
outputImage->grid = allocateGrid(outputImage->grid, outputImage->row, outputImage->col); // ??
for(ull i = 0 ; i < inputImage->row ; i++)
for(ull j = 0 ; j < inputImage->col ; j++)
outputImage->grid[i][j] = (uc)(inputImage->max_gray - inputImage->grid[i][j]);
}
void rotacaoSimples(_PGMImage *inputImage, _PGMImage *outputImage) {
outputImage->type = inputImage->type;
outputImage->row = inputImage->row;
outputImage->col = inputImage->col;
outputImage->max_gray = inputImage->max_gray;
outputImage->grid = allocateGrid(outputImage->grid, outputImage->row, outputImage->col); // ??
for(ull i = 0 ; i < inputImage->row ; i++)
for(ull j = 0 ; j < inputImage->col ; j++)
outputImage->grid[j][i] = inputImage->grid[inputImage->row - 1 - i][j];
}
void reduzRuido(_PGMImage *inputImage, _PGMImage *outputImage) {
outputImage->type = inputImage->type;
outputImage->row = inputImage->row;
outputImage->col = inputImage->col;
outputImage->max_gray = inputImage->max_gray;
outputImage->grid = allocateGrid(outputImage->grid, outputImage->row, outputImage->col); // ??
int count;
float sum;
for(ull i = 0 ; i < inputImage->row ; i++) {
for(ull j = 0 ; j < inputImage->col ; j++) {
sum = 0;
count = 0;
for(int k = 0 ; k < 3 ; k++) {
for(int l = 0 ; l < 3 ; l++) {
if(pixel_is_valid(inputImage->row, inputImage->col, i-1+k, j-1+l)) {
sum += inputImage->grid[i-1+k][j-1+l];
count++;
}
}
}
outputImage->grid[i][j] = (uc)(sum/count);
}
}
}
void filtroLimiar(_PGMImage *inputImage, _PGMImage *outputImage, int limiar) {
outputImage->type = inputImage->type;
outputImage->row = inputImage->row;
outputImage->col = inputImage->col;
outputImage->max_gray = inputImage->max_gray;
outputImage->grid = allocateGrid(outputImage->grid, outputImage->row, outputImage->col); // ??
for(ull i = 0 ; i < inputImage->row ; i++) {
for(ull j = 0 ; j < inputImage->col ; j++) {
if (inputImage->grid[i][j] >= limiar)
outputImage->grid[i][j] = inputImage->max_gray;
else
outputImage->grid[i][j] = 0;
}
}
}