RGB 与 CMYK 颜色空间
- RGB有3个颜色通道,CMYK有4个,K指黑色通道
- 保存图像颜色信息的通道称为颜色通道
- 比如R通道的值,可以理解为红的程度,越接近255,越红
转成单色通道步骤
- 加载原图像
- 分离颜色通道(分离出 R, G, B)
- 混合颜色通道(由 R, G, B 可以混合成其他颜色通道)
- 显示新图像
实例
#include <cv.h>
#include <highgui.h>
using namespace cv;
using namespace std;
int main() {
// 参数 CV_LOAD_IMAGE_COLOR 意味着不管原始图像的通道数是多少,都将被转换为3通道输入
IplImage *srcImage = cvLoadImage("../pictures/bear.jpeg", CV_LOAD_IMAGE_COLOR);
// 原图像
cvNamedWindow("RGB");
cvShowImage("RGB", srcImage);
// 单通道 image
// 分别存储3个通道
IplImage *Bimage = cvCreateImage(cvGetSize(srcImage), IPL_DEPTH_8U, 1); // 1通道
IplImage *Gimage = cvCreateImage(cvGetSize(srcImage), IPL_DEPTH_8U, 1);
IplImage *Rimage = cvCreateImage(cvGetSize(srcImage), IPL_DEPTH_8U, 1);
// 分开通道
cvSplit(srcImage, Bimage, Gimage, Rimage, 0);
// 3通道 image
// 分别存储融合后的新图
IplImage *BlueImage = cvCreateImage(cvGetSize(srcImage), IPL_DEPTH_8U, 3); // 3通道
IplImage *GreenImage = cvCreateImage(cvGetSize(srcImage), IPL_DEPTH_8U, 3);
IplImage *RedImage = cvCreateImage(cvGetSize(srcImage), IPL_DEPTH_8U, 3);
// 合成图像前先清零
cvSetZero(BlueImage);
cvSetZero(GreenImage);
cvSetZero(RedImage);
// 合成图像
cvMerge(Bimage, 0, 0, 0, BlueImage);
cvMerge(0, Gimage, 0, 0, GreenImage);
cvMerge(0, 0, Rimage, 0, RedImage);
// 显示新图像
cvNamedWindow("Blue");
cvShowImage("Blue", BlueImage);
cvNamedWindow("Green");
cvShowImage("Green", GreenImage);
cvNamedWindow("Red");
cvShowImage("Red", RedImage);
waitKey(0);
return 0;
}
原图
合成 RGB 单色通道图像
// RGB 颜色空间
cvMerge(Bimage, 0, 0, 0, BlueImage);
cvMerge(0, Gimage, 0, 0, GreenImage);
cvMerge(0, 0, Rimage, 0, RedImage);
根据 RGB 叠加色原理,还可以合成 青,黄,品红
// CMYK 颜色空间
cvMerge(Bimage, Gimage, 0, 0, CyanImage); // 蓝 + 绿 = 青
cvMerge(Bimage, 0, Rimage, 0, MagentaImage); // 蓝 + 红 = 品红
cvMerge(0, Gimage, Rimage, 0, YellowImage); // 绿 + 红 = 黄