what is the LSC?

lens shading 分为:Y-shading , color shading。

在讲LSC之前,我们先来理解一个重要的术语--CRA(Chief ray angle)。

CRA:分为lens cra , sensor cra两种。

1.1什么是lens CRA?

定义:最大像高处的主光线与光轴的倾角。备注:最大像高定义为 像素响应降低为零度角像素响应的80%的像素点。

因为Lens CRA 的存在,所以就出现了FOV (filed of view) 所谓的视角的概念。视角大小=2*CRA。

下图为lens CRA示意图。

1.2 什么是sensor的CRA

               sensor的CRA 说白了是sensor与之配对的micro lens的CRA.

圈1 表示lens折射过来的光,圈2表示micro lens再次折射的光。可以看出,sensor的光电转换二极管接收到的光并不是                 lens直接折射过来的,而是经过microlens再次折射过来的。所以你明白了什么呢?! 这也就是为什么图像边缘会变暗                   的原因,光电转换二极管并不会全部接收到光能。这是LensShading中Y-shading的主要原因。

一般情况下,当lens_cra < micro_cra的时候,在sensor传感器的边缘只会出现Y-shading。

倘若,lens_cra > micro_cra, sensor传感器可能会因为无法有效捕捉某频率的光,就会出现偏色的情况,即Color-                          shading。比如microlens 对R ,G,B的折射率不同,在R_pixel上接收了很小的能量,而在B_pixel上接受了相对较多的能                  量。

如何处理或者叫减轻shading带来的图像不均问题呢?

              1.lens cra要小于micro cra,这样既可以减缓y-shading,又可以大大避免color-shading.

              2.因为镜头是圆的,画面的对角线是最接近镜头成像直径的,所以sensor有效区域最大尺寸是对角线尺寸

3.硬件矫正

4.软件矫正(下面会细讲)

how to LSC with software?

一般模组厂会根据矫正工具将图像划分为17*13(qualcomm),15*15(MTK),33*25(Samsung)等区间,计算每一块的四通道平均值,然后对每个通道与中心块的四通道平均值做除法,得到每个点的增益倍数,整个lut存储在otp中,手机端就可以根据lut进行插值计算每个pixel的增益。

一般用双线性差值或者多项式拟合的方法,确定每个pixel的增益。

原始图片的rgb通道(节选自网络):

y-shading 增益之后,基本与中心数值在同一个平面(节选自网络):

color-shading 增益之后,各区域的r/g,b/g均值相同(节选自网络):

上面三张图片为了让大家理解,节选自网络。本人也模拟了shading矫正过程,但由于colorshading不严重所以矫正效果不明显。下面是我的矫正过程:

1.原始图:

2.三通道三维图

3.(17*13block)r,g,b平均

4.colorgain

5、lensgain=ygain+colorgain

6. 还原后三通道值

7.还原后图片

附上我的代码:

clc
clear all;
close all;
BLOCK_H = 17
BLOCK_V = 13
img = imread('1.bmp');
r= medfilt2(img(:,:,1));%中值滤波抑制边缘凸起噪声
g= medfilt2(img(:,:,2));
b= medfilt2(img(:,:,3));
figure(1)
[rows,cols,channels] = size(img);
width = 1:cols; height = 1:rows; [X1,Y1] = meshgrid(width,height);
mesh(X1,Y1,im2double(r)); hold on; mesh(X1,Y1,im2double(g)); hold on; mesh(X1,Y1,im2double(b));subSampleRGB=ones(BLOCK_V+1,BLOCK_H+1,3);%6*6*3 gainlutstrideX=floor(cols/BLOCK_H)
strideY=floor(rows/BLOCK_V)
for i=1:BLOCK_H+1%colsfor j=1:BLOCK_V+1%rowsfor k=1:3%channelsif i==1if j==1%left_topsubSampleRGB(j,i,k)=mean2( img(1:floor(strideY*0.5),                                1:floor(strideX*0.5),k) );elseif j==BLOCK_V+1 %left_bottomsubSampleRGB(j,i,k)=mean2( img(floor((BLOCK_V-0.5)*strideY):BLOCK_V*strideY,        1:floor(strideX*0.5),k) );else %left_middlesubSampleRGB(j,i,k)=mean2( img(floor((j-1-0.5)*strideY):floor((j-1+0.5)*strideY),   1:floor(strideX*0.5),k) );endelseif i==BLOCK_H+1if j==1%right_topsubSampleRGB(j,i,k)=mean2( img(1:floor(strideY*0.5),                                floor(strideX*(BLOCK_H-0.5)):BLOCK_H*strideX,k) );elseif j==BLOCK_V+1 %right_bottomsubSampleRGB(j,i,k)=mean2( img(floor((BLOCK_V-0.5)*strideY):BLOCK_V*strideY,        floor(strideX*(BLOCK_H-0.5)):BLOCK_H*strideX,k) );else %right_middlesubSampleRGB(j,i,k)=mean2( img(floor((j-1-0.5)*strideY):floor((j-1+0.5)*strideY),        floor(strideX*(BLOCK_H-0.5)):BLOCK_H*strideX,k) );endelseif j==1%top without cornerif i~=1&&i~=BLOCK_H+1subSampleRGB(j,i,k)=mean2( img(1:floor(0.5*strideY),                               floor(strideX*(i-1-0.5)):floor(strideX*(i-1+0.5)),k) );endelseif j==BLOCK_V+1%bottom without cornerif i~=1&&i~=BLOCK_H+1subSampleRGB(j,i,k)=mean2( img(floor((BLOCK_V-0.5)*strideY):BLOCK_V*strideY,       floor(strideX*(i-1-0.5)):floor(strideX*(i-1+0.5)),k));endelseif i~=1&&i~=BLOCK_H+1&&j~=1&&j~=BLOCK_V+1 %center areasubSampleRGB(j,i,k)=mean2( img(floor((j-1-0.5)*strideY):floor((j-1+0.5)*strideY),  floor(strideX*(i-1-0.5)):floor(strideX*(i-1+0.5)),k));endendendend
endfigure(2)
[A,B] = meshgrid(1:BLOCK_H+1,1:BLOCK_V+1);
mesh(A,B,subSampleRGB(:,:,1));
hold on
mesh(A,B,subSampleRGB(:,:,2));
hold on
mesh(A,B,subSampleRGB(:,:,3));%Gainlut luma gain (Y-shading gain)
gainlut=zeros(BLOCK_V+1,BLOCK_H+1,3);% gainlut
for i = 1:BLOCK_H+1for j =1:BLOCK_V+1for k = 1:3gainlut(j,i,k)=mean2( subSampleRGB(floor(BLOCK_V/2+1) : floor(BLOCK_V/2+1)+1,  floor(BLOCK_H/2+1) : floor(BLOCK_H/2+1)+1,k)) / subSampleRGB(j,i,k);endend
end%Gainlut chroma gain (colorshading gain)
gainlut_c = zeros(BLOCK_V+1,BLOCK_H+1,2);
center_RoverG = mean2( subSampleRGB(floor(BLOCK_V/2+1) : floor(BLOCK_V/2+1)+1,  floor(BLOCK_H/2+1) : floor(BLOCK_H/2+1)+1,1)) / mean2( subSampleRGB(floor(BLOCK_V/2+1) : floor(BLOCK_V/2+1)+1,  floor(BLOCK_H/2+1) : floor(BLOCK_H/2+1)+1,2));
center_BoverG = mean2( subSampleRGB(floor(BLOCK_V/2+1) : floor(BLOCK_V/2+1)+1,  floor(BLOCK_H/2+1) : floor(BLOCK_H/2+1)+1,3)) / mean2( subSampleRGB(floor(BLOCK_V/2+1) : floor(BLOCK_V/2+1)+1,  floor(BLOCK_H/2+1) : floor(BLOCK_H/2+1)+1,2));
for i = 1:BLOCK_H+1for j =1:BLOCK_V+1RoverG = subSampleRGB(j,i,1)/subSampleRGB(j,i,2);BoverG = subSampleRGB(j,i,3)/subSampleRGB(j,i,2);gainlut_c(j,i,1) = center_RoverG/RoverG-1;gainlut_c(j,i,2) = center_BoverG/BoverG-1;end
end%chroma+luma gain
gainlut_full = zeros(BLOCK_V+1,BLOCK_H+1,2);
for i = 1:BLOCK_H+1for j =1:BLOCK_V+1gainlut_full(:,:,1) = gainlut(:,:,1) + gainlut_c(j,i,1);gainlut_full(:,:,2) = gainlut(:,:,2) + gainlut_c(j,i,2);end
end%(BLOCK_H+1)*(BLOCK_V+1) colorgain
figure(3)
[C,D] = meshgrid(1:BLOCK_H+1,1:BLOCK_V+1);
mesh(C,D,gainlut_c(:,:,1))
hold on
mesh(C,D,gainlut_c(:,:,2))figure(4)
mesh(C,D,gainlut_full(:,:,1))
hold on
mesh(C,D,gainlut_full(:,:,2))
hold on
mesh(C,D,gainlut(:,:,2))%双线性插值FullGainLut
x = 1:strideX:cols+1;
x(end) = cols;
y = 1:strideY:rows+1;
y(end) = rows;xitp = 1:cols;
yitp = 1:rows;
[Xitp,Yitp]=meshgrid(xitp,yitp);
rgain=interp2(x,y,gainlut(:,:,1),Xitp,Yitp);
ggain=interp2(x,y,gainlut(:,:,2),Xitp,Yitp);
bgain=interp2(x,y,gainlut(:,:,3),Xitp,Yitp);%shading r,b,g gain
figure(5)
r=im2uint8( (im2double(r).*rgain) );
mesh(X1,Y1,im2double(r));
b=im2uint8( (im2double(b).*bgain) );
hold on
mesh(X1,Y1,im2double(b));
g=im2uint8( (im2double(g).*ggain) );
hold on
mesh(X1,Y1,im2double(g));%shading corrected img
figure(6)
lscgain = cat(3,rgain,ggain,bgain);%merge三通道gain
imgDoubleType = im2double(img);
imgDoubleType = imgDoubleType.*lscgain;
imgUint = im2uint8(imgDoubleType);
imshow(imgUint)

转载于:https://www.cnblogs.com/zhangAlin/p/10661757.html

ISP PIPLINE (二) LensShading Correct相关推荐

  1. ISP PIPLINE(零) 知识综述预热

    本文为camera isp pipline概述 ISP,即image signal processing.为图像成型做的处理工作.适应不同光学环境下图像的还原. pipline流程如下: 光通过LEN ...

  2. ISP Pipline

    ISP Pipeline 一.ISP Pipeline 名称解释 1.知乎网友回答: 2.Understanding ISP Pipeline专家回答 二.ISP 详细讲解 RAW域处理 一.ISP ...

  3. ISP【二】————camera ir图

    1. 加串解串芯片作用? A: 加串和解串是成对出现的,串行器在模组内,将并行信号转换为串行信号,然后用一根线可以实现远距离传输.sensor输出的raw data如果不加串,需要8根线传输,很难传输 ...

  4. ISP(二) Demosiac 去马赛克 (CIP)

    Demosiac是整个ISP imaging pipeline的核心算法,将Bayer pattern的图像转换成RGB. 去马赛克算法是用于从覆盖有颜色滤波器阵列(CFA)的图像传感器输出的不完整颜 ...

  5. ISP PIPLINE (一) BLC 以及 线性化

    what is the BlackLevel? 暗电流来源1.raw8为例,单个pixel的有效值是0~255,但是实际AD芯片的精度可能无法将电压值很小的一部分转换出来,芯片厂会刻意添加一个固定的偏 ...

  6. ISP PIPLINE (九_1) Denoise 之 space domain denoise

    1.空间域噪声类型 1.gauss+possion 2.椒盐噪声(dpc处理已经处理了) 去除空域噪声有哪些方法? 空域噪声一般的思想是对某pixel邻域的pixels进行加权平均. 比如 1.高斯降 ...

  7. ISP PIPLINE (九_2) Denoise 之 time domain denoise

    时域噪声是空域噪声在时间上波动的一种描述. 1.多帧平均去噪法 1.1 理论: 1.2 帧数增加,噪声减小: 1.3 IIR滤波器的效果 2.1中的两种方法在拍摄视频的时候,如果有运动物体,则会出现拖 ...

  8. isp 图像算法(二)之dead pixel correction坏点矫正

    代码在git 相机中的坏点就是那些和周围不一样的点,就是那些数值极大或者极小值点,你可以理解一张曲面的山峰或者山谷,人群中也是一样,那些与大众不一样的人就是"坏人",衡量好坏用他与 ...

  9. ISP PIPLINE (六) AWB

    What is WB(white balance)? 人的视觉和神经系统在看到白色物体的时候,基本不受环境的变化而出现严重的错觉.比如阴天,晴天,室内,室外,日光灯,白炽灯等的环境下,人依然会将白纸视 ...

最新文章

  1. 多视图立体匹配论文分享 | Fast-MVSNet (CVPR2020)
  2. 【tensorflow】重置/清除计算图
  3. Mybatis字段模糊查询
  4. 米家扫拖一体机器人重置键_全面升级——米家扫拖机器人1T体验
  5. vue base64图片不显示_技巧 | word中插入的图片显示不完整怎么办?
  6. MOSS Visual How To 系列
  7. 深入浅出学python_深入浅出Python机器学习 (段小手) 完整pdf高清版[176MB]
  8. Qt Creator下载安装以及Qt和Qt Creator的区别
  9. kali虚拟机VMBox安装
  10. C语言中fscanf()函数的用法介绍
  11. 苹果、天猫同步关停是因为发新品?这些猜想你看靠谱吗....
  12. Mel spectrum梅尔频谱与MFCCs
  13. 求水平渐近线和铅直渐近线
  14. _pickle.UnpicklingError: pickle data was truncated
  15. rs422 rs485 rs232串口转换
  16. 项目说事——信不信反正我信了(合作开发总结之文档)
  17. day 46 html 标签补充
  18. 抓取抖音数据(fiddler+uiAutomator2+java)
  19. session共享的另外一篇博客.好文章
  20. Python ——名片管理系统(增添,删除,查找,修改)

热门文章

  1. 疫情下绩效管理和奖金激励怎么做
  2. 云开发校园合伙人招募令|阿里实习生直通面试名额等你来PICK!
  3. php 黄页,PHPCMS企业黄页
  4. 【】Microsoft Dynamics CRM Server 2011 (x86 and x64) - DVD (Chinese-Simplified)
  5. 光量子领域新突破:有望打造芯片工厂!
  6. Android 高德地图给指定坐标显示图片,以及聚合显示
  7. 微信的账号连接服务器失败怎么回事,微信无法连接到服务器的原因和6个解决方法...
  8. 关于22年应届生就业难发表一些自己的想法
  9. 腾讯云企业网盘正式入驻数字工具箱
  10. 卖铲子也是一种赚钱方式