首页 > 代码库 > Opencv——彩色图像灰度化的三种算法
Opencv——彩色图像灰度化的三种算法
为了加快处理速度在图像处理算法中,往往需要把彩色图像转换为灰度图像。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=http://www.mamicode.com/(uchar*)img->imageData;15 16 int step = img->widthStep/sizeof(uchar); //step即为上图的widthstep17 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个通道->g38 }
原图片:
算法1生成的灰度图:
算法2生成的灰度图:
算法3生成的灰度图:
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。