Retinex(SSR)

来源:互联网 发布:卷皮源码无加密 编辑:程序博客网 时间:2024/04/29 20:36

原文转自:http://www.opencv.org.cn/forum.php?mod=viewthread&tid=28476

使用opencv的SSR去雾程序,根据http://www.cnblogs.com/Imageshop/archive/2013/04/17/3026881.html中的方法编写。

  1. #include <cv.h>
  2. #include <highgui.h>
  3. #include <iostream>
  4. #include <math.h>
  5. using namespace std;
  6. /********************************************************************************
  7.                                 单尺度Retinex图像增强程序
  8.                                 src为待处理图像
  9.                                 sigma为高斯模糊标准差
  10.                                 scale为对比度系数
  11. *********************************************************************************/
  12. void SSR(IplImage* src,int sigma,int scale)
  13. {
  14.         IplImage* src_fl  = cvCreateImage(cvGetSize(src),IPL_DEPTH_32F,src->nChannels);
  15.         IplImage* src_fl1 = cvCreateImage(cvGetSize(src),IPL_DEPTH_32F,src->nChannels);
  16.         IplImage* src_fl2 = cvCreateImage(cvGetSize(src),IPL_DEPTH_32F,src->nChannels);
  17.          float a=0.0,b=0.0,c=0.0;
  18.         cvConvertScale(src,src_fl,1.0,1.0);//转换范围,所有图像元素增加1.0保证cvlog正常
  19.         cvLog(src_fl,src_fl1);
  20.         
  21.         cvSmooth(src_fl,src_fl2,CV_GAUSSIAN,0,0,sigma);        //SSR算法的核心之一,高斯模糊

  22.         cvLog(src_fl2,src_fl2);
  23.         cvSub(src_fl1,src_fl2,src_fl);//Retinex公式,Log(R(x,y))=Log(I(x,y))-Log(Gauss(I(x,y)))

  24.         //计算图像的均值、方差,SSR算法的核心之二
  25.         //使用GIMP中转换方法:使用图像的均值方差等信息进行变换
  26.         //没有添加溢出判断
  27.         CvScalar mean;
  28.         CvScalar dev;
  29.         cvAvgSdv(src_fl,&mean,&dev,NULL);//计算图像的均值和标准差
  30.         double min[3];
  31.         double max[3];
  32.         double maxmin[3];
  33.         for (int i=0;i<3;i++)
  34.         {
  35.                 min[i]=mean.val[i]-scale*dev.val[i];
  36.                 max[i]=mean.val[i]+scale*dev.val[i];
  37.                 maxmin[i]=max[i]-min[i];
  38.         }
  39.         float* data2=(float*)src_fl->imageData;
  40.         for (int i=0;i<src_fl2->width;i++)
  41.         {
  42.                 for(int j=0;j<src_fl2->height;j++)
  43.                 {
  44.                         data2[j*src_fl->widthStep/4+3*i+0]=255*(data2[j*src_fl->widthStep/4+3*i+0]-min[0])/maxmin[0];
  45.                         data2[j*src_fl->widthStep/4+3*i+1]=255*(data2[j*src_fl->widthStep/4+3*i+1]-min[1])/maxmin[1];
  46.                         data2[j*src_fl->widthStep/4+3*i+2]=255*(data2[j*src_fl->widthStep/4+3*i+2]-min[2])/maxmin[2];
  47.                 }
  48.         }


  49.         cvConvertScale(src_fl,src,1,0);
  50.         cvReleaseImage(&src_fl);
  51.         cvReleaseImage(&src_fl1);
  52.         cvReleaseImage(&src_fl2);
  53. }

  54. void main()
  55. {
  56.         char* filename="E:\\matlab\\haze20.jpg";
  57.         IplImage* frog=cvLoadImage(filename,1);
  58.         IplImage* frog1=cvCreateImage(cvGetSize(frog),IPL_DEPTH_32F,frog->nChannels);
  59.         cvConvertScale(frog,frog1,1.0/255,0);
  60.         SSR(frog,30,2);
  61.         cvNamedWindow("hi");
  62.         cvNamedWindow("hi1");
  63.         cvShowImage("hi1",frog1);
  64.         cvShowImage("hi",frog);
  65.         cvWaitKey(0);
  66.         cvDestroyAllWindows();
  67.         cvReleaseImage(&frog);
  68.         cvReleaseImage(&frog1);
  69. }

1 0