-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathsobel.cpp
More file actions
69 lines (60 loc) · 1.55 KB
/
Copy pathsobel.cpp
File metadata and controls
69 lines (60 loc) · 1.55 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
#include "sobel.h"
#include <stdlib.h>
void Gradient_X(PIXEL *src, PIXEL *gx, int h, int w) {
int kernel[9] = {
-1, 0, 1,
-2, 0, 2,
-1, 0, 1
};
int idx = 0;
for (int i = 0; i < h - 2; i ++) {
for (int j = 0; j < w - 2; j ++) {
gx[idx] = 0;
for (int m = 0; m < 3; m ++) {
for (int n = 0; n < 3; n ++) {
gx[idx] += kernel[m * 3 + n] * src[(i + m) * w + j + n];
}
}
if (gx[idx] < 0) gx[idx] = 0;
if (gx[idx] > 255) gx[idx] = 255;
idx ++;
}
}
}
void Gradient_Y(PIXEL *src, PIXEL *gy, int h, int w) {
int kernel[9] = {
-1, -2, -1,
0, 0, 0,
1, 2, 1
};
int idx = 0;
for (int i = 0; i < h - 2; i ++) {
for (int j = 0; j < w - 2; j ++) {
gy[idx] = 0;
for (int m = 0; m < 3; m ++) {
for (int n = 0; n < 3; n ++) {
gy[idx] += kernel[m * 3 + n] * src[(i + m) * w + j + n];
}
}
if (gy[idx] < 0) gy[idx] = 0;
if (gy[idx] > 255) gy[idx] = 255;
idx ++;
}
}
}
void sobel(PIXEL src[HEIGHT*WIDTH], PIXEL dst[(HEIGHT-2)*(WIDTH-2)], int rows, int cols)
{
int h = rows;
int w = cols;
PIXEL *gx = (PIXEL *)calloc((h - 2) * (w - 2), sizeof (PIXEL));
PIXEL *gy = (PIXEL *)calloc((h - 2) * (w - 2), sizeof (PIXEL));
Gradient_X(src, gx, h, w);
Gradient_Y(src, gy, h, w);
for (int i = 0; i < (h - 2) * (w - 2); i ++) {
dst[i] = gx[i] + gy[i];
if (dst[i] < 0) dst[i] = 0;
if (dst[i] > 255) dst[i] = 255;
}
free(gx);
free(gy);
}