爲了加快處理速度在圖像處理算法中,每每須要把彩色圖像轉換爲灰度圖像。24爲彩色圖像每一個像素用3個字節表示,每一個字節對應着RGB份量的亮度。算法
當RGB份量值不一樣時,表現爲彩色圖像;當RGB份量相同時,變現爲灰度圖像:ui
通常來講,轉換公式有3中。spa
(1)Gray(i,j)=[R(i,j)+G(i,j)+B(i,j)]/3;code
(2)Gray(i,j)=0.299*R(i,j)+0.587*G(i,j)+0.144*B(i,j);blog
(3)Gray(i,j)=G(i,j);//從2能夠看出G的份量比較大因此能夠直接用它代替圖片
下面是代碼:it
1 #include<cv.h> 2 #include<highgui.h> 3 4 using namespace cv; 5 using namespace std; 6 7 int main() 8 { 9 IplImage *img=cvLoadImage("D:\\Opencv\\Images\\lena.jpg"); 10 IplImage* dest=cvCreateImage(cvGetSize(img),img->depth,1); 11 cvNamedWindow("SourceImage"); 12 cvNamedWindow("destinationImage"); 13 14 uchar* data=(uchar*)img->imageData; 15 16 int step = img->widthStep/sizeof(uchar); //step即爲上圖的widthstep 17 int channels = img->nChannels; // 這個圖片爲3通道的 18 uchar b=0,g=0,r=0; 19 for(int i=0;i<img->height;i++) 20 for(int j=0;j<img->width;j++){ 21 b=data[i*step+j*channels+0]; // 此時能夠經過更改bgr的值達到訪問效果。 22 g=data[i*step+j*channels+1]; 23 r=data[i*step+j*channels+2]; 24 // ((char*)(dest->imageData + j*dest->widthStep))[i] =(b+r+g)/3;//(1) 25 //((char*)(dest->imageData + j*dest->widthStep))[i] =r*0.299+g*0.587+0.144*b;//(2) 26 ((char*)(dest->imageData + j*dest->widthStep))[i] =g;//(3) 27 } 28 29 cvShowImage("SourceImage",img); 30 cvShowImage("destinationImage",dest); 31 cvWaitKey(); 32 cvDestroyAllWindows(); 33 cvReleaseImage(&img); 34 cvReleaseImage(&dest); 35 //i*step 當i=0 即爲上圖的第一行 爲1就是第二行 36 //j*chanels+0 j*通道數當j=0爲第一列的第0個通道->b 37 //j*channels+1 當j=1爲第二列的第1個通道->g 38 }
原圖片:io
算法1生成的灰度圖:圖像處理
算法2生成的灰度圖:class
算法3生成的灰度圖: