Move generic fill image to imlib

This commit is contained in:
Kwabena W. Agyeman 2020-12-30 10:41:16 -08:00
parent 793a10590a
commit e17a728590
3 changed files with 88 additions and 54 deletions

View File

@ -312,6 +312,80 @@ const int kernel_high_pass_3[3*3] = {
-1, -1, -1
};
// This function fills a grayscale image from an array of floating point numbers that are scaled
// between min and max. The image w*h must equal the floating point array w*h.
void imlib_fill_image_from_float(image_t *img, int w, int h, float *data, float min, float max,
bool mirror, bool flip, bool dst_transpose, bool src_transpose)
{
float tmp = min;
min = (min < max) ? min : max;
max = (max > tmp) ? max : tmp;
float diff = 255.f / (max - min);
int w_1 = w - 1;
int h_1 = h - 1;
if (!src_transpose) {
for (int y = 0; y < h; y++) {
int y_dst = flip ? (h_1 - y) : y;
float *raw_row = data + (y * w);
uint8_t *row_pointer = ((uint8_t *) img->data) + (y_dst * w);
uint8_t *t_row_pointer = ((uint8_t *) img->data) + y_dst;
for (int x = 0; x < w; x++) {
int x_dst = mirror ? (w_1 - x) : x;
float raw = raw_row[x];
if (raw < min) {
raw = min;
}
if (raw > max) {
raw = max;
}
int pixel = fast_roundf((raw - min) * diff);
pixel = __USAT(pixel, 8);
if (!dst_transpose) {
row_pointer[x_dst] = pixel;
} else {
t_row_pointer[x_dst * h] = pixel;
}
}
}
} else {
for (int x = 0; x < w; x++) {
int x_dst = mirror ? (w_1 - x) : x;
float *raw_row = data + (x * h);
uint8_t *t_row_pointer = ((uint8_t *) img->data) + (x_dst * h);
uint8_t *row_pointer = ((uint8_t *) img->data) + x_dst;
for (int y = 0; y < h; y++) {
int y_dst = flip ? (h_1 - y) : y;
float raw = raw_row[y];
if (raw < min) {
raw = min;
}
if (raw > max) {
raw = max;
}
int pixel = fast_roundf((raw - min) * diff);
pixel = __USAT(pixel, 8);
if (!dst_transpose) {
row_pointer[y_dst * w] = pixel;
} else {
t_row_pointer[y_dst] = pixel;
}
}
}
}
}
int8_t imlib_rgb565_to_l(uint16_t pixel)
{
float r_lin = xyz_table[COLOR_RGB565_TO_R8(pixel)];

View File

@ -1031,6 +1031,10 @@ typedef struct imlib_draw_row_data {
typedef void (*imlib_draw_row_callback_t)(int x_start, int x_end, int y_row, imlib_draw_row_data_t *data);
// Generic Helper Functions
void imlib_fill_image_from_float(image_t *img, int w, int h, float *data, float min, float max,
bool mirror, bool flip, bool dst_transpose, bool src_transpose);
/* Color space functions */
int8_t imlib_rgb565_to_l(uint16_t pixel);
int8_t imlib_rgb565_to_a(uint16_t pixel);

View File

@ -18,6 +18,7 @@
#include "MLX90640_I2C_Driver.h"
#include "framebuffer.h"
#include "omv_boardconfig.h"
#include "py_assert.h"
#include "py_helper.h"
#include "py_image.h"
@ -67,54 +68,6 @@ static int fir_ir_fresh_rate = 0;
static int fir_adc_resolution = 0;
static bool fir_transposed = false;
// img->w == data_w && img->h == data_h && img->bpp == IMAGE_BPP_GRAYSCALE
static void fir_fill_image_float(image_t *img, int w, int h, float *data, float min, float max,
bool mirror, bool flip, bool dst_transpose, bool src_transpose)
{
float tmp = min;
min = (min < max) ? min : max;
max = (max > tmp) ? max : tmp;
float diff = 255.f / (max - min);
int w_1 = w - 1, h_1 = h - 1;
if (!src_transpose) {
for (int y = 0; y < h; y++) {
int y_dst = flip ? (h_1 - y) : y;
float *raw_row = data + (y * w);
uint8_t *row_pointer = ((uint8_t *) img->data) + (y_dst * w), *t_row_pointer = ((uint8_t *) img->data) + y_dst;
for (int x = 0; x < w; x++) {
int x_dst = mirror ? (w_1 - x) : x;
float raw = raw_row[x];
if (raw < min) raw = min;
if (raw > max) raw = max;
int pixel = fast_roundf((raw - min) * diff);
pixel = __USAT(pixel, 8);
if (!dst_transpose) row_pointer[x_dst] = pixel;
else t_row_pointer[x_dst * h] = pixel;
}
}
} else {
for (int x = 0; x < w; x++) {
int x_dst = mirror ? (w_1 - x) : x;
float *raw_row = data + (x * h);
uint8_t *t_row_pointer = ((uint8_t *) img->data) + (x_dst * h), *row_pointer = ((uint8_t *) img->data) + x_dst;
for (int y = 0; y < h; y++) {
int y_dst = flip ? (h_1 - y) : y;
float raw = raw_row[y];
if (raw < min) raw = min;
if (raw > max) raw = max;
int pixel = fast_roundf((raw - min) * diff);
pixel = __USAT(pixel, 8);
if (!dst_transpose) row_pointer[y_dst * w] = pixel;
else t_row_pointer[y_dst] = pixel;
}
}
}
}
// img->w == data_w && img->h == data_h && img->bpp == IMAGE_BPP_GRAYSCALE
static void fir_fill_image_float_obj(image_t *img, mp_obj_t *data, float min, float max)
{
@ -814,8 +767,9 @@ mp_obj_t py_fir_snapshot(uint n_args, const mp_obj_t *args, mp_map_t *kw_args)
fast_get_min_max(To, MLX90621_WIDTH * MLX90621_HEIGHT, &min, &max);
}
fir_fill_image_float(&src_img, MLX90621_WIDTH, MLX90621_HEIGHT, To, min, max,
arg_hmirror ^ true, arg_vflip, arg_transpose, true);
imlib_fill_image_from_float(&src_img, MLX90621_WIDTH, MLX90621_HEIGHT, To, min, max,
arg_hmirror ^ true, arg_vflip, arg_transpose, true);
fb_free();
break;
}
@ -827,8 +781,9 @@ mp_obj_t py_fir_snapshot(uint n_args, const mp_obj_t *args, mp_map_t *kw_args)
fast_get_min_max(To, MLX90640_WIDTH * MLX90640_HEIGHT, &min, &max);
}
fir_fill_image_float(&src_img, MLX90640_WIDTH, MLX90640_HEIGHT, To, min, max,
arg_hmirror ^ true, arg_vflip, arg_transpose, false);
imlib_fill_image_from_float(&src_img, MLX90640_WIDTH, MLX90640_HEIGHT, To, min, max,
arg_hmirror ^ true, arg_vflip, arg_transpose, false);
fb_free();
break;
}
@ -840,8 +795,9 @@ mp_obj_t py_fir_snapshot(uint n_args, const mp_obj_t *args, mp_map_t *kw_args)
fast_get_min_max(To, AMG8833_WIDTH * AMG8833_HEIGHT, &min, &max);
}
fir_fill_image_float(&src_img, AMG8833_WIDTH, AMG8833_HEIGHT, To, min, max,
arg_hmirror ^ true, arg_vflip, arg_transpose, true);
imlib_fill_image_from_float(&src_img, AMG8833_WIDTH, AMG8833_HEIGHT, To, min, max,
arg_hmirror ^ true, arg_vflip, arg_transpose, true);
fb_free();
break;
}