mirror of
https://github.com/opencv/opencv.git
synced 2026-07-31 08:13:04 +04:00
RGB[A] <-> HLS
This commit is contained in:
@@ -777,7 +777,216 @@ __kernel void HSV2RGB(__global const uchar* srcptr, int src_step, int src_offset
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
///////////////////////////////////// RGB <-> HLS //////////////////////////////////////
|
||||
|
||||
#ifdef DEPTH_0
|
||||
|
||||
__kernel void RGB2HLS(__global const uchar* src, int src_step, int src_offset,
|
||||
__global uchar* dst, int dst_step, int dst_offset,
|
||||
int rows, int cols)
|
||||
{
|
||||
int x = get_global_id(0);
|
||||
int y = get_global_id(1);
|
||||
|
||||
if (y < rows && x < cols)
|
||||
{
|
||||
int src_idx = mad24(y, src_step, src_offset + x * scnbytes);
|
||||
int dst_idx = mad24(y, dst_step, dst_offset + x * dcnbytes);
|
||||
|
||||
float b = src[src_idx + bidx]*(1/255.f), g = src[src_idx + 1]*(1/255.f), r = src[src_idx + (bidx^2)]*(1/255.f);
|
||||
float h = 0.f, s = 0.f, l;
|
||||
float vmin, vmax, diff;
|
||||
|
||||
vmax = vmin = r;
|
||||
if (vmax < g) vmax = g;
|
||||
if (vmax < b) vmax = b;
|
||||
if (vmin > g) vmin = g;
|
||||
if (vmin > b) vmin = b;
|
||||
|
||||
diff = vmax - vmin;
|
||||
l = (vmax + vmin)*0.5f;
|
||||
|
||||
if (diff > FLT_EPSILON)
|
||||
{
|
||||
s = l < 0.5f ? diff/(vmax + vmin) : diff/(2 - vmax - vmin);
|
||||
diff = 60.f/diff;
|
||||
|
||||
if( vmax == r )
|
||||
h = (g - b)*diff;
|
||||
else if( vmax == g )
|
||||
h = (b - r)*diff + 120.f;
|
||||
else
|
||||
h = (r - g)*diff + 240.f;
|
||||
|
||||
if( h < 0.f ) h += 360.f;
|
||||
}
|
||||
|
||||
dst[dst_idx] = convert_uchar_sat_rte(h*hscale);
|
||||
dst[dst_idx + 1] = convert_uchar_sat_rte(l*255.f);
|
||||
dst[dst_idx + 2] = convert_uchar_sat_rte(s*255.f);
|
||||
}
|
||||
}
|
||||
|
||||
__kernel void HLS2RGB(__global const uchar* src, int src_step, int src_offset,
|
||||
__global uchar* dst, int dst_step, int dst_offset,
|
||||
int rows, int cols)
|
||||
{
|
||||
int x = get_global_id(0);
|
||||
int y = get_global_id(1);
|
||||
|
||||
if (y < rows && x < cols)
|
||||
{
|
||||
int src_idx = mad24(y, src_step, src_offset + x * scnbytes);
|
||||
int dst_idx = mad24(y, dst_step, dst_offset + x * dcnbytes);
|
||||
|
||||
float h = src[src_idx], l = src[src_idx + 1]*(1.f/255.f), s = src[src_idx + 2]*(1.f/255.f);
|
||||
float b, g, r;
|
||||
|
||||
if (s != 0)
|
||||
{
|
||||
float tab[4];
|
||||
|
||||
float p2 = l <= 0.5f ? l*(1 + s) : l + s - l*s;
|
||||
float p1 = 2*l - p2;
|
||||
|
||||
h *= hscale;
|
||||
if( h < 0 )
|
||||
do h += 6; while( h < 0 );
|
||||
else if( h >= 6 )
|
||||
do h -= 6; while( h >= 6 );
|
||||
|
||||
int sector = convert_int_sat_rtn(h);
|
||||
h -= sector;
|
||||
|
||||
tab[0] = p2;
|
||||
tab[1] = p1;
|
||||
tab[2] = p1 + (p2 - p1)*(1-h);
|
||||
tab[3] = p1 + (p2 - p1)*h;
|
||||
|
||||
b = tab[sector_data[sector][0]];
|
||||
g = tab[sector_data[sector][1]];
|
||||
r = tab[sector_data[sector][2]];
|
||||
}
|
||||
else
|
||||
b = g = r = l;
|
||||
|
||||
dst[dst_idx + bidx] = convert_uchar_sat_rte(b*255.f);
|
||||
dst[dst_idx + 1] = convert_uchar_sat_rte(g*255.f);
|
||||
dst[dst_idx + (bidx^2)] = convert_uchar_sat_rte(r*255.f);
|
||||
#if dcn == 4
|
||||
dst[dst_idx + 3] = MAX_NUM;
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
#elif defined DEPTH_5
|
||||
|
||||
__kernel void RGB2HLS(__global const uchar* srcptr, int src_step, int src_offset,
|
||||
__global uchar* dstptr, int dst_step, int dst_offset,
|
||||
int rows, int cols)
|
||||
{
|
||||
int x = get_global_id(0);
|
||||
int y = get_global_id(1);
|
||||
|
||||
if (y < rows && x < cols)
|
||||
{
|
||||
int src_idx = mad24(y, src_step, src_offset + x * scnbytes);
|
||||
int dst_idx = mad24(y, dst_step, dst_offset + x * dcnbytes);
|
||||
|
||||
__global const float * src = (__global const float *)(srcptr + src_idx);
|
||||
__global float * dst = (__global float *)(dstptr + dst_idx);
|
||||
|
||||
float b = src[bidx], g = src[1], r = src[bidx^2];
|
||||
float h = 0.f, s = 0.f, l;
|
||||
float vmin, vmax, diff;
|
||||
|
||||
vmax = vmin = r;
|
||||
if (vmax < g) vmax = g;
|
||||
if (vmax < b) vmax = b;
|
||||
if (vmin > g) vmin = g;
|
||||
if (vmin > b) vmin = b;
|
||||
|
||||
diff = vmax - vmin;
|
||||
l = (vmax + vmin)*0.5f;
|
||||
|
||||
if (diff > FLT_EPSILON)
|
||||
{
|
||||
s = l < 0.5f ? diff/(vmax + vmin) : diff/(2 - vmax - vmin);
|
||||
diff = 60.f/diff;
|
||||
|
||||
if( vmax == r )
|
||||
h = (g - b)*diff;
|
||||
else if( vmax == g )
|
||||
h = (b - r)*diff + 120.f;
|
||||
else
|
||||
h = (r - g)*diff + 240.f;
|
||||
|
||||
if( h < 0.f ) h += 360.f;
|
||||
}
|
||||
|
||||
dst[0] = h*hscale;
|
||||
dst[1] = l;
|
||||
dst[2] = s;
|
||||
}
|
||||
}
|
||||
|
||||
__kernel void HLS2RGB(__global const uchar* srcptr, int src_step, int src_offset,
|
||||
__global uchar* dstptr, int dst_step, int dst_offset,
|
||||
int rows, int cols)
|
||||
{
|
||||
int x = get_global_id(0);
|
||||
int y = get_global_id(1);
|
||||
|
||||
if (y < rows && x < cols)
|
||||
{
|
||||
int src_idx = mad24(y, src_step, src_offset + x * scnbytes);
|
||||
int dst_idx = mad24(y, dst_step, dst_offset + x * dcnbytes);
|
||||
|
||||
__global const float * src = (__global const float *)(srcptr + src_idx);
|
||||
__global float * dst = (__global float *)(dstptr + dst_idx);
|
||||
|
||||
float h = src[0], l = src[1], s = src[2];
|
||||
float b, g, r;
|
||||
|
||||
if (s != 0)
|
||||
{
|
||||
float tab[4];
|
||||
int sector;
|
||||
|
||||
float p2 = l <= 0.5f ? l*(1 + s) : l + s - l*s;
|
||||
float p1 = 2*l - p2;
|
||||
|
||||
h *= hscale;
|
||||
if( h < 0 )
|
||||
do h += 6; while( h < 0 );
|
||||
else if( h >= 6 )
|
||||
do h -= 6; while( h >= 6 );
|
||||
|
||||
sector = convert_int_sat_rtn(h);
|
||||
h -= sector;
|
||||
|
||||
tab[0] = p2;
|
||||
tab[1] = p1;
|
||||
tab[2] = p1 + (p2 - p1)*(1-h);
|
||||
tab[3] = p1 + (p2 - p1)*h;
|
||||
|
||||
b = tab[sector_data[sector][0]];
|
||||
g = tab[sector_data[sector][1]];
|
||||
r = tab[sector_data[sector][2]];
|
||||
}
|
||||
else
|
||||
b = g = r = l;
|
||||
|
||||
dst[bidx] = b;
|
||||
dst[1] = g;
|
||||
dst[bidx^2] = r;
|
||||
#if dcn == 4
|
||||
dst[3] = MAX_NUM;
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user