本系列爲darknet源碼解析,由於在image.c中涉及到圖像的RGB,YUV,HSV格式,在本文我們將image.c中涉及到的rgb_to_hsv()函數以及hsv_to_rgb()函數進行解析.
-
RGB格式轉爲HSV格式
- 如果max=0
- 如果max!=0
對應源碼如下:
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);//獲取rgb最大值
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);
}
}
}
-
HSV格式轉爲RGB格式
- 如果S==0:
- 如果S != 0:
對應源碼如下:
void hsv_to_rgb(image im)
{
assert(im.c == 3);
int i, j;
float r, g, b;
float h, s, v;
float f, p, q, t;
for(j = 0; j < im.h; ++j){
for(i = 0; i < im.w; ++i){
h = 6 * get_pixel(im, i , j, 0);
s = get_pixel(im, i , j, 1);
v = get_pixel(im, i , j, 2);
if (s == 0) {
r = g = b = v;
} else {
int index = floor(h);
f = h - index;
p = v*(1-s);
q = v*(1-s*f);
t = v*(1-s*(1-f));
if(index == 0){
r = v; g = t; b = p;
} else if(index == 1){
r = q; g = v; b = p;
} else if(index == 2){
r = p; g = v; b = t;
} else if(index == 3){
r = p; g = q; b = v;
} else if(index == 4){
r = t; g = p; b = v;
} else {
r = v; g = p; b = q;
}
}
set_pixel(im, i, j, 0, r);
set_pixel(im, i, j, 1, g);
set_pixel(im, i, j, 2, b);
}
}
}
完.