/
blur.go
82 lines (79 loc) · 1.4 KB
/
blur.go
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
package physarum
func boxBlurH(src, dst []float32, w, h, r int, scale float32) {
m := scale / float32(r+r+1)
ww := w - (r*2 + 1)
for i := 0; i < h; i++ {
ti := i * w
li := ti + w - 1 - r
ri := ti + r
val := src[li]
for j := 0; j < r; j++ {
val += src[li+j+1]
val += src[ti+j]
}
for j := 0; j <= r; j++ {
val += src[ri] - src[li]
dst[ti] = val * m
li++
ri++
ti++
}
li = i * w
for j := 0; j < ww; j++ {
val += src[ri] - src[li]
dst[ti] = val * m
li++
ri++
ti++
}
ri = i * w
for j := 0; j < r; j++ {
val += src[ri] - src[li]
dst[ti] = val * m
li++
ri++
ti++
}
}
}
func boxBlurV(src, dst []float32, w, h, r int, scale float32) {
m := scale / float32(r+r+1)
hh := h - (r*2 + 1)
for i := 0; i < w; i++ {
ti := i
li := ti + (h-1-r)*w
ri := ti + r*w
val := src[li]
for j := 0; j < r; j++ {
val += src[li+(j+1)*w]
val += src[ti+j*w]
}
for j := 0; j <= r; j++ {
val += src[ri] - src[li]
dst[ti] = val * m
li += w
ri += w
ti += w
}
li = i
for j := 0; j < hh; j++ {
val += src[ri] - src[li]
dst[ti] = val * m
li += w
ri += w
ti += w
}
ri = i
for j := 0; j < r; j++ {
val += src[ri] - src[li]
dst[ti] = val * m
li += w
ri += w
ti += w
}
}
}
func boxBlur(src, tmp []float32, w, h, r int, scale float32) {
boxBlurH(src, tmp, w, h, r, 1)
boxBlurV(tmp, src, w, h, r, scale)
}