Opencv去除高光的演算法–Highlights Removal

NO IMAGE

這篇日誌主要是根據文章“實時單幅圖片高光去除演算法”(篇一)和“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