颜色空间也称彩色模型(又称彩色空间或彩色系统)它的用途是在某些标准下用通常可接受的方式对彩色加以说明。详情去百度百科查看:
百度百科
RGB颜色空间以R(Red:红)、G(Green:绿)、B(Blue:蓝)三种基本色为基础,进行不同程度的叠加,产生丰富而广泛的颜色,所以俗称三原色模式。
RGB(红绿蓝)是依据人眼识别的颜色定义出的空间,可表示大部分颜色。但在科学研究一般不采用RGB颜色空间,因为它的细节难以进行数字化的调整。它将色调,亮度,饱和度三个量放在一起表示,很难分开。它是最通用的面向硬件的彩色模型。该模型用于彩色监视器和一大类彩色视频摄像。
CMY是工业印刷采用的颜色空间。它与RGB对应。简单的类比RGB来源于是物体发光,而CMY是依据反射光得到的。具体应用如打印机:一般采用四色墨盒,即CMY加黑色墨盒。
由色调(Hue)、饱和度(Saturation)、亮度(Value)三个分量构成,HSV更接近于人眼的主观感受
与HSV类似,只不过把V:Value替换为了L:Lightness。这两种表示在用目的上类似,但在方法上有区别。二者在数学上都是圆柱,但HSV(色相,饱和度,色调)在概念上可以被认为是颜色的倒圆锥体(黑点在下顶点,白色在上底面圆心),HSL在概念上表示了一个双圆锥体和圆球体(白色在上顶点,黑色在下顶点,最大横切面的圆心是半程灰色)。注意尽管在HSL和HSV中“色相”指称相同的性质,它们的“饱和度”的定义是明显不同的。对于一些人,HSL更好的反映了“饱和度”和“亮度”作为两个独立参数的直觉观念,但是对于另一些人,它的饱和度定义是错误的,因为非常柔和的几乎白色的颜色在HSL可以被定义为是完全饱和的。对于HSV还是HSL更适合于人类用户界面是有争议的。
同RGB颜色空间相比,Lab(Commission International EclairageLab)是一种不常用的色彩空间。它是在1931年国际照明委员会(Commission International Eclairage, CIE)制定的颜色度量国际标准的基础上建立起来的。1976年,经修改后被正式命名为CIELab。它是一种设备无关的颜色系统,也是一种基于生理特征的颜色系统。这也就意味着,它是用数字化的方法来描述人的视觉感应。Lab颜色空间中的L分量用于表示像素的亮度,取值范围是[0,100],表示从纯黑到纯白;a表示从红色到绿色的范围,取值范围是[127,-128];b表示从黄色到蓝色的范围,取值范围是[127,-128]。
YUV,是一种颜色编码方法。常使用在各个视频处理组件中。 YUV在对照片或视频编码时,考虑到人类的感知能力,允许降低色度的带宽。YUV是编译true-color颜色空间(color space)的种类,Y’UV, YUV, YCbCr,YPbPr等专有名词都可以称为YUV,彼此有重叠。“Y”表示明亮度(Luminance、Luma),“U”和“V”则是色度、浓度(Chrominance、Chroma)。
Opencv 中常用颜色空间有RGB、HSV、YUV、Lab等,具体详情请参考cvtColor函数。
在进行图像处理时,需要用到灰度图、二值图、HSV、HSI等颜色制式,opencv提供了cvtColor函数来实现这些功能。
在modules\imgproc\src\color.cpp中
void cvtColor( InputArray _src, OutputArray _dst, int code, int dcn )
{
CV_INSTRUMENT_REGION();
CV_Assert(!_src.empty());
if(dcn <= 0)
dcn = dstChannels(code);
CV_OCL_RUN( _src.dims() <= 2 && _dst.isUMat() &&
!(CV_MAT_DEPTH(_src.type()) == CV_8U && (code == COLOR_Luv2BGR || code == COLOR_Luv2RGB)),
ocl_cvtColor(_src, _dst, code, dcn) )
switch( code )
{
case COLOR_BGR2BGRA: case COLOR_RGB2BGRA: case COLOR_BGRA2BGR:
case COLOR_RGBA2BGR: case COLOR_RGB2BGR: case COLOR_BGRA2RGBA:
if(_src.channels() == 1)
cvtColorGray2BGR(_src, _dst, dcn);
else
cvtColorBGR2BGR(_src, _dst, dcn, swapBlue(code));
break;
case COLOR_BGR2BGR565: case COLOR_BGR2BGR555: case COLOR_BGRA2BGR565: case COLOR_BGRA2BGR555:
case COLOR_RGB2BGR565: case COLOR_RGB2BGR555: case COLOR_RGBA2BGR565: case COLOR_RGBA2BGR555:
cvtColorBGR25x5(_src, _dst, swapBlue(code), greenBits(code));
break;
case COLOR_BGR5652BGR: case COLOR_BGR5552BGR: case COLOR_BGR5652BGRA: case COLOR_BGR5552BGRA:
case COLOR_BGR5652RGB: case COLOR_BGR5552RGB: case COLOR_BGR5652RGBA: case COLOR_BGR5552RGBA:
cvtColor5x52BGR(_src, _dst, dcn, swapBlue(code), greenBits(code));
break;
case COLOR_BGR2GRAY: case COLOR_BGRA2GRAY:
case COLOR_RGB2GRAY: case COLOR_RGBA2GRAY:
cvtColorBGR2Gray(_src, _dst, swapBlue(code));
break;
case COLOR_BGR5652GRAY:
case COLOR_BGR5552GRAY:
cvtColor5x52Gray(_src, _dst, greenBits(code));
break;
case COLOR_GRAY2BGR:
case COLOR_GRAY2BGRA:
cvtColorGray2BGR(_src, _dst, dcn);
break;
case COLOR_GRAY2BGR565:
case COLOR_GRAY2BGR555:
cvtColorGray25x5(_src, _dst, greenBits(code));
break;
case COLOR_BGR2YCrCb: case COLOR_RGB2YCrCb:
case COLOR_BGR2YUV: case COLOR_RGB2YUV:
cvtColorBGR2YUV(_src, _dst, swapBlue(code), code == COLOR_BGR2YCrCb || code == COLOR_RGB2YCrCb);
break;
case COLOR_YCrCb2BGR: case COLOR_YCrCb2RGB:
case COLOR_YUV2BGR: case COLOR_YUV2RGB:
cvtColorYUV2BGR(_src, _dst, dcn, swapBlue(code), code == COLOR_YCrCb2BGR || code == COLOR_YCrCb2RGB);
break;
case COLOR_BGR2XYZ:
case COLOR_RGB2XYZ:
cvtColorBGR2XYZ(_src, _dst, swapBlue(code));
break;
case COLOR_XYZ2BGR:
case COLOR_XYZ2RGB:
cvtColorXYZ2BGR(_src, _dst, dcn, swapBlue(code));
break;
case COLOR_BGR2HSV: case COLOR_BGR2HSV_FULL:
case COLOR_RGB2HSV: case COLOR_RGB2HSV_FULL:
cvtColorBGR2HSV(_src, _dst, swapBlue(code), isFullRangeHSV(code));
break;
case COLOR_BGR2HLS: case COLOR_BGR2HLS_FULL:
case COLOR_RGB2HLS: case COLOR_RGB2HLS_FULL:
cvtColorBGR2HLS(_src, _dst, swapBlue(code), isFullRangeHSV(code));
break;
case COLOR_HSV2BGR: case COLOR_HSV2BGR_FULL:
case COLOR_HSV2RGB: case COLOR_HSV2RGB_FULL:
cvtColorHSV2BGR(_src, _dst, dcn, swapBlue(code), isFullRangeHSV(code));
break;
case COLOR_HLS2BGR: case COLOR_HLS2BGR_FULL:
case COLOR_HLS2RGB: case COLOR_HLS2RGB_FULL:
cvtColorHLS2BGR(_src, _dst, dcn, swapBlue(code), isFullRangeHSV(code));
break;
case COLOR_BGR2Lab: case COLOR_LBGR2Lab:
case COLOR_RGB2Lab: case COLOR_LRGB2Lab:
cvtColorBGR2Lab(_src, _dst, swapBlue(code), is_sRGB(code));
break;
case COLOR_BGR2Luv: case COLOR_LBGR2Luv:
case COLOR_RGB2Luv: case COLOR_LRGB2Luv:
cvtColorBGR2Luv(_src, _dst, swapBlue(code), is_sRGB(code));
break;
case COLOR_Lab2BGR: case COLOR_Lab2LBGR:
case COLOR_Lab2RGB: case COLOR_Lab2LRGB:
cvtColorLab2BGR(_src, _dst, dcn, swapBlue(code), is_sRGB(code));
break;
case COLOR_Luv2BGR: case COLOR_Luv2LBGR:
case COLOR_Luv2RGB: case COLOR_Luv2LRGB:
cvtColorLuv2BGR(_src, _dst, dcn, swapBlue(code), is_sRGB(code));
break;
case COLOR_BayerBG2GRAY: case COLOR_BayerGB2GRAY: case COLOR_BayerRG2GRAY: case COLOR_BayerGR2GRAY:
case COLOR_BayerBG2BGR: case COLOR_BayerGB2BGR: case COLOR_BayerRG2BGR: case COLOR_BayerGR2BGR:
case COLOR_BayerBG2BGR_VNG: case COLOR_BayerGB2BGR_VNG: case COLOR_BayerRG2BGR_VNG: case COLOR_BayerGR2BGR_VNG:
case COLOR_BayerBG2BGR_EA: case COLOR_BayerGB2BGR_EA: case COLOR_BayerRG2BGR_EA: case COLOR_BayerGR2BGR_EA:
case COLOR_BayerBG2BGRA: case COLOR_BayerGB2BGRA: case COLOR_BayerRG2BGRA: case COLOR_BayerGR2BGRA:
{
Mat src;
if (_src.getObj() == _dst.getObj()) // inplace processing (#6653)
_src.copyTo(src);
else
src = _src.getMat();
demosaicing(src, _dst, code, dcn);
break;
}
case COLOR_YUV2BGR_NV21: case COLOR_YUV2RGB_NV21: case COLOR_YUV2BGR_NV12: case COLOR_YUV2RGB_NV12:
case COLOR_YUV2BGRA_NV21: case COLOR_YUV2RGBA_NV21: case COLOR_YUV2BGRA_NV12: case COLOR_YUV2RGBA_NV12:
// http://www.fourcc.org/yuv.php#NV21 == yuv420sp -> a plane of 8 bit Y samples followed by an interleaved V/U plane containing 8 bit 2x2 subsampled chroma samples
// http://www.fourcc.org/yuv.php#NV12 -> a plane of 8 bit Y samples followed by an interleaved U/V plane containing 8 bit 2x2 subsampled colour difference samples
cvtColorTwoPlaneYUV2BGR(_src, _dst, dcn, swapBlue(code), uIndex(code));
break;
case COLOR_YUV2BGR_YV12: case COLOR_YUV2RGB_YV12: case COLOR_YUV2BGRA_YV12: case COLOR_YUV2RGBA_YV12:
case COLOR_YUV2BGR_IYUV: case COLOR_YUV2RGB_IYUV: case COLOR_YUV2BGRA_IYUV: case COLOR_YUV2RGBA_IYUV:
//http://www.fourcc.org/yuv.php#YV12 == yuv420p -> It comprises an NxM Y plane followed by (N/2)x(M/2) V and U planes.
//http://www.fourcc.org/yuv.php#IYUV == I420 -> It comprises an NxN Y plane followed by (N/2)x(N/2) U and V planes
cvtColorThreePlaneYUV2BGR(_src, _dst, dcn, swapBlue(code), uIndex(code));
break;
case COLOR_YUV2GRAY_420:
cvtColorYUV2Gray_420(_src, _dst);
break;
case COLOR_RGB2YUV_YV12: case COLOR_BGR2YUV_YV12: case COLOR_RGBA2YUV_YV12: case COLOR_BGRA2YUV_YV12:
case COLOR_RGB2YUV_IYUV: case COLOR_BGR2YUV_IYUV: case COLOR_RGBA2YUV_IYUV: case COLOR_BGRA2YUV_IYUV:
cvtColorBGR2ThreePlaneYUV(_src, _dst, swapBlue(code), uIndex(code));
break;
case COLOR_YUV2RGB_UYVY: case COLOR_YUV2BGR_UYVY: case COLOR_YUV2RGBA_UYVY: case COLOR_YUV2BGRA_UYVY:
case COLOR_YUV2RGB_YUY2: case COLOR_YUV2BGR_YUY2: case COLOR_YUV2RGB_YVYU: case COLOR_YUV2BGR_YVYU:
case COLOR_YUV2RGBA_YUY2: case COLOR_YUV2BGRA_YUY2: case COLOR_YUV2RGBA_YVYU: case COLOR_YUV2BGRA_YVYU:
//http://www.fourcc.org/yuv.php#UYVY
//http://www.fourcc.org/yuv.php#YUY2
//http://www.fourcc.org/yuv.php#YVYU
{
int ycn = (code==COLOR_YUV2RGB_UYVY || code==COLOR_YUV2BGR_UYVY ||
code==COLOR_YUV2RGBA_UYVY || code==COLOR_YUV2BGRA_UYVY) ? 1 : 0;
cvtColorOnePlaneYUV2BGR(_src, _dst, dcn, swapBlue(code), uIndex(code), ycn);
break;
}
case COLOR_YUV2GRAY_UYVY:
case COLOR_YUV2GRAY_YUY2:
cvtColorYUV2Gray_ch(_src, _dst, code == COLOR_YUV2GRAY_UYVY ? 1 : 0);
break;
case COLOR_RGBA2mRGBA:
cvtColorRGBA2mRGBA(_src, _dst);
break;
case COLOR_mRGBA2RGBA:
cvtColormRGBA2RGBA(_src, _dst);
break;
default:
CV_Error( CV_StsBadFlag, "Unknown/unsupported color conversion code" );
}
}
#include
#include
using namespace cv;
using namespace std;
int main(int argc, char** argv)
{
Mat src, dst;
// 读取图像,格式为BGR
src = imread("G:/opencv/vs_opencv/images/lena.png");
if (src.empty())
{
cout << "src is empty." << endl;
return -1;
}
imshow("src", src);
// 转换为灰度图像 BGR TO GRAY
cvtColor(src, dst, COLOR_BGR2GRAY);
imshow("gray", dst);
// 转换为HSV BGR TO HSV
cvtColor(src, dst, COLOR_BGR2HSV);
imshow("hsv",dst);
// 转换为LAB BGR TO LAB
cvtColor(src, dst, COLOR_BGR2Lab);
imshow("lab", dst);
// 转换为LAB BGR TO LAB
cvtColor(src, dst, COLOR_BGR2YCrCb);
imshow("Ycrcb", dst);
// 转换为LAB BGR TO XYZ
cvtColor(src, dst, COLOR_BGR2XYZ);
imshow("xyz", dst);
waitKey(0);
destroyAllWindows();
return 0;
}