1 static inline float colordiff
(float4 pixA
,
4 float4 pix
= pixA - pixB
;
6 return pix.x
+ pix.y
+ pix.z
;
9 __kernel void snn_mean
(__global const float4
*src_buf
,
12 __global float4
*dst_buf
,
16 int gidx
= get_global_id
(0);
17 int gidy
= get_global_id
(1);
18 int offset
= gidy
* get_global_size
(0) + gidx
;
20 const float4 center_pix
=
21 *(src_buf + ((radius + gidx
) + (gidy + radius
) * src_width
));
22 float4 accumulated
= 0;
27 for
(int i
= -radius
; i <= 0; i++)
29 for
(int j
= -radius
; j <= 0 ; j++)
31 float4 selected_pix
= center_pix
;
32 float best_diff
= 1000.0f
;
38 gidx + j + radius, gidx - j + radius,
39 gidx - j + radius, gidx + j + radius
43 gidy
+ i
+ radius
, gidy - i
+ radius
,
44 gidy
+ i
+ radius
, gidy - i
+ radius
47 for
(int k
= 0; k < 4; k++)
49 if
(xs[k] >= 0 && xs[k] < src_width
&&
50 ys
[k] >= 0 && ys[k] < src_height
)
53 *(src_buf + (xs[k] + ys[k] * src_width
));
54 float diff
= colordiff
(tpix, center_pix
);
63 accumulated
+= selected_pix
;
69 dst_buf
[offset] = accumulated / (float4)(count);
74 for (int i = -radius; i <= 0; i++)
76 for (int j = -radius; j <= radius; j++)
78 float4 selected_pix = center_pix;
79 float best_diff = 1000.0f;
81 /* skip computations for the center pixel */
86 gidx + j + radius, gidx - j + radius,
87 gidx - j + radius, gidx + j + radius
91 gidy + i + radius, gidy - i + radius,
92 gidy + i + radius, gidy - i + radius
95 for (int k = 0; k < 2; k++)
97 if (xs[k] >= 0 && xs[k] < src_width &&
98 ys[k] >= 0 && ys[k] < src_height)
101 *(src_buf + (xs[k] + ys[k] * src_width));
102 float diff = colordiff (tpix, center_pix);
103 if (diff < best_diff)
111 accumulated += selected_pix;
113 if (i == 0 && j == 0)
117 dst_buf[offset] = accumulated
/ (float4)(count);