镜头校正(Lens shading Correct)

来源:互联网 发布:网络错误404是怎么办 编辑:程序博客网 时间:2024/05/16 05:56

没有经过镜头校正的图片如下图:
这里写图片描述
假设图片的宽为W,高为H。
由镜头透镜的特性可知图片亮度是成中心对称,按图片上的箭头方向从中心开始取值可以得到反映整幅图片亮度特征的数据L(i):

L(i)   0< i <RR = W×W + H×H

选取一个宽为3×W/4,高为3×H/4 的区域,如上图红色矩形框,计算矩形框内像素的平均亮度 M ,则M为镜头校正后图片中每个像素的目标亮度。
因此,可以得到图片中每个像素点的校正系数为
LCgain (i) = L (0)/L(i) 0< i <R

对应的校正曲线如下:
这里写图片描述
将曲线分为10段,每段采用二次方程来模拟该段曲线。

LCgain(r) = B×r + C  0<r<R/10

A、B和C为需要计算的拟合方程的系数,在每段上取三点X1(r1,LCgain1), X2(r2,LCgain2), X3(r3,LCgain3)来计算对应的方程系数,

LCgain1 = B×r1 + CLCgain2 =B×r2 + CLCgain 3=B×r3 + C

模拟曲线用绿色线条表示,如下图:
这里写图片描述
使用该校正方程对原图校正效果如下图:
这里写图片描述

对于R/Gr/Gb/B个通道分别使用不同的拟合曲线参数,每个通道可以设定10组拟合曲线参数以及对应的r区间范围(4组通道共用r区间设置),计算过程如下:
这里写图片描述

  1. 首先计算当前点与中心的距离:
    R(x, y)= (x-xref)*(x-xref)+(y-yref)*(y-yref)

  2. 由于输入点都是从左到右顺序处理,X, Y同时变化仅仅发生在换行的时候,因此可简化上述计算公式:
    R(x, y)= (x-xref)*(x-xref)+(y-yref)*(y-yref)
    R(x+1, y)=(x+1-xref)*(x+1-xref) + (y-yref)*(y-yref)
    = (x-xref)*(x-xref)+1+2*(x-xref)+(y-yref)*(y_yref)
    =R(x, y)+1+2*(x-xref)

  3. 降低R值便于后续计算,并获取对应的参数以计算增益:

R = R>>lcs_shift;   //控制R值有效位为10位if(R <RR[k+1]&&R>=RR[k])    //RR[k]参数有效位为10位,RR[0]固定为0{//获取增益参数当前像素为R通道:B=BB_R[k],  C=CC_R[k];当前像素为Gr通道:B=BB_Gr[k],  C=CC_Gr[k];当前像素为Gb通道:B=BB_Gb[k],  C=CC_Gb[k];当前像素为B通道:B=BB_B[k],  C=CC_B[k];Tmp = R – RR[k];    //tmp有效位为10位}B数据格式为8位无符号数,C数据格式为10位无符号数。gain = ((B * Tmp)>>6) +C;   if(gain>0x3ff)      //gain保留10位有效位gain = 0x3ff;RAW(R, Gr, Gb, B )= (RAW(R, Gr, Gb, B)*gain)>>8;RAW(R, Gr, Gb, B ) = (CLAMP10(RAW(R, Gr, Gb, B ) ));
原创粉丝点击