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;
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
- Opencv去除高光的算法--Highlights Removal
- 关于高光去除的几篇论文
- OpenCV基于点阵结构光的深度图三维重建算法
- iOS 4.X/5.X icon 去除高光效果
- zend studio 9 如何去除高光颜色啊
- 【Opencv】Mask影像匀光算法实现
- 【opencv】Mask影像匀光算法实现
- 引用去除(Quote Removal)
- 【opencv学习】lucas金字塔光流算法的实现——基于opencv3.0+vs2013+windows10
- 目标检测光流法(二):opencv下的光流L-K算法
- 目标检测光流法(二):opencv下的光流L-K算法
- 使用shaderMaterial实现平行光下的高光效果
- 结构光:投影仪的标定(OpenCV)
- 提供高性价比的光模块
- WOW技术-----1, 模型的高光
- opencv去除高斯噪声(H1范数)
- 基于Opencv的目标检测与跟踪阴影去除算法实现
- 图片处理的几种算法(毛玻璃效果,高斯模糊效果,旧时光效果,lomo效果,暖意效果)
- tcpdump summary
- android工程目录结构
- FAX
- js substr substring slice splice
- [LeedCode OJ]#28 Implement strStr()
- Opencv去除高光的算法--Highlights Removal
- fgets和gets fread和fgets的区别
- c++程序的内存布局
- 如何使用Linux lsblk命令列出块设备信息
- pl sql连接oracle报错12154-解决X64操作系统PL/SQL连接报错问题 make sure you have the 32 bits oracle client installed
- POJ3273-----Monthly Expense
- [leetcode-258]Add Digits(C)
- POJ 1422 (最少路径覆盖)
- C#窗体控件简介