#include "stdafx.h"
#include "cv.h"
#include "highgui.h"
/**************************最大值法灰度化****************************************/
/*IplImage * RGBtoGRAYTmax(IplImage *in,IplImage *out)
{   
for (int y=0;y<in->height;y++)
{
uchar *ptr=(uchar*)(in->imageData+y*in->widthStep);
for (int x=0;x<in->width;x++)
{
if(ptr[3*x]>ptr[3*x+1])
out->imageData[y * in->width+ x]=ptr[3*x];
else out->imageData[y * in->width + x]=ptr[3*x+1];
if(ptr[3*x+2]>in->imageData[x])
out->imageData[y * in->width + x]=ptr[3*x+2];
}
}
return(out);
}
//*************************平均值法灰度化********************************
IplImage * AveGRAY(IplImage*in,IplImage*out)
{
for (int y=0;y<in->height;y++)
{
char *p=(char*)(in->imageData+y*in->widthStep);
for (int x=0;x<in->width;x++)
{
out->imageData[y*in->width+x]=(p[3*x]+p[3*x+1]+p[3*x+2])/3;
}
}
return(out);
}
//***********************加权平均法灰度化*******************************
IplImage * JIAQUANGRAY(IplImage*in,IplImage*out)
{
for(int y=0;y<in->height;y++)
{
char *p=(char*)(in->imageData+y*in->widthStep);
for (int x=0;x<in->width;x++)
{
out->imageData[y*in->width+x]=(p[3*x]*11+p[3*x+1]*59+p[3*x+2]*30)/100;
//out->imageData[y*in->width+x]=p[3*x]*0.11+p[3*x+1]*0.59+p[3*x+2]*0.30;
//out->imageData[y*in->width+x]=p[3*x]*0.072169+p[3*x+1]*0.715160+p[3*x+2]*0.212671;
}
}
return(out);
}
int main()
{
IplImage * p=cvLoadImage("D:\\地下车库\\117\\1.jpg",1);
IplImage *c=cvCreateImage(cvGetSize(p),IPL_DEPTH_8U,1);
    IplImage *b=cvCreateImage(cvGetSize(p),IPL_DEPTH_8U,1);
IplImage *d=cvCreateImage(cvGetSize(p),IPL_DEPTH_8U,1);
    RGBtoGRAYTmax(p,c);//调用最大值法灰度化函数
AveGRAY(p,b);//调用平均值法灰度化函数
double t = (double)cvGetTickCount();//算运算时间
JIAQUANGRAY(p,d);//调用加权平均值法灰度化函数
t = (double)cvGetTickCount() - t;
printf( "exec time = %gms\n", t/(cvGetTickFrequency()*1000.));//算运算时间(ms)
cvNamedWindow("max",0);
cvNamedWindow("AVE",0);
cvNamedWindow("jiaquan",0);
cvShowImage("max",c);
cvShowImage("AVE",b);
cvShowImage("jiaquan",d);
cvWaitKey(0);
cvDestroyWindow("OUT");
cvDestroyWindow("AVE");
cvDestroyWindow("jiaquan");
cvReleaseImage(&p);
cvReleaseImage(&c);
cvReleaseImage(&b);
cvReleaseImage(&d);}
各位,我的灰度化的效果为什么和matlab的效果差距很大啊?

解决方案 »

  1.   

    肯定差别大啊,你看matlab的rgb2gray用的啥算法?
    rgb2gray converts RGB values to grayscale values by forming a weighted sum of the R, G, and B components:0.2989 * R + 0.5870 * G + 0.1140 * B 
      

  2.   

    //***********************加权平均法灰度化*******************************
    IplImage * JIAQUANGRAY(IplImage*in,IplImage*out)
    {
    for(int y=0;y<in->height;y++)
    {
    char *p=(char*)(in->imageData+y*in->widthStep);
    for (int x=0;x<in->width;x++)
    {
    out->imageData[y*in->width+x]=(p[3*x]*11+p[3*x+1]*59+p[3*x+2]*30)/100;
    这个不就是matlab里面的方法吗?但是差别很大啊!
      

  3.   

    是不是 RGB的顺序有关了,也就是说你取的可能是BGR
      

  4.   

    opencv一般顺序都是BGR,opencv自己有灰度化函数,为什么自己写呢?cvtColor(img2, img1, CV_BGR2GRAY);
    enum
    {
        CV_BGR2BGRA    =0,
        CV_RGB2RGBA    =CV_BGR2BGRA,    CV_BGRA2BGR    =1,
        CV_RGBA2RGB    =CV_BGRA2BGR,    CV_BGR2RGBA    =2,
        CV_RGB2BGRA    =CV_BGR2RGBA,    CV_RGBA2BGR    =3,
        CV_BGRA2RGB    =CV_RGBA2BGR,    CV_BGR2RGB     =4,
        CV_RGB2BGR     =CV_BGR2RGB,    CV_BGRA2RGBA   =5,
        CV_RGBA2BGRA   =CV_BGRA2RGBA,    CV_BGR2GRAY    =6,
        CV_RGB2GRAY    =7,
        CV_GRAY2BGR    =8,
        CV_GRAY2RGB    =CV_GRAY2BGR,
        CV_GRAY2BGRA   =9,
        CV_GRAY2RGBA   =CV_GRAY2BGRA,
        CV_BGRA2GRAY   =10,
        CV_RGBA2GRAY   =11,    CV_BGR2BGR565  =12,
        CV_RGB2BGR565  =13,
        CV_BGR5652BGR  =14,
        CV_BGR5652RGB  =15,
        CV_BGRA2BGR565 =16,
        CV_RGBA2BGR565 =17,
        CV_BGR5652BGRA =18,
        CV_BGR5652RGBA =19,    CV_GRAY2BGR565 =20,
        CV_BGR5652GRAY =21,    CV_BGR2BGR555  =22,
        CV_RGB2BGR555  =23,
        CV_BGR5552BGR  =24,
        CV_BGR5552RGB  =25,
        CV_BGRA2BGR555 =26,
        CV_RGBA2BGR555 =27,
        CV_BGR5552BGRA =28,
        CV_BGR5552RGBA =29,    CV_GRAY2BGR555 =30,
        CV_BGR5552GRAY =31,    CV_BGR2XYZ     =32,
        CV_RGB2XYZ     =33,
        CV_XYZ2BGR     =34,
        CV_XYZ2RGB     =35,    CV_BGR2YCrCb   =36,
        CV_RGB2YCrCb   =37,
        CV_YCrCb2BGR   =38,
        CV_YCrCb2RGB   =39,    CV_BGR2HSV     =40,
        CV_RGB2HSV     =41,    CV_BGR2Lab     =44,
        CV_RGB2Lab     =45,    CV_BayerBG2BGR =46,
        CV_BayerGB2BGR =47,
        CV_BayerRG2BGR =48,
        CV_BayerGR2BGR =49,    CV_BayerBG2RGB =CV_BayerRG2BGR,
        CV_BayerGB2RGB =CV_BayerGR2BGR,
        CV_BayerRG2RGB =CV_BayerBG2BGR,
        CV_BayerGR2RGB =CV_BayerGB2BGR,    CV_BGR2Luv     =50,
        CV_RGB2Luv     =51,
        CV_BGR2HLS     =52,
        CV_RGB2HLS     =53,    CV_HSV2BGR     =54,
        CV_HSV2RGB     =55,    CV_Lab2BGR     =56,
        CV_Lab2RGB     =57,
        CV_Luv2BGR     =58,
        CV_Luv2RGB     =59,
        CV_HLS2BGR     =60,
        CV_HLS2RGB     =61,    CV_BayerBG2BGR_VNG =62,
        CV_BayerGB2BGR_VNG =63,
        CV_BayerRG2BGR_VNG =64,
        CV_BayerGR2BGR_VNG =65,
        
        CV_BayerBG2RGB_VNG =CV_BayerRG2BGR_VNG,
        CV_BayerGB2RGB_VNG =CV_BayerGR2BGR_VNG,
        CV_BayerRG2RGB_VNG =CV_BayerBG2BGR_VNG,
        CV_BayerGR2RGB_VNG =CV_BayerGB2BGR_VNG,
        
        CV_BGR2HSV_FULL = 66,
        CV_RGB2HSV_FULL = 67,
        CV_BGR2HLS_FULL = 68,
        CV_RGB2HLS_FULL = 69,
        
        CV_HSV2BGR_FULL = 70,
        CV_HSV2RGB_FULL = 71,
        CV_HLS2BGR_FULL = 72,
        CV_HLS2RGB_FULL = 73,
        
        CV_LBGR2Lab     = 74,
        CV_LRGB2Lab     = 75,
        CV_LBGR2Luv     = 76,
        CV_LRGB2Luv     = 77,
        
        CV_Lab2LBGR     = 78,
        CV_Lab2LRGB     = 79,
        CV_Luv2LBGR     = 80,
        CV_Luv2LRGB     = 81,
        
        CV_BGR2YUV      = 82,
        CV_RGB2YUV      = 83,
        CV_YUV2BGR      = 84,
        CV_YUV2RGB      = 85,
        
        CV_BayerBG2GRAY = 86,
        CV_BayerGB2GRAY = 87,
        CV_BayerRG2GRAY = 88,
        CV_BayerGR2GRAY = 89,    CV_YUV420i2RGB  = 90,
        CV_YUV420i2BGR  = 91,
        
        CV_COLORCVT_MAX  =100
    };
      

  5.   

    不是的,openCV就是BGR存的数据。
      

  6.   

    opencv是有自己的灰度化函数,它自带的方法应该是加权平均法的效果。我想利用不同放法灰度化,有最大执法,平均值法。看看哪个效果好。问题我已经解决了,问题是处在ipliamge里面imagedata默认定义的是char类型的,其范围是-128-127,那么如果一幅图像的像素值大于127,那么就自动给他转成负数了,比如是像素值是129,那么你取出来看到的数据是-65.也就是说不再是你认为的129了。所以你再做加减运算的时候自然得不到你想要的结果,解决办法是把iplimage结构体中imagedata类型改成uchar类型,这样其范围就是0到255了,不会被超限。