cvCvtColor实现色彩空间转换

void cvCvtColor( const CvArr* src, CvArr* dst, int code );
src
输入的 8-bit , 16-bit 或 32-bit 单倍精度浮点数影像.
dst
输出的 8-bit , 16-bit 或 32-bit 单倍精度浮点数影像.
code
色彩空间转换,通过定义 CV_2 常数 (见下面).

函数 cvCvtColor 将输入图像从一个色彩空间转换为另外一个色彩空间。函数忽略 IplImage 头中定义的 colorModel 和 channelSeq 域,所以输入图像的色彩空间应该正确指定 (包括通道的顺序,对RGB空间而言,BGR 意味着布局为 B0 G0 R0 B1 G1 R1 ... 层叠的 24-位格式,而 RGB 意味着布局为 R0 G0 B0 R1 G1 B1 ... 层叠的24-位格式. 函数做如下变换:

RGB 空间内部的变换,如增加/删除 alpha 通道,反相通道顺序,到16位 RGB彩色或者15位RGB彩色的正逆转换(Rx5:Gx6:Rx5),以及到灰度图像的正逆转换,使用:

RGB[A]->Gray: Y=0.212671*R + 0.715160*G + 0.072169*B + 0*A
Gray->RGB[A]: R=Y G=Y B=Y A=0

所有可能的图像色彩空间的相互变换公式列举如下:

RGB<=>XYZ (CV_BGR2XYZ, CV_RGB2XYZ, CV_XYZ2BGR, CV_XYZ2RGB):

|X| |0.412411 0.357585 0.180454| |R|
|Y| = |0.212649 0.715169 0.072182|*|G|
|Z| |0.019332 0.119195 0.950390| |B|

|R| | 3.240479 -1.53715 -0.498535| |X|
|G| = |-0.969256 1.875991 0.041556|*|Y|
|B| | 0.055648 -0.204043 1.057311| |Z|

RGB<=>YCrCb (CV_BGR2YCrCb, CV_RGB2YCrCb, CV_YCrCb2BGR, CV_YCrCb2RGB)

Y=0.299*R + 0.587*G + 0.114*B
Cr=(R-Y)*0.713 + 128
Cb=(B-Y)*0.564 + 128

R=Y + 1.403*(Cr - 128)
G=Y - 0.344*(Cr - 128) - 0.714*(Cb - 128)
B=Y + 1.773*(Cb - 128)

RGB=>HSV (CV_BGR2HSV,CV_RGB2HSV)

V=max(R,G,B)
S=(V-min(R,G,B))*255/V if V!=0, 0 otherwise

(G - B)*60/S, if V=R
H= 180+(B - R)*60/S, if V=G
240+(R - G)*60/S, if V=B

if H<0 then H=H+360

使用上面从 0° 到 360° 变化的公式计算色调(hue)值,确保它们被 2 除后能适用于8位。

RGB=>Lab (CV_BGR2Lab, CV_RGB2Lab)

|X| |0.433910 0.376220 0.189860| |R/255|
|Y| = |0.212649 0.715169 0.072182|*|G/255|
|Z| |0.017756 0.109478 0.872915| |B/255|

L = 116*Y1/3 for Y>0.008856
L = 903.3*Y for Y<=0.008856

a = 500*(f(X)-f(Y))
b = 200*(f(Y)-f(Z))
where f(t)=t1/3 for t>0.008856
f(t)=7.787*t+16/116 for t<=0.008856

上面的公式可以参考 http://www.cica.indiana.edu/cica/faq/color_spaces/color.spaces.html

Bayer=>RGB (CV_BayerBG2BGR, CV_BayerGB2BGR, CV_BayerRG2BGR, CV_BayerGR2BGR, CV_BayerBG2RGB, CV_BayerRG2BGR, CV_BayerGB2RGB, CV_BayerGR2BGR, CV_BayerRG2RGB, CV_BayerBG2BGR, CV_BayerGR2RGB, CV_BayerGB2BGR)

Bayer 模式被广泛应用于 CCD 和 CMOS 摄像头. 它允许从一个单独平面中得到彩色图像,该平面中的 R/G/B 象素点被安排如下:

R G R G R
G B G B G
R G R G R
G B G B G
R G R G R
G B G B G

对像素输出的RGB份量由该像素的1、2或者4邻域中具有相同颜色的点插值得到。以上的模式可以通过向左或者向上平移一个像素点来作一些修改。转换常量CV_BayerC1C22{RGB|RGB}中的两个字母C1和C2表示特定的模式类型:颜色份量分别来自于第二行,第二和第三列。比如说,上述的模式具有很流行的"BG"类型。

【以上引自http://www.opencv.org.cn/index.php/Cv图像处理#CvtColor


【附:opencv库中附带源码】


#define   CV_BGR2BGRA       0
#define   CV_RGB2RGBA       CV_BGR2BGRA

#define   CV_BGRA2BGR       1
#define   CV_RGBA2RGB       CV_BGRA2BGR

#define   CV_BGR2RGBA       2
#define   CV_RGB2BGRA       CV_BGR2RGBA

#define   CV_RGBA2BGR       3
#define   CV_BGRA2RGB       CV_RGBA2BGR

#define   CV_BGR2RGB         4
#define   CV_RGB2BGR         CV_BGR2RGB

#define   CV_BGRA2RGBA     5
#define   CV_RGBA2BGRA     CV_BGRA2RGBA

#define   CV_BGR2GRAY       6
#define   CV_RGB2GRAY       7
#define   CV_GRAY2BGR       8
#define   CV_GRAY2RGB       CV_GRAY2BGR
#define   CV_GRAY2BGRA     9
#define   CV_GRAY2RGBA     CV_GRAY2BGRA
#define   CV_BGRA2GRAY     10
#define   CV_RGBA2GRAY     11

#define   CV_BGR2BGR565   12
#define   CV_RGB2BGR565   13
#define   CV_BGR5652BGR   14
#define   CV_BGR5652RGB   15
#define   CV_BGRA2BGR565 16
#define   CV_RGBA2BGR565 17
#define   CV_BGR5652BGRA 18
#define   CV_BGR5652RGBA 19

#define   CV_GRAY2BGR565 20
#define   CV_BGR5652GRAY 21

#define   CV_BGR2BGR555   22
#define   CV_RGB2BGR555   23
#define   CV_BGR5552BGR   24
#define   CV_BGR5552RGB   25
#define   CV_BGRA2BGR555 26
#define   CV_RGBA2BGR555 27
#define   CV_BGR5552BGRA 28
#define   CV_BGR5552RGBA 29

#define   CV_GRAY2BGR555 30
#define   CV_BGR5552GRAY 31

#define   CV_BGR2XYZ         32
#define   CV_RGB2XYZ         33
#define   CV_XYZ2BGR         34
#define   CV_XYZ2RGB         35

#define   CV_BGR2YCrCb     36
#define   CV_RGB2YCrCb     37
#define   CV_YCrCb2BGR     38
#define   CV_YCrCb2RGB     39

#define   CV_BGR2HSV         40
#define   CV_RGB2HSV         41

#define   CV_BGR2Lab         44
#define   CV_RGB2Lab         45

#define   CV_BayerBG2BGR 46
#define   CV_BayerGB2BGR 47
#define   CV_BayerRG2BGR 48
#define   CV_BayerGR2BGR 49

#define   CV_BayerBG2RGB CV_BayerRG2BGR
#define   CV_BayerGB2RGB CV_BayerGR2BGR
#define   CV_BayerRG2RGB CV_BayerBG2BGR
#define   CV_BayerGR2RGB CV_BayerGB2BGR

#define   CV_BGR2Luv         50
#define   CV_RGB2Luv         51
#define   CV_BGR2HLS         52
#define   CV_RGB2HLS         53

#define   CV_HSV2BGR         54
#define   CV_HSV2RGB         55

#define   CV_Lab2BGR         56
#define   CV_Lab2RGB         57
#define   CV_Luv2BGR         58
#define   CV_Luv2RGB         59
#define   CV_HLS2BGR         60
#define   CV_HLS2RGB         61

#define   CV_COLORCVT_MAX   100
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
`cvCvtColor` 是 OpenCV 中的一个函数,用于将图像从一种颜色空间转换为另一种颜色空间。这个函数可以用来实现图像的灰度化、色彩空间转换等操作。 `cvCvtColor` 的函数原型如下: ```c++ void cvCvtColor(const CvArr* src, CvArr* dst, int code); ``` 其中,`src` 和 `dst` 分别是输入和输出图像的指针,可以是 `IplImage*`、`CvMat*` 或 `CvMatND*` 类型。`code` 表示要进行的颜色空间转换类型,可以是以下常量之一: - `CV_BGR2GRAY`:将 BGR 彩色图像转换为灰度图像。 - `CV_GRAY2BGR`:将灰度图像转换为 BGR 彩色图像。 - `CV_BGR2HSV`:将 BGR 彩色图像转换为 HSV 彩色图像。 - `CV_HSV2BGR`:将 HSV 彩色图像转换为 BGR 彩色图像。 - `CV_BGR2YCrCb`:将 BGR 彩色图像转换为 YCrCb 彩色图像。 - `CV_YCrCb2BGR`:将 YCrCb 彩色图像转换为 BGR 彩色图像。 等等。 下面是一个使用 `cvCvtColor` 函数将彩色图像转换为灰度图像的示例代码: ```c++ #include <opencv2/opencv.hpp> using namespace cv; int main() { // 读取彩色图像 Mat img = imread("test.jpg"); if (img.empty()) { printf("无法读取图像文件\n"); return -1; } // 转换为灰度图像 Mat gray; cvtColor(img, gray, CV_BGR2GRAY); // 显示原图和灰度图像 namedWindow("Image", WINDOW_AUTOSIZE); namedWindow("Gray", WINDOW_AUTOSIZE); imshow("Image", img); imshow("Gray", gray); waitKey(0); return 0; } ``` 在这个示例中,首先使用 `imread` 函数读取一张名为 `test.jpg` 的彩色图像,并将其存储在 `cv::Mat` 类型的变量 `img` 中。然后,使用 `cvtColor` 函数将 `img` 转换为灰度图像,并将结果存储在 `cv::Mat` 类型的变量 `gray` 中。最后,通过 `imshow` 函数分别显示原图和灰度图像。需要注意的是,`cvCvtColor` 函数已经被弃用,建议使用 `cv::cvtColor` 函数来代替。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值