Opencv——彩色图像灰度化的三种算法
生活随笔
收集整理的這篇文章主要介紹了
Opencv——彩色图像灰度化的三种算法
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
為了加快處理速度在圖像處理算法中,往往需要把彩色圖像轉換為灰度圖像。24為彩色圖像每個像素用3個字節(jié)表示,每個字節(jié)對應著RGB分量的亮度。
當RGB分量值不同時,表現(xiàn)為彩色圖像;當RGB分量相同時,變現(xiàn)為灰度圖像:
一般來說,轉換公式有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生成的灰度圖:
總結
以上是生活随笔為你收集整理的Opencv——彩色图像灰度化的三种算法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 学汽修去哪里 推荐几个汽修培训机构?
- 下一篇: 发改委不给光伏备案怎么办?