mirror of
https://github.com/openmv/openmv.git
synced 2025-11-04 14:49:50 +08:00
Update to full invariant image.
This commit updates the shadow free invariant image to 2 colors from just grayscale. If we need to save ROM room in the future we'll just disable the LUT and have the algorithm run with the regular C code. Right now this is not an issue.
This commit is contained in:
parent
09c38e7c31
commit
9eba59c6c1
@ -1071,7 +1071,7 @@ void imlib_chrominvar(image_t *img)
|
||||
}
|
||||
}
|
||||
|
||||
extern const uint8_t invariant_table[65536];
|
||||
extern const uint16_t invariant_table[65536];
|
||||
|
||||
void imlib_illuminvar(image_t *img) // http://ai.stanford.edu/~alireza/publication/cic15.pdf
|
||||
{
|
||||
@ -1088,7 +1088,7 @@ void imlib_illuminvar(image_t *img) // http://ai.stanford.edu/~alireza/publicati
|
||||
for (int x = 0, xx = img->w; x < xx; x++) {
|
||||
int pixel = IMAGE_GET_RGB565_PIXEL_FAST(row_ptr, x);
|
||||
#ifdef OMV_HAVE_INVARIANT_TABLE
|
||||
int chi_int = invariant_table[pixel];
|
||||
int rgb565 = invariant_table[pixel];
|
||||
#else
|
||||
float r_lin = xyz_table[COLOR_RGB565_TO_R8(pixel)] + 1.0;
|
||||
float g_lin = xyz_table[COLOR_RGB565_TO_G8(pixel)] + 1.0;
|
||||
@ -1118,9 +1118,46 @@ void imlib_illuminvar(image_t *img) // http://ai.stanford.edu/~alireza/publicati
|
||||
|
||||
float chi_x = (r_lin_sharp_div_log * 0.7071f) + (g_lin_sharp_div_log * -0.7071f) + (b_lin_sharp_div_log * 0.0000f);
|
||||
float chi_y = (r_lin_sharp_div_log * 0.4082f) + (g_lin_sharp_div_log * 0.4082f) + (b_lin_sharp_div_log * -0.8164f);
|
||||
int chi_int = IM_MAX(IM_MIN(fast_roundf(fast_expf((chi_x * 0.9326f) + (chi_y * -0.3609f)) * 127.5f), COLOR_GRAYSCALE_MAX), COLOR_GRAYSCALE_MIN);
|
||||
|
||||
float e_t_x = 0.9326f;
|
||||
float e_t_y = -0.3609f;
|
||||
|
||||
float p_th_00 = e_t_x * e_t_x;
|
||||
float p_th_01 = e_t_x * e_t_y;
|
||||
float p_th_10 = e_t_y * e_t_x;
|
||||
float p_th_11 = e_t_y * e_t_y;
|
||||
|
||||
float x_th_x = (p_th_00 * chi_x) + (p_th_01 * chi_y);
|
||||
float x_th_y = (p_th_10 * chi_x) + (p_th_11 * chi_y);
|
||||
|
||||
float r_chi = (x_th_x * 0.7071f) + (x_th_y * 0.4082f);
|
||||
float g_chi = (x_th_x * -0.7071f) + (x_th_y * 0.4082f);
|
||||
float b_chi = (x_th_x * 0.0000f) + (x_th_y * -0.8164f);
|
||||
|
||||
float r_chi_invariant = fast_expf(r_chi);
|
||||
float g_chi_invariant = fast_expf(g_chi);
|
||||
float b_chi_invariant = fast_expf(b_chi);
|
||||
|
||||
float chi_invariant_sum = r_chi_invariant + g_chi_invariant + b_chi_invariant;
|
||||
|
||||
float r_chi_invariant_m = 0.0f;
|
||||
float g_chi_invariant_m = 0.0f;
|
||||
float b_chi_invariant_m = 0.0f;
|
||||
|
||||
if (chi_invariant_sum > 0.0f) {
|
||||
chi_invariant_sum = 1.0f / chi_invariant_sum;
|
||||
r_chi_invariant_m = r_chi_invariant * chi_invariant_sum;
|
||||
g_chi_invariant_m = g_chi_invariant * chi_invariant_sum;
|
||||
b_chi_invariant_m = b_chi_invariant * chi_invariant_sum;
|
||||
}
|
||||
|
||||
int r_chi_invariant_m_int = IM_MAX(IM_MIN(r_chi_invariant_m * 255.0f, COLOR_R8_MAX), COLOR_R8_MIN);
|
||||
int g_chi_invariant_m_int = IM_MAX(IM_MIN(g_chi_invariant_m * 255.0f, COLOR_G8_MAX), COLOR_G8_MIN);
|
||||
int b_chi_invariant_m_int = IM_MAX(IM_MIN(b_chi_invariant_m * 255.0f, COLOR_B8_MAX), COLOR_B8_MIN);
|
||||
|
||||
int rgb565 = COLOR_R8_G8_B8_TO_RGB565(r_chi_invariant_m_int, g_chi_invariant_m_int, b_chi_invariant_m_int);
|
||||
#endif
|
||||
IMAGE_PUT_RGB565_PIXEL_FAST(row_ptr, x, COLOR_R8_G8_B8_TO_RGB565(chi_int, chi_int, chi_int));
|
||||
IMAGE_PUT_RGB565_PIXEL_FAST(row_ptr, x, rgb565);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@ -8,50 +8,136 @@ def lin(c):
|
||||
import sys, math
|
||||
sys.stdout.write("#include <stdint.h>\n")
|
||||
|
||||
sys.stdout.write("const uint8_t invariant_table[65536] = {\n") # 65536 * 1
|
||||
for i in range(65536):
|
||||
if False: # 1D illumination invariant image
|
||||
|
||||
r = ((((i >> 3) & 31) * 255) + 15.5) // 31
|
||||
g = (((((i & 7) << 3) | (i >> 13)) * 255) + 31.5) // 63
|
||||
b = ((((i >> 8) & 31) * 255) + 15.5) // 31
|
||||
sys.stdout.write("const uint8_t invariant_table[65536] = {\n") # 65536 * 1
|
||||
for i in range(65536):
|
||||
|
||||
# http://ai.stanford.edu/~alireza/publication/cic15.pdf
|
||||
r = ((((i >> 3) & 31) * 255) + 15.5) // 31
|
||||
g = (((((i & 7) << 3) | (i >> 13)) * 255) + 31.5) // 63
|
||||
b = ((((i >> 8) & 31) * 255) + 15.5) // 31
|
||||
|
||||
r_lin = lin(r / 255.0) + 1.0
|
||||
g_lin = lin(g / 255.0) + 1.0
|
||||
b_lin = lin(b / 255.0) + 1.0
|
||||
# http://ai.stanford.edu/~alireza/publication/cic15.pdf
|
||||
|
||||
r_lin_sharp = (r_lin * 0.9968) + (g_lin * 0.0228) + (b_lin * 0.0015);
|
||||
g_lin_sharp = (r_lin * -0.0071) + (g_lin * 0.9933) + (b_lin * 0.0146);
|
||||
b_lin_sharp = (r_lin * 0.0103) + (g_lin * -0.0161) + (b_lin * 0.9839);
|
||||
r_lin = lin(r / 255.0) + 1.0
|
||||
g_lin = lin(g / 255.0) + 1.0
|
||||
b_lin = lin(b / 255.0) + 1.0
|
||||
|
||||
lin_sharp_avg = r_lin_sharp * g_lin_sharp * b_lin_sharp
|
||||
lin_sharp_avg_p = math.pow(lin_sharp_avg, 1.0/3.0) if (lin_sharp_avg > 0.0) else 0.0
|
||||
r_lin_sharp = (r_lin * 0.9968) + (g_lin * 0.0228) + (b_lin * 0.0015);
|
||||
g_lin_sharp = (r_lin * -0.0071) + (g_lin * 0.9933) + (b_lin * 0.0146);
|
||||
b_lin_sharp = (r_lin * 0.0103) + (g_lin * -0.0161) + (b_lin * 0.9839);
|
||||
|
||||
r_lin_sharp_div = 0.0
|
||||
g_lin_sharp_div = 0.0
|
||||
b_lin_sharp_div = 0.0
|
||||
lin_sharp_avg = r_lin_sharp * g_lin_sharp * b_lin_sharp
|
||||
lin_sharp_avg_p = math.pow(lin_sharp_avg, 1.0/3.0) if (lin_sharp_avg > 0.0) else 0.0
|
||||
|
||||
if lin_sharp_avg_p > 0.0:
|
||||
lin_sharp_avg_d = 1.0 / lin_sharp_avg_p
|
||||
r_lin_sharp_div = r_lin_sharp * lin_sharp_avg_d
|
||||
g_lin_sharp_div = g_lin_sharp * lin_sharp_avg_d
|
||||
b_lin_sharp_div = b_lin_sharp * lin_sharp_avg_d
|
||||
r_lin_sharp_div = 0.0
|
||||
g_lin_sharp_div = 0.0
|
||||
b_lin_sharp_div = 0.0
|
||||
|
||||
r_lin_sharp_div_log = math.log(r_lin_sharp_div) if (r_lin_sharp_div > 0.0) else 0.0
|
||||
g_lin_sharp_div_log = math.log(g_lin_sharp_div) if (g_lin_sharp_div > 0.0) else 0.0
|
||||
b_lin_sharp_div_log = math.log(b_lin_sharp_div) if (b_lin_sharp_div > 0.0) else 0.0
|
||||
if lin_sharp_avg_p > 0.0:
|
||||
lin_sharp_avg_d = 1.0 / lin_sharp_avg_p
|
||||
r_lin_sharp_div = r_lin_sharp * lin_sharp_avg_d
|
||||
g_lin_sharp_div = g_lin_sharp * lin_sharp_avg_d
|
||||
b_lin_sharp_div = b_lin_sharp * lin_sharp_avg_d
|
||||
|
||||
chi_x = (r_lin_sharp_div_log * 0.7071) + (g_lin_sharp_div_log * -0.7071) + (b_lin_sharp_div_log * 0.0000)
|
||||
chi_y = (r_lin_sharp_div_log * 0.4082) + (g_lin_sharp_div_log * 0.4082) + (b_lin_sharp_div_log * -0.8164)
|
||||
chi_int = max(min(int(round(math.exp((chi_x * 0.9326) + (chi_y * -0.3609)) * 127.5)), 255), 0)
|
||||
r_lin_sharp_div_log = math.log(r_lin_sharp_div) if (r_lin_sharp_div > 0.0) else 0.0
|
||||
g_lin_sharp_div_log = math.log(g_lin_sharp_div) if (g_lin_sharp_div > 0.0) else 0.0
|
||||
b_lin_sharp_div_log = math.log(b_lin_sharp_div) if (b_lin_sharp_div > 0.0) else 0.0
|
||||
|
||||
if not (i % 16):
|
||||
sys.stdout.write(" ")
|
||||
sys.stdout.write("%3d" % chi_int)
|
||||
if (i + 1) % 16:
|
||||
sys.stdout.write(", ")
|
||||
elif i != 65535:
|
||||
sys.stdout.write(",\n")
|
||||
else:
|
||||
sys.stdout.write("\n};\n")
|
||||
chi_x = (r_lin_sharp_div_log * 0.7071) + (g_lin_sharp_div_log * -0.7071) + (b_lin_sharp_div_log * 0.0000)
|
||||
chi_y = (r_lin_sharp_div_log * 0.4082) + (g_lin_sharp_div_log * 0.4082) + (b_lin_sharp_div_log * -0.8164)
|
||||
chi_int = max(min(int(round(math.exp((chi_x * 0.9326) + (chi_y * -0.3609)) * 127.5)), 255), 0)
|
||||
|
||||
if not (i % 16):
|
||||
sys.stdout.write(" ")
|
||||
sys.stdout.write("%3d" % chi_int)
|
||||
if (i + 1) % 16:
|
||||
sys.stdout.write(", ")
|
||||
elif i != 65535:
|
||||
sys.stdout.write(",\n")
|
||||
else:
|
||||
sys.stdout.write("\n};\n")
|
||||
|
||||
if True: # 2D illumination invariant image
|
||||
|
||||
sys.stdout.write("const uint16_t invariant_table[65536] = {\n") # 65536 * 2
|
||||
for i in range(65536):
|
||||
|
||||
r = ((((i >> 3) & 31) * 255) + 15.5) // 31
|
||||
g = (((((i & 7) << 3) | (i >> 13)) * 255) + 31.5) // 63
|
||||
b = ((((i >> 8) & 31) * 255) + 15.5) // 31
|
||||
|
||||
# http://ai.stanford.edu/~alireza/publication/cic15.pdf
|
||||
|
||||
r_lin = lin(r / 255.0) + 1.0
|
||||
g_lin = lin(g / 255.0) + 1.0
|
||||
b_lin = lin(b / 255.0) + 1.0
|
||||
|
||||
r_lin_sharp = (r_lin * 0.9968) + (g_lin * 0.0228) + (b_lin * 0.0015);
|
||||
g_lin_sharp = (r_lin * -0.0071) + (g_lin * 0.9933) + (b_lin * 0.0146);
|
||||
b_lin_sharp = (r_lin * 0.0103) + (g_lin * -0.0161) + (b_lin * 0.9839);
|
||||
|
||||
lin_sharp_avg = r_lin_sharp * g_lin_sharp * b_lin_sharp
|
||||
lin_sharp_avg_p = math.pow(lin_sharp_avg, 1.0/3.0) if (lin_sharp_avg > 0.0) else 0.0
|
||||
|
||||
r_lin_sharp_div = 0.0
|
||||
g_lin_sharp_div = 0.0
|
||||
b_lin_sharp_div = 0.0
|
||||
|
||||
if lin_sharp_avg_p > 0.0:
|
||||
lin_sharp_avg_d = 1.0 / lin_sharp_avg_p
|
||||
r_lin_sharp_div = r_lin_sharp * lin_sharp_avg_d
|
||||
g_lin_sharp_div = g_lin_sharp * lin_sharp_avg_d
|
||||
b_lin_sharp_div = b_lin_sharp * lin_sharp_avg_d
|
||||
|
||||
r_lin_sharp_div_log = math.log(r_lin_sharp_div) if (r_lin_sharp_div > 0.0) else 0.0
|
||||
g_lin_sharp_div_log = math.log(g_lin_sharp_div) if (g_lin_sharp_div > 0.0) else 0.0
|
||||
b_lin_sharp_div_log = math.log(b_lin_sharp_div) if (b_lin_sharp_div > 0.0) else 0.0
|
||||
|
||||
chi_x = (r_lin_sharp_div_log * 0.7071) + (g_lin_sharp_div_log * -0.7071) + (b_lin_sharp_div_log * 0.0000)
|
||||
chi_y = (r_lin_sharp_div_log * 0.4082) + (g_lin_sharp_div_log * 0.4082) + (b_lin_sharp_div_log * -0.8164)
|
||||
|
||||
e_t_x = 0.9326
|
||||
e_t_y = -0.3609
|
||||
|
||||
p_th_00 = e_t_x * e_t_x
|
||||
p_th_01 = e_t_x * e_t_y
|
||||
p_th_10 = e_t_y * e_t_x
|
||||
p_th_11 = e_t_y * e_t_y
|
||||
|
||||
x_th_x = (p_th_00 * chi_x) + (p_th_01 * chi_y)
|
||||
x_th_y = (p_th_10 * chi_x) + (p_th_11 * chi_y)
|
||||
|
||||
r_chi = (x_th_x * 0.7071) + (x_th_y * 0.4082)
|
||||
g_chi = (x_th_x * -0.7071) + (x_th_y * 0.4082)
|
||||
b_chi = (x_th_x * 0.0000) + (x_th_y * -0.8164)
|
||||
|
||||
r_chi_invariant = math.exp(r_chi)
|
||||
g_chi_invariant = math.exp(g_chi)
|
||||
b_chi_invariant = math.exp(b_chi)
|
||||
|
||||
chi_invariant_sum = r_chi_invariant + g_chi_invariant + b_chi_invariant
|
||||
|
||||
r_chi_invariant_m = 0.0
|
||||
g_chi_invariant_m = 0.0
|
||||
b_chi_invariant_m = 0.0
|
||||
|
||||
if chi_invariant_sum > 0.0:
|
||||
chi_invariant_sum = 1.0 / chi_invariant_sum
|
||||
r_chi_invariant_m = r_chi_invariant * chi_invariant_sum
|
||||
g_chi_invariant_m = g_chi_invariant * chi_invariant_sum
|
||||
b_chi_invariant_m = b_chi_invariant * chi_invariant_sum
|
||||
|
||||
rgb565 = (int((((r_chi_invariant_m*255)*31)+127.5)/255)&0x1F)<<11 | \
|
||||
(int((((g_chi_invariant_m*255)*63)+127.5)/255)&0x3F)<<5 | \
|
||||
(int((((b_chi_invariant_m*255)*31)+127.5)/255)&0x1F)
|
||||
|
||||
if not (i % 16):
|
||||
sys.stdout.write(" ")
|
||||
sys.stdout.write("0x%04X" % (((rgb565&0x00ff)<<8)|((rgb565&0xff00)>>8)))
|
||||
if (i + 1) % 16:
|
||||
sys.stdout.write(", ")
|
||||
elif i != 65535:
|
||||
sys.stdout.write(",\n")
|
||||
else:
|
||||
sys.stdout.write("\n};\n")
|
||||
|
||||
Loading…
Reference in New Issue
Block a user