random_distort_image()
void random_distort_image(image im, float hue, float saturation, float exposure)
{
float dhue = rand_uniform_strong(-hue, hue);
float dsat = rand_scale(saturation);
float dexp = rand_scale(exposure);
distort_image(im, dhue, dsat, dexp);
}
distort_image
扭曲图像
void distort_image(image im, float hue, float sat, float val)
{
if (im.c >= 3)
{
rgb_to_hsv(im);
scale_image_channel(im, 1, sat);
scale_image_channel(im, 2, val);
int i;
for(i = 0; i < im.w*im.h; ++i){
im.data[i] = im.data[i] + hue;
if (im.data[i] > 1) im.data[i] -= 1;
if (im.data[i] < 0) im.data[i] += 1;
}
hsv_to_rgb(im);
}
else
{
scale_image_channel(im, 0, val);
}
constrain_image(im);
}
rgb_to_hsv()
rgb转换为hsv,rgb易于显示但不易于图像处理,所以需要转换为hsb
参考网址:
// http://www.cs.rit.edu/~ncs/color/t_convert.html
// http://www.cs.rit.edu/~ncs/color/t_convert.html
void rgb_to_hsv(image im)
{
assert(im.c == 3);
int i, j;
float r, g, b;
float h, s, v;
for(j = 0; j < im.h; ++j){
for(i = 0; i < im.w; ++i){
r = get_pixel(im, i , j, 0);
g = get_pixel(im, i , j, 1);
b = get_pixel(im, i , j, 2);
float max = three_way_max(r,g,b);
float min = three_way_min(r,g,b);
float delta = max - min;
v = max;
if(max == 0){
s = 0;
h = 0;
}else{
s = delta/max;
if(r == max){
h = (g - b) / delta;
} else if (g == max) {
h = 2 + (b - r) / delta;
} else {
h = 4 + (r - g) / delta;
}
if (h < 0) h += 6;
h = h/6.;
}
set_pixel(im, i, j, 0, h);
set_pixel(im, i, j, 1, s);
set_pixel(im, i, j, 2, v);
}
}
}
scale_image_channel
缩放图像通道
void scale_image_channel(image im, int c, float v)
{
int i, j;
for(j = 0; j < im.h; ++j){
for(i = 0; i < im.w; ++i){
float pix = get_pixel(im, i, j, c);
pix = pix*v;
set_pixel(im, i, j, c, pix);
}
}
}
constrain_image()
void constrain_image(image im)
{
int i;
for(i = 0; i < im.w*im.h*im.c; ++i){
if(im.data[i] < 0) im.data[i] = 0;
if(im.data[i] > 1) im.data[i] = 1;
}
}