您的位置:首页 > 运维架构

Opencv——彩色图像灰度化的三种算法

2014-07-01 13:43 344 查看
为了加快处理速度在图像处理算法中,往往需要把彩色图像转换为灰度图像。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的分量比较大所以可以直接用它代替

下面是代码:

#include<cv.h>
#include<highgui.h>

using namespace cv;
using namespace std;

int main()
{
IplImage *img=cvLoadImage("D:\\Opencv\\Images\\lena.jpg");
IplImage* dest=cvCreateImage(cvGetSize(img),img->depth,1);
cvNamedWindow("SourceImage");
cvNamedWindow("destinationImage");

uchar* data=(uchar*)img->imageData;

int step = img->widthStep/sizeof(uchar);     //step即为上图的widthstep
int channels = img->nChannels;            // 这个图片为3通道的
uchar    b=0,g=0,r=0;
for(int i=0;i<img->height;i++)
for(int j=0;j<img->width;j++){
b=data[i*step+j*channels+0];   // 此时可以通过更改bgr的值达到访问效果。
g=data[i*step+j*channels+1];
r=data[i*step+j*channels+2];
// ((char*)(dest->imageData + j*dest->widthStep))[i] =(b+r+g)/3;//(1)
//((char*)(dest->imageData + j*dest->widthStep))[i] =r*0.299+g*0.587+0.144*b;//(2)
((char*)(dest->imageData + j*dest->widthStep))[i] =g;//(3)
}

cvShowImage("SourceImage",img);
cvShowImage("destinationImage",dest);
cvWaitKey();
cvDestroyAllWindows();
cvReleaseImage(&img);
cvReleaseImage(&dest);
//i*step     当i=0 即为上图的第一行   为1就是第二行
//j*chanels+0  j*通道数当j=0为第一列的第0个通道->b
//j*channels+1         当j=1为第二列的第1个通道->g
}


原图片:



算法1生成的灰度图:



算法2生成的灰度图:



算法3生成的灰度图:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: