Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00029 #include <stdlib.h>
00030 #include <string.h>
00031 #include <stdio.h>
00032 #include <float.h>
00033
00034 #include "balance_lib.h"
00035
00036
00037 #include "colorbalance_lib.h"
00038
00046 unsigned char *colorbalance_rgb_u8(unsigned char *rgb, size_t size,
00047 size_t nb_min, size_t nb_max)
00048 {
00049 (void) balance_u8(rgb, size, nb_min, nb_max);
00050 (void) balance_u8(rgb + size, size, nb_min, nb_max);
00051 (void) balance_u8(rgb + 2 * size, size, nb_min, nb_max);
00052 return rgb;
00053 }
00054
00056 #define MAX(A,B) (((A) >= (B)) ? (A) : (B))
00057
00059 #define MAX3(A,B,C) (((A) >= (B)) ? MAX(A,C) : MAX(B,C))
00060
00072 float *colorbalance_irgb_f32(float *rgb, size_t size,
00073 size_t nb_min, size_t nb_max)
00074 {
00075 float *irgb, *inorm;
00076 double s, m;
00077 size_t i;
00079 irgb = (float *) malloc(size * sizeof(float));
00080 for (i = 0; i < size; i++)
00081 irgb[i] = (rgb[i] + rgb[i + size] + rgb[i + 2 * size]) / 3.;
00082
00083 inorm = (float *) malloc(size * sizeof(float));
00084 memcpy(inorm, irgb, size * sizeof(float));
00085 (void) balance_f32(inorm, size, nb_min, nb_max);
00086
00087
00088
00089
00090
00091 for (i = 0; i < size; i++) {
00092 m = MAX3(rgb[i], rgb[i + size], rgb[i + 2 * size]);
00093 s = inorm[i] / irgb[i];
00094
00095 s = (1. < m * s ? 1. / m : s);
00096 rgb[i] *= s;
00097 rgb[i + size] *= s;
00098 rgb[i + 2 * size] *= s;
00099 }
00100 free(irgb);
00101 free(inorm);
00102 return rgb;
00103 }