天天看點

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圖

繼續閱讀