程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> Opencv——彩色圖像灰度化的三種算法

Opencv——彩色圖像灰度化的三種算法

編輯:C++入門知識

為了加快處理速度在圖像處理算法中,往往需要把彩色圖像轉換為灰度圖像。24為彩色圖像每個像素用3個字節表示,每個字節對應著RGB分量的亮度。

當RGB分量值不同時,表現為彩色圖像;當RGB分量相同時,變現為灰度圖像:

一般來說,轉換公式有3中。

(1)Gray(i,j)=[R(i,j)+G(i,j)+B(i,j)]/3;

(2)Gray(i,j)=0.299*R(i,j)+0.587*G(i,j)+0.144*B(i,j);

(3)Gray(i,j)=G(i,j);//從2可以看出G的分量比較大所以可以直接用它代替

下面是代碼:

 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 }

原圖片:

算法1生成的灰度圖:

算法2生成的灰度圖:

算法3生成的灰度圖:

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved