天天看点

9.2【彩色模型】-----基于Opencv实现-----把一幅RGB图转为CMY图

(一)CMY模型

CMY(Cyan,Magenta,Yellow)模型是采用青,品红,黄色3种基本原色按一定比例合成颜色的方法,由于色彩的显示不是直接来自于光线的色彩,而是光线被物理吸收掉一部分之后反射回来的剩余光线所产生的,因此CMY模型又被称为减色法混色模型。当光线都被吸收时称为黑色,都被反射时称为白色。

像CMY模型这样的减色混合模型正好适用于彩色打印机和复印机这类需要在纸上沉积彩色颜料的设备,因为颜料不是像显示器那样发出颜色,而是反射颜色。例如,当青色颜料涂覆的表面用白光照射时,从该表面反射的不是红光,而是从反射的红白光中减掉红色而得到青色(白色本身是等量的红,绿,蓝光的组合)。

(二)RGB与CMY之间的转换公式

9.2【彩色模型】-----基于Opencv实现-----把一幅RGB图转为CMY图

(三)利用Visual C++实现RGB模型转换到CMY模型

/*-------------------------------------------------------------------------------------------------------
*程序说明:
*		基于OpenCV实现-------将三通道RGB图片分别按R,G,B三个不同分量输出显示
*开发环境:
*		win7+vs2010+opencv2.4.8
*创建时间地点:
*		陕西师范大学。2017.3.17
*参考资料:
*		无
*作者:
*		李先生
--------------------------------------------------------------------------------------------------------*/
#include<opencv2\highgui\highgui.hpp>
#include<opencv2\imgproc\imgproc.hpp>
#include<opencv2\imgproc\imgproc_c.h>

/*-------------------------------------------------------------------------------------------------------
* 函数功能
*			将三通道RGB图片分别按R,G,B三个不同分量存储
* 函数参数
*			IplImage* src;     RGB图像
*			IplImage* RImage; R分量的存储矩阵(图像) 
*			IplImage* GImage; G分量的存储矩阵
*			IplImage* BImage; B分量的存储矩阵
---------------------------------------------------------------------------------------------------------*/
void RGB(IplImage* src,IplImage* CMYImage)
{
	int nHeight  =  src->height;
	int nWidth   =  src->width;
	
	for(int i=0;i<nHeight;i++)
	{
		for(int j=0;j<nWidth;j++)
		{
			//  提取出像素点(j,i)处的地址,存储在一个指针变量中,因为src是三通到的图像,在计算机中RGB图像是按照B,G,R的顺序存储的
			//  所以每一点的地址大小实际上就是等同于大小为三的数组 如p[3],所以按照B,G,R的存储顺序,p[0]=B,p[1]=G,p[2]=R;
			uchar *p=(uchar*)(src->imageData+i*src->widthStep)+src->nChannels*j;  
			
			int B = p[0];
			int G = p[1];
			int R = p[2];

			int C = 255-R;
			int M = 255-G;
			int Y = 255-B;

			((uchar*)(CMYImage->imageData+i*CMYImage->widthStep)+CMYImage->nChannels*j)[0] = Y;   //一通道存放 B 分量,其他两个通道的分量值为 0 
			((uchar*)(CMYImage->imageData+i*CMYImage->widthStep)+CMYImage->nChannels*j)[1] = M;
			((uchar*)(CMYImage->imageData+i*CMYImage->widthStep)+CMYImage->nChannels*j)[2] = C;
		}
	}
}
/*-------------------------------------------------------------------------------------------------------
* 函数功能
*			主函数,我们的程序从这里开始执行
---------------------------------------------------------------------------------------------------------*/
int main()
{
	IplImage* srcImage=cvLoadImage("G:\\Image\\face2.jpg",CV_LOAD_IMAGE_COLOR);  //加载图像,参数 CV_LOAD_IMAGE_COLOR 意味着不管原始图像的通道数是多少,都将被转换为3通道输入
	
	CvSize RGBSize;
	RGBSize.height = srcImage->height;
	RGBSize.width  = srcImage->width;
	 
	IplImage * CMYImage = cvCreateImage(RGBSize,IPL_DEPTH_8U,3);			  //创建三个和原图像同等大小的矩阵,用来存储 R G B 三个不同分量的像素
	
	RGB(srcImage,CMYImage);                                         //调用分解函数

	cvNamedWindow("原图");     //创建显示图像的窗口                                       
	cvNamedWindow("CMY模型图");
	
	cvShowImage("原图",srcImage);   //显示原图及效果图
	cvShowImage("CMY模型图",CMYImage);
	
	cvWaitKey(0);

	cvDestroyWindow("原图");   //释放内存空间
	cvDestroyWindow("CMY模型图");
	
	cvReleaseImage(&srcImage);
	cvReleaseImage(&CMYImage);
	
	return 0;

}
           

(4)运行结果

9.2【彩色模型】-----基于Opencv实现-----把一幅RGB图转为CMY图

继续阅读