-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathhelpers.c
More file actions
189 lines (186 loc) · 6.16 KB
/
helpers.c
File metadata and controls
189 lines (186 loc) · 6.16 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
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
#include "helpers.h"
#include <math.h>
void swap(int *a, int *b);
// Convert image to grayscale
void grayscale(int height, int width, RGBTRIPLE image[height][width]) //grayscale function
{
for (int i = 0; i < height; i++) //for loop to iterate over rows
{
for (int j = 0; j < width; j++) //for loop to iterate over column(each pixel)
{
float Red = image[i][j].rgbtRed; //take old value of red in each pixel and store it in new
float Green = image[i][j].rgbtGreen; //take old value of green in each pixel and store it in new
float Blue = image[i][j].rgbtBlue; //take old value of blue in each pixel and store it in new
int avg = round((Red + Green + Blue) / 3);
image[i][j].rgbtRed = avg;
image[i][j].rgbtGreen = avg;
image[i][j].rgbtBlue = avg;
}
}
return;
}
// Convert image to sepia
void sepia(int height, int width, RGBTRIPLE image[height][width])
{
for (int i = 0; i < height; i++)
{
for (int j = 0; j < width; j++)
{
int originalRed = image[i][j].rgbtRed;
int originalGreen = image[i][j].rgbtGreen;
int originalBlue = image[i][j].rgbtBlue;
int sepiaRed = round((.393 * originalRed) + (.769 * originalGreen) + (.189 * originalBlue));
if (sepiaRed > 255)
{
image[i][j].rgbtRed = 255;
}
else
{
image[i][j].rgbtRed = sepiaRed;
}
int sepiaGreen = round((.349 * originalRed) + (.686 * originalGreen) + (.168 * originalBlue));
if (sepiaGreen > 255)
{
image[i][j].rgbtGreen = 255;
}
else
{
image[i][j].rgbtGreen = sepiaGreen;
}
int sepiaBlue = round((.272 * originalRed) + (.534 * originalGreen) + (.131 * originalBlue));
if (sepiaBlue > 255)
{
image[i][j].rgbtBlue = 255;
}
else
{
image[i][j].rgbtBlue = sepiaBlue;
}
}
}
return;
}
// Reflect image horizontally
void reflect(int height, int width, RGBTRIPLE image[height][width])
{
int y = round(width / 2.0);
RGBTRIPLE tmp[width];
for (int i = 0; i < height; i++)
{
for (int j = 0; j < y; j++)
{
tmp[j] = image[i][j];
image[i][j] = image[i][width - 1 - j];
image[i][width - 1 - j] = tmp[j];
}
}
return;
}
void swap(int *a, int *b)
{
int tempB = *a;
*a = *b;
*b = tempB;
}
void blur(int height, int width, RGBTRIPLE image[height][width])
{
RGBTRIPLE temp[height][width];
for (int i = 0; i < height; i++)
{
for (int j = 0; j < width; j++)
{
temp[i][j] = image[i][j];
}
}
for (int i = 0; i < height; i++)
{
for (int j = 0; j < width; j++)
{
int sum_blue;
int sum_green;
int sum_red;
float counter;
sum_blue = sum_green = sum_red = counter = 0;
//CORNERS
//corner pixel on bottom right
if (i >= 0 && j >= 0)
{
sum_red += temp[i][j].rgbtRed;
sum_green += temp[i][j].rgbtGreen;
sum_blue += temp[i][j].rgbtBlue;
counter++;
}
//corner pixel on bottom left
if (i >= 0 && j - 1 >= 0)
{
sum_red += temp[i][j - 1].rgbtRed;
sum_green += temp[i][j - 1].rgbtGreen;
sum_blue += temp[i][j - 1].rgbtBlue;
counter++;
}
//corner pixel on top left
if (i - 1 >= 0 && j >= 0)
{
sum_red += temp[i - 1][j].rgbtRed;
sum_green += temp[i - 1][j].rgbtGreen;
sum_blue += temp[i - 1][j].rgbtBlue;
counter++;
}
//corner pixel on top right
if (i - 1 >= 0 && j - 1 >= 0)
{
sum_red += temp[i - 1][j - 1].rgbtRed;
sum_green += temp[i - 1][j - 1].rgbtGreen;
sum_blue += temp[i - 1][j - 1].rgbtBlue;
counter++;
}
//FOUR EDGES
//pixels on bottom edge
if ((i >= 0 && j + 1 >= 0) && (i >= 0 && j + 1 < width))
{
sum_red += temp[i][j + 1].rgbtRed;
sum_green += temp[i][j + 1].rgbtGreen;
sum_blue += temp[i][j + 1].rgbtBlue;
counter++;
}
//pixels on top edge
if ((i - 1 >= 0 && j + 1 >= 0) && (i - 1 >= 0 && j + 1 < width))
{
sum_red += temp[i - 1][j + 1].rgbtRed;
sum_green += temp[i - 1][j + 1].rgbtGreen;
sum_blue += temp[i - 1][j + 1].rgbtBlue;
counter++;
}
//pixels on left edge
if ((i + 1 >= 0 && j >= 0) && (i + 1 < height && j >= 0))
{
sum_red += temp[i + 1][j].rgbtRed;
sum_green += temp[i + 1][j].rgbtGreen;
sum_blue += temp[i + 1][j].rgbtBlue;
counter++;
}
//pixels on right edge
if ((i + 1 >= 0 && j - 1 >= 0) && (i + 1 < height && j - 1 >= 0))
{
sum_red += temp[i + 1][j - 1].rgbtRed;
sum_green += temp[i + 1][j - 1].rgbtGreen;
sum_blue += temp[i + 1][j - 1].rgbtBlue;
counter++;
}
//MIDDLE PIXELS
//middle pixels
if ((i + 1 >= 0 && j + 1 >= 0) && (i + 1 < height && j + 1 < width))
{
sum_red += temp[i + 1][j + 1].rgbtRed;
sum_green += temp[i + 1][j + 1].rgbtGreen;
sum_blue += temp[i + 1][j + 1].rgbtBlue;
counter++;
}
//find average colour value
image[i][j].rgbtRed = round(sum_red / counter);
image[i][j].rgbtGreen = round(sum_green / counter);
image[i][j].rgbtBlue = round(sum_blue / counter);
}
}
return;
}