|
|
|
@ -52,7 +52,7 @@ inline half val_from_10(const uchar * source, int gx, int gy, half black_level) |
|
|
|
|
|
|
|
|
|
// normalize |
|
|
|
|
pv = max((half)0.0, pv - black_level); |
|
|
|
|
pv /= (1024.0f - black_level); |
|
|
|
|
pv /= (1024.0 - black_level); |
|
|
|
|
|
|
|
|
|
// correct vignetting |
|
|
|
|
if (CAM_NUM == 1) { // fcamera |
|
|
|
@ -65,18 +65,8 @@ inline half val_from_10(const uchar * source, int gx, int gy, half black_level) |
|
|
|
|
return pv; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
half fabs_diff(half x, half y) { |
|
|
|
|
return fabs(x-y); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
half phi(half x) { |
|
|
|
|
// detection funtion |
|
|
|
|
return 2 - x; |
|
|
|
|
// if (x > 1) { |
|
|
|
|
// return 1 / x; |
|
|
|
|
// } else { |
|
|
|
|
// return 2 - x; |
|
|
|
|
// } |
|
|
|
|
inline half get_k(half a, half b, half c, half d) { |
|
|
|
|
return 2.0 - (fabs(a - b) + fabs(c - d)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
__kernel void debayer10(const __global uchar * in, |
|
|
|
@ -88,23 +78,26 @@ __kernel void debayer10(const __global uchar * in, |
|
|
|
|
const int x_global = get_global_id(0); |
|
|
|
|
const int y_global = get_global_id(1); |
|
|
|
|
|
|
|
|
|
const int x_local = get_local_id(0); |
|
|
|
|
const int y_local = get_local_id(1); |
|
|
|
|
|
|
|
|
|
const int localRowLen = 2 + get_local_size(0); // 2 padding |
|
|
|
|
const int x_local = get_local_id(0); // 0-15 |
|
|
|
|
const int y_local = get_local_id(1); // 0-15 |
|
|
|
|
const int localOffset = (y_local + 1) * localRowLen + x_local + 1; // max 18x18-1 |
|
|
|
|
const int localColLen = 2 + get_local_size(1); |
|
|
|
|
|
|
|
|
|
int out_idx = 3 * x_global + 3 * y_global * RGB_WIDTH; |
|
|
|
|
const int localOffset = (y_local + 1) * localRowLen + x_local + 1; |
|
|
|
|
|
|
|
|
|
half pv = val_from_10(in, x_global, y_global, black_level); |
|
|
|
|
cached[localOffset] = pv; |
|
|
|
|
int out_idx = 3 * x_global + 3 * y_global * RGB_WIDTH; |
|
|
|
|
|
|
|
|
|
// cache padding |
|
|
|
|
int localColOffset = -1; |
|
|
|
|
int globalColOffset = -1; |
|
|
|
|
int globalColOffset; |
|
|
|
|
|
|
|
|
|
const int x_global_mod = (x_global == 0 || x_global == RGB_WIDTH - 1) ? -1: 1; |
|
|
|
|
const int y_global_mod = (y_global == 0 || y_global == RGB_HEIGHT - 1) ? -1: 1; |
|
|
|
|
|
|
|
|
|
half pv = val_from_10(in, x_global, y_global, black_level); |
|
|
|
|
cached[localOffset] = pv; |
|
|
|
|
|
|
|
|
|
// cache padding |
|
|
|
|
if (x_local < 1) { |
|
|
|
|
localColOffset = x_local; |
|
|
|
@ -146,20 +139,20 @@ __kernel void debayer10(const __global uchar * in, |
|
|
|
|
if (x_global % 2 == 0) { |
|
|
|
|
if (y_global % 2 == 0) { |
|
|
|
|
rgb.y = pv; // G1(R) |
|
|
|
|
half k1 = phi(fabs_diff(d1, pv) + fabs_diff(d2, pv)); |
|
|
|
|
half k2 = phi(fabs_diff(d2, pv) + fabs_diff(d4, pv)); |
|
|
|
|
half k3 = phi(fabs_diff(d3, pv) + fabs_diff(d4, pv)); |
|
|
|
|
half k4 = phi(fabs_diff(d1, pv) + fabs_diff(d3, pv)); |
|
|
|
|
half k1 = get_k(d1, pv, d2, pv); |
|
|
|
|
half k2 = get_k(d2, pv, d4, pv); |
|
|
|
|
half k3 = get_k(d3, pv, d4, pv); |
|
|
|
|
half k4 = get_k(d1, pv, d3, pv); |
|
|
|
|
// R_G1 |
|
|
|
|
rgb.x = (k2*n2+k4*n4)/(k2+k4); |
|
|
|
|
// B_G1 |
|
|
|
|
rgb.z = (k1*n1+k3*n3)/(k1+k3); |
|
|
|
|
} else { |
|
|
|
|
rgb.z = pv; // B |
|
|
|
|
half k1 = phi(fabs_diff(d1, d3) + fabs_diff(d2, d4)); |
|
|
|
|
half k2 = phi(fabs_diff(n1, n4) + fabs_diff(n2, n3)); |
|
|
|
|
half k3 = phi(fabs_diff(d1, d2) + fabs_diff(d3, d4)); |
|
|
|
|
half k4 = phi(fabs_diff(n1, n2) + fabs_diff(n3, n4)); |
|
|
|
|
half k1 = get_k(d1, d3, d2, d4); |
|
|
|
|
half k2 = get_k(n1, n4, n2, n3); |
|
|
|
|
half k3 = get_k(d1, d2, d3, d4); |
|
|
|
|
half k4 = get_k(n1, n2, n3, n4); |
|
|
|
|
// G_B |
|
|
|
|
rgb.y = (k1*(n1+n3)*0.5+k3*(n2+n4)*0.5)/(k1+k3); |
|
|
|
|
// R_B |
|
|
|
@ -168,20 +161,20 @@ __kernel void debayer10(const __global uchar * in, |
|
|
|
|
} else { |
|
|
|
|
if (y_global % 2 == 0) { |
|
|
|
|
rgb.x = pv; // R |
|
|
|
|
half k1 = phi(fabs_diff(d1, d3) + fabs_diff(d2, d4)); |
|
|
|
|
half k2 = phi(fabs_diff(n1, n4) + fabs_diff(n2, n3)); |
|
|
|
|
half k3 = phi(fabs_diff(d1, d2) + fabs_diff(d3, d4)); |
|
|
|
|
half k4 = phi(fabs_diff(n1, n2) + fabs_diff(n3, n4)); |
|
|
|
|
half k1 = get_k(d1, d3, d2, d4); |
|
|
|
|
half k2 = get_k(n1, n4, n2, n3); |
|
|
|
|
half k3 = get_k(d1, d2, d3, d4); |
|
|
|
|
half k4 = get_k(n1, n2, n3, n4); |
|
|
|
|
// G_R |
|
|
|
|
rgb.y = (k1*(n1+n3)*0.5+k3*(n2+n4)*0.5)/(k1+k3); |
|
|
|
|
// B_R |
|
|
|
|
rgb.z = (k2*(d2+d3)*0.5+k4*(d1+d4)*0.5)/(k2+k4); |
|
|
|
|
} else { |
|
|
|
|
rgb.y = pv; // G2(B) |
|
|
|
|
half k1 = phi(fabs_diff(d1, pv) + fabs_diff(d2, pv)); |
|
|
|
|
half k2 = phi(fabs_diff(d2, pv) + fabs_diff(d4, pv)); |
|
|
|
|
half k3 = phi(fabs_diff(d3, pv) + fabs_diff(d4, pv)); |
|
|
|
|
half k4 = phi(fabs_diff(d1, pv) + fabs_diff(d3, pv)); |
|
|
|
|
half k1 = get_k(d1, pv, d2, pv); |
|
|
|
|
half k2 = get_k(d2, pv, d4, pv); |
|
|
|
|
half k3 = get_k(d3, pv, d4, pv); |
|
|
|
|
half k4 = get_k(d1, pv, d3, pv); |
|
|
|
|
// R_G2 |
|
|
|
|
rgb.x = (k1*n1+k3*n3)/(k1+k3); |
|
|
|
|
// B_G2 |
|
|
|
|