📄 cvcolor.c
字号:
((ushort*)dst)[i] = (ushort)(t|(t << 5)|(t << 10));
}
}
return CV_OK;
}
static CvStatus CV_STDCALL
icvBGRx2Gray_8u_CnC1R( const uchar* src, int srcstep,
uchar* dst, int dststep, CvSize size,
int src_cn, int blue_idx )
{
int i;
srcstep -= size.width*src_cn;
if( size.width*size.height >= 1024 )
{
int* tab = (int*)cvStackAlloc( 256*3*sizeof(tab[0]) );
int r = 0, g = 0, b = (1 << (csc_shift-1));
for( i = 0; i < 256; i++ )
{
tab[i] = b;
tab[i+256] = g;
tab[i+512] = r;
g += cscGg;
if( !blue_idx )
b += cscGb, r += cscGr;
else
b += cscGr, r += cscGb;
}
for( ; size.height--; src += srcstep, dst += dststep )
{
for( i = 0; i < size.width; i++, src += src_cn )
{
int t0 = tab[src[0]] + tab[src[1] + 256] + tab[src[2] + 512];
dst[i] = (uchar)(t0 >> csc_shift);
}
}
}
else
{
for( ; size.height--; src += srcstep, dst += dststep )
{
for( i = 0; i < size.width; i++, src += src_cn )
{
int t0 = src[blue_idx]*cscGb + src[1]*cscGg + src[blue_idx^2]*cscGr;
dst[i] = (uchar)CV_DESCALE(t0, csc_shift);
}
}
}
return CV_OK;
}
static CvStatus CV_STDCALL
icvBGRx2Gray_16u_CnC1R( const ushort* src, int srcstep,
ushort* dst, int dststep, CvSize size,
int src_cn, int blue_idx )
{
int i;
int cb = cscGb, cr = cscGr;
srcstep /= sizeof(src[0]);
dststep /= sizeof(dst[0]);
srcstep -= size.width*src_cn;
if( blue_idx )
cb = cscGr, cr = cscGb;
for( ; size.height--; src += srcstep, dst += dststep )
for( i = 0; i < size.width; i++, src += src_cn )
dst[i] = (ushort)CV_DESCALE((unsigned)(src[0]*cb +
src[1]*cscGg + src[2]*cr), csc_shift);
return CV_OK;
}
static CvStatus CV_STDCALL
icvBGRx2Gray_32f_CnC1R( const float* src, int srcstep,
float* dst, int dststep, CvSize size,
int src_cn, int blue_idx )
{
int i;
float cb = cscGb_32f, cr = cscGr_32f;
if( blue_idx )
cb = cscGr_32f, cr = cscGb_32f;
srcstep /= sizeof(src[0]);
dststep /= sizeof(dst[0]);
srcstep -= size.width*src_cn;
for( ; size.height--; src += srcstep, dst += dststep )
for( i = 0; i < size.width; i++, src += src_cn )
dst[i] = src[0]*cb + src[1]*cscGg_32f + src[2]*cr;
return CV_OK;
}
/****************************************************************************************\
* RGB <-> YCrCb *
\****************************************************************************************/
/* BGR/RGB -> YCrCb */
#define yuvYr_32f cscGr_32f
#define yuvYg_32f cscGg_32f
#define yuvYb_32f cscGb_32f
#define yuvCr_32f 0.713f
#define yuvCb_32f 0.564f
#define yuv_shift 14
#define yuvYr fix(yuvYr_32f,yuv_shift)
#define yuvYg fix(yuvYg_32f,yuv_shift)
#define yuvYb fix(yuvYb_32f,yuv_shift)
#define yuvCr fix(yuvCr_32f,yuv_shift)
#define yuvCb fix(yuvCb_32f,yuv_shift)
#define yuv_descale(x) CV_DESCALE((x), yuv_shift)
#define yuv_prescale(x) ((x) << yuv_shift)
#define yuvRCr_32f 1.403f
#define yuvGCr_32f (-0.714f)
#define yuvGCb_32f (-0.344f)
#define yuvBCb_32f 1.773f
#define yuvRCr fix(yuvRCr_32f,yuv_shift)
#define yuvGCr (-fix(-yuvGCr_32f,yuv_shift))
#define yuvGCb (-fix(-yuvGCb_32f,yuv_shift))
#define yuvBCb fix(yuvBCb_32f,yuv_shift)
#define CV_IMPL_BGRx2YCrCb( flavor, arrtype, worktype, scale_macro, cast_macro, \
YUV_YB, YUV_YG, YUV_YR, YUV_CR, YUV_CB, YUV_Cx_BIAS ) \
static CvStatus CV_STDCALL \
icvBGRx2YCrCb_##flavor##_CnC3R( const arrtype* src, int srcstep, \
arrtype* dst, int dststep, CvSize size, int src_cn, int blue_idx ) \
{ \
int i; \
srcstep /= sizeof(src[0]); \
dststep /= sizeof(src[0]); \
srcstep -= size.width*src_cn; \
size.width *= 3; \
\
for( ; size.height--; src += srcstep, dst += dststep ) \
{ \
for( i = 0; i < size.width; i += 3, src += src_cn ) \
{ \
worktype b = src[blue_idx], r = src[2^blue_idx], y; \
y = scale_macro(b*YUV_YB + src[1]*YUV_YG + r*YUV_YR); \
r = scale_macro((r - y)*YUV_CR) + YUV_Cx_BIAS; \
b = scale_macro((b - y)*YUV_CB) + YUV_Cx_BIAS; \
dst[i] = cast_macro(y); \
dst[i+1] = cast_macro(r); \
dst[i+2] = cast_macro(b); \
} \
} \
\
return CV_OK; \
}
CV_IMPL_BGRx2YCrCb( 8u, uchar, int, yuv_descale, CV_CAST_8U,
yuvYb, yuvYg, yuvYr, yuvCr, yuvCb, 128 )
CV_IMPL_BGRx2YCrCb( 16u, ushort, int, yuv_descale, CV_CAST_16U,
yuvYb, yuvYg, yuvYr, yuvCr, yuvCb, 32768 )
CV_IMPL_BGRx2YCrCb( 32f, float, float, CV_NOP, CV_NOP,
yuvYb_32f, yuvYg_32f, yuvYr_32f, yuvCr_32f, yuvCb_32f, 0.5f )
#define CV_IMPL_YCrCb2BGRx( flavor, arrtype, worktype, prescale_macro, \
scale_macro, cast_macro, YUV_BCb, YUV_GCr, YUV_GCb, YUV_RCr, YUV_Cx_BIAS)\
static CvStatus CV_STDCALL \
icvYCrCb2BGRx_##flavor##_C3CnR( const arrtype* src, int srcstep, \
arrtype* dst, int dststep, CvSize size, \
int dst_cn, int blue_idx ) \
{ \
int i; \
srcstep /= sizeof(src[0]); \
dststep /= sizeof(src[0]); \
dststep -= size.width*dst_cn; \
size.width *= 3; \
\
for( ; size.height--; src += srcstep, dst += dststep ) \
{ \
for( i = 0; i < size.width; i += 3, dst += dst_cn ) \
{ \
worktype Y = prescale_macro(src[i]), \
Cr = src[i+1] - YUV_Cx_BIAS, \
Cb = src[i+2] - YUV_Cx_BIAS; \
worktype b, g, r; \
b = scale_macro( Y + YUV_BCb*Cb ); \
g = scale_macro( Y + YUV_GCr*Cr + YUV_GCb*Cb ); \
r = scale_macro( Y + YUV_RCr*Cr ); \
\
dst[blue_idx] = cast_macro(b); \
dst[1] = cast_macro(g); \
dst[blue_idx^2] = cast_macro(r); \
if( dst_cn == 4 ) \
dst[3] = 0; \
} \
} \
\
return CV_OK; \
}
CV_IMPL_YCrCb2BGRx( 8u, uchar, int, yuv_prescale, yuv_descale, CV_CAST_8U,
yuvBCb, yuvGCr, yuvGCb, yuvRCr, 128 )
CV_IMPL_YCrCb2BGRx( 16u, ushort, int, yuv_prescale, yuv_descale, CV_CAST_16U,
yuvBCb, yuvGCr, yuvGCb, yuvRCr, 32768 )
CV_IMPL_YCrCb2BGRx( 32f, float, float, CV_NOP, CV_NOP, CV_NOP,
yuvBCb_32f, yuvGCr_32f, yuvGCb_32f, yuvRCr_32f, 0.5f )
/****************************************************************************************\
* RGB <-> XYZ *
\****************************************************************************************/
#define xyzXr_32f 0.412453f
#define xyzXg_32f 0.357580f
#define xyzXb_32f 0.180423f
#define xyzYr_32f 0.212671f
#define xyzYg_32f 0.715160f
#define xyzYb_32f 0.072169f
#define xyzZr_32f 0.019334f
#define xyzZg_32f 0.119193f
#define xyzZb_32f 0.950227f
#define xyzRx_32f 3.240479f
#define xyzRy_32f (-1.53715f)
#define xyzRz_32f (-0.498535f)
#define xyzGx_32f (-0.969256f)
#define xyzGy_32f 1.875991f
#define xyzGz_32f 0.041556f
#define xyzBx_32f 0.055648f
#define xyzBy_32f (-0.204043f)
#define xyzBz_32f 1.057311f
#define xyz_shift 10
#define xyzXr_32s fix(xyzXr_32f, xyz_shift )
#define xyzXg_32s fix(xyzXg_32f, xyz_shift )
#define xyzXb_32s fix(xyzXb_32f, xyz_shift )
#define xyzYr_32s fix(xyzYr_32f, xyz_shift )
#define xyzYg_32s fix(xyzYg_32f, xyz_shift )
#define xyzYb_32s fix(xyzYb_32f, xyz_shift )
#define xyzZr_32s fix(xyzZr_32f, xyz_shift )
#define xyzZg_32s fix(xyzZg_32f, xyz_shift )
#define xyzZb_32s fix(xyzZb_32f, xyz_shift )
#define xyzRx_32s fix(3.240479f, xyz_shift )
#define xyzRy_32s -fix(1.53715f, xyz_shift )
#define xyzRz_32s -fix(0.498535f, xyz_shift )
#define xyzGx_32s -fix(0.969256f, xyz_shift )
#define xyzGy_32s fix(1.875991f, xyz_shift )
#define xyzGz_32s fix(0.041556f, xyz_shift )
#define xyzBx_32s fix(0.055648f, xyz_shift )
#define xyzBy_32s -fix(0.204043f, xyz_shift )
#define xyzBz_32s fix(1.057311f, xyz_shift )
#define xyz_descale(x) CV_DESCALE((x),xyz_shift)
#define CV_IMPL_BGRx2XYZ( flavor, arrtype, worktype, \
scale_macro, cast_macro, suffix ) \
static CvStatus CV_STDCALL \
icvBGRx2XYZ_##flavor##_CnC3R( const arrtype* src, int srcstep, \
arrtype* dst, int dststep, CvSize size, \
int src_cn, int blue_idx ) \
{ \
int i; \
worktype t, matrix[] = \
{ \
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -