Opencv去除高光的算法--Highlights Removal

来源:互联网 发布:自动加好友软件 编辑:程序博客网 时间:2024/06/01 08:58
这篇日志主要是根据文章“实时单幅图片高光去除算法”(篇一)和“Real-time Specular Highlight Removal Using a Single Image -eccv-10-qingxiong-yang“(篇二)来写的,没有终于原文,原文在后面做的一些逼近工作或滤波工作我没有进行精确的处理,但是这是上述两片论文的基本原理。这两篇论文的最大不同在于后面最大漫反射色度的求法,两者从不同的角度进行的,但我更倾斜于第二种,因为篇一是参考篇二,其中难免借用了一些其的观点,而且我觉得篇二实现起来更符合图像处理的观点,当然篇一也有其合理之处。建议有兴趣的读者可以去看看,篇二在论坛里有得下载,或者去http://www.cs.cityu.edu.hk/~qiyang/ 下载,如要引用,请注明出处,代码如下:
 
int highlight_remove_Chi(IplImage* src,IplImage* dst,double Re)
{
          int height=src->height;
          int width=src->width;
          int step=src->widthStep;
          int i=0,j=0;
         unsigned char R,G,B,MaxC;
         double alpha,beta,alpha_r,alpha_g,alpha_b,beta_r,beta_g,beta_b,temp=0,realbeta=0,minalpha=0;
         double gama,gama_r,gama_g,gama_b;
         unsigned char* srcData;
         unsigned char* dstData;
        for (i=0;i<height;i++)
         {
              srcData=(unsigned char*)src->imageData+i*step;
              dstData=(unsigned char*)dst->imageData+i*step;
              for (j=0;j<width;j++)
               {
                     R=srcData[j*3];
                    G=srcData[j*3+1];
                    B=srcData[j*3+2];
   
                  alpha_r=(double)R/(double)(R+G+B);
                 alpha_g=(double)G/(double)(R+G+B);
                 alpha_b=(double)B/(double)(R+G+B);
                 alpha=max(max(alpha_r,alpha_g),alpha_b);
                 MaxC=max(max(R,G),B);// compute the maximum of the rgb channels
                 minalpha=min(min(alpha_r,alpha_g),alpha_b);                 beta_r=1-(alpha-alpha_r)/(3*alpha-1);
                 beta_g=1-(alpha-alpha_g)/(3*alpha-1);
                 beta_b=1-(alpha-alpha_b)/(3*alpha-1);
                 beta=max(max(beta_r,beta_g),beta_b);//将beta当做漫反射系数,则有                 // gama is used to approximiate the beta
                 gama_r=(alpha_r-minalpha)/(1-3*minalpha);
                 gama_g=(alpha_g-minalpha)/(1-3*minalpha);
                 gama_b=(alpha_b-minalpha)/(1-3*minalpha);
                 gama=max(max(gama_r,gama_g),gama_b);   
     
                 temp=(gama*(R+G+B)-MaxC)/(3*gama-1);
                 //beta=(alpha-minalpha)/(1-3*minalpha)+0.08;
                 //temp=(gama*(R+G+B)-MaxC)/(3*gama-1);
                dstData[j*3]=R-(unsigned char)(temp+0.5);
                dstData[j*3+1]=G-(unsigned char)(temp+0.5);
                dstData[j*3+2]=B-(unsigned char)(temp+0.5);   
        }
    } 
  return 1;

}下面是用上述代码做的两组实验结果,第一副为原图,第二幅为去高光后的图片,效果比较明显。



转自:http://blog.sina.com.cn/s/blog_6388b0f8010137hy.html

0 0
原创粉丝点击