pixel_t get_color(array_t *image, size_t bitdepth) { uint32_t pixel_num = 0; lab_pixel_t *avg = NULL; for (size_t i = 0; i < image->size; i++) { array_t *row = ((array_t *) image->ptr); for (size_t j = 0; j < row->size; j++) { pixel_num++; pixel_t rgb = ((pixel_t *) row->ptr)[j]; xyz_pixel_t xyz = rgb_to_xyz(rgb); lab_pixel_t lab = xyz_to_lab(xyz); if (avg == NULL) { avg = malloc(sizeof(lab_pixel_t)); *avg = lab; } else { avg->L = running_avg(avg->L, lab->L, pixel_num); avg->a = running_avg(avg->a, lab->a, pixel_num); avg->b = running_avg(avg->b, lab->b, pixel_num); } } } xyz_pixel_t xyz_avg = lab_to_xyz(*avg); return xyz_to_rgb(xyz_avg); }
inline value_type lab_to_rgb(const value_type& v) { value_type lab = v - value_type(0,128,128); return xyz_to_rgb(lab_to_xyz(lab)); }