光場相機重聚焦原理介紹及代碼解析
光場相機重聚焦–焦點堆棧深度估計法
全部代碼下載地址:
https://download.csdn.net/download/weixin_38285131/10441175
光場相機主要是記錄了光線的方向和強度,記錄了四維信息,因此具有深度信息,並可以實現重聚焦等
對焦和變焦
聚焦顧名思義,就是聚焦在某一物體上,由於拍照的時候景深問題,不能使所有物體全部清楚,因此可以通過對焦或者是變焦,聚集在某一平面上,使該平面上的物體清晰。對焦就是改變傳感器與主鏡頭的距離來實現這一過程的 ,而變焦改變的是主鏡頭的焦距實現這一過程,可以自己琢磨一下就能明白。
重聚焦公式
個人理解的重聚焦就是同一條光線,當改變像面時,對新的位置進行積分所成的像
S爲成像面,重聚焦實際過程就是改變S的位置,使不同深度的圖像清楚。S’爲新的成像面,l’=alpha*l,,S’面上所成的像爲US’之間光場的積分:
對於同一根光線,有
我們可以通過他們之間關係可得:
進一步推導可得,s和s’之間的關係
將上面的式子帶入積分公式,可得:
上面的式子即爲投影到新的平面上的成像公式,擴展到四維情況,在Ng的論文中提到了:
所以重聚焦就是在空間平移然後在角度上進行積分
重聚焦代碼解析
這個重聚焦代碼是Tao給出的Matlab和C混合編譯的,這裏只有核心的部分代碼,我在這裏解釋一下。
void remapping
(
double * im_in_remap,//輸入原始的光場圖像
double * im_out_remap,//輸出映射好的光場圖像
double * output_image,//重聚焦圖像
unsigned short width,//空間分辨率的寬
unsigned short height,//空間分辨率的高
unsigned short window_side,//角度分辨率邊長或者說是微透鏡直徑
unsigned short stereo_diff,//大小等於微透鏡半徑
double alpha//alpha就是每次改變平面的alpha值,L'=alpha*L
)
{
int x,y ;//空間分辨率的長和寬
unsigned int x_1,x_2,y_1,y_2;//改變焦平面之後座標值相鄰的四個元素的左上角和右下角的像素的座標
int i,j;
double x_ind,y_ind ;//改變焦平面之後,光線落在新的焦平面上的座標值,一般有小數
double x_floor,y_floor ;
double x_1_w,x_2_w,y_1_w,y_2_w;//新的座標值離相鄰四個像素值的權重,根據距離計算
unsigned int x_1_index,x_2_index,y_1_index,y_2_index ;//相鄰四個座標的x和y座標值
unsigned int x_index_remap,y_index_remap ;//這個是Tao論文裏的關於整副原始圖像重聚焦的,可以忽略
double interp_color_R,interp_color_G,interp_color_B ;//三個通道
double output_color_R,output_color_G,output_color_B ;//重聚焦插值之後輸出的圖像
unsigned int height_of_remap, width_of_remap, pixels_of_remap;//映射完之後原始圖像高,寬,像素個數
int window_size ;//大小爲微透鏡直徑
window_size = window_side*window_side ;//微透鏡下面覆蓋的像素值個數
height_of_remap = height*window_side ;//子孔徑圖像高乘以微透鏡直徑
width_of_remap = width*window_side ;//子孔徑圖像寬乘以微透鏡個數
pixels_of_remap = height_of_remap*width_of_remap ;//映射完之後的原始圖像像素個數
for (x = 0; x < width; ++x)//從左到右從小到下進行遍歷
for (y = 0; y < height; ++y)
{
output_color_R =0;//三個通道
output_color_G =0;
output_color_B =0;
for (i = -stereo_diff; i < stereo_diff+1; ++i)//相當於u和v,角度分辨率
for (j = -stereo_diff; j < stereo_diff+1; ++j)
{
x_ind = i*(1-1/alpha) + x;//根據公式,新的焦平面上x的座標 新的座標:x+u(1-1/alpha)
y_ind = j*(1-1/alpha) + y;//同理,y座標 y+v(1-1/alpha)
x_floor = floor(x_ind);//向下取整
y_floor = floor(y_ind);
x_1 = index_x(x_floor ,width );//進行邊界判斷
y_1 = index_y(y_floor ,height);
x_2 = index_x(x_floor+1,width );
y_2 = index_y(y_floor+1,height);
x_1_w = 1-(x_ind-x_floor) ;//計算四個相鄰像素插值的權重,越近權重越大
x_2_w = 1-x_1_w ;
y_1_w = 1-(y_ind-y_floor) ;
y_2_w = 1-y_1_w ;
x_1_index = i+stereo_diff + (x_1)*window_side ;//這個是用於原始圖像重聚焦的,可以忽略
y_1_index = j+stereo_diff + (y_1)*window_side ;
x_2_index = i+stereo_diff + (x_2)*window_side ;
y_2_index = j+stereo_diff + (y_2)*window_side ;
interp_color_R = y_1_w*x_1_w*im_in_remap[y_1_index+x_1_index*height_of_remap+0*pixels_of_remap]+//對三個通道根據四個相鄰像素進行插值
y_2_w*x_1_w*im_in_remap[y_2_index+x_1_index*height_of_remap+0*pixels_of_remap]+
y_1_w*x_2_w*im_in_remap[y_1_index+x_2_index*height_of_remap+0*pixels_of_remap]+
y_2_w*x_2_w*im_in_remap[y_2_index+x_2_index*height_of_remap+0*pixels_of_remap];
interp_color_G = y_1_w*x_1_w*im_in_remap[y_1_index+x_1_index*height_of_remap+1*pixels_of_remap]+
y_2_w*x_1_w*im_in_remap[y_2_index+x_1_index*height_of_remap+1*pixels_of_remap]+
y_1_w*x_2_w*im_in_remap[y_1_index+x_2_index*height_of_remap+1*pixels_of_remap]+
y_2_w*x_2_w*im_in_remap[y_2_index+x_2_index*height_of_remap+1*pixels_of_remap];
interp_color_B = y_1_w*x_1_w*im_in_remap[y_1_index+x_1_index*height_of_remap+2*pixels_of_remap]+
y_2_w*x_1_w*im_in_remap[y_2_index+x_1_index*height_of_remap+2*pixels_of_remap]+
y_1_w*x_2_w*im_in_remap[y_1_index+x_2_index*height_of_remap+2*pixels_of_remap]+
y_2_w*x_2_w*im_in_remap[y_2_index+x_2_index*height_of_remap+2*pixels_of_remap];
// CORRESPONDENCE ANALYSIS
x_index_remap = i+stereo_diff + (x)*window_side ;
y_index_remap = j+stereo_diff + (y)*window_side ;
im_out_remap[y_index_remap + x_index_remap*height_of_remap + 0*pixels_of_remap] = interp_color_R;
im_out_remap[y_index_remap + x_index_remap*height_of_remap + 1*pixels_of_remap] = interp_color_G;
im_out_remap[y_index_remap + x_index_remap*height_of_remap + 2*pixels_of_remap] = interp_color_B;
// DEFOCUS ANALYSIS
output_color_R = interp_color_R + output_color_R;//該alpha值下各個通道計算之後的單通道圖像
output_color_G = interp_color_G + output_color_G;
output_color_B = interp_color_B + output_color_B;
}
output_image[y + x * height + 0 * height*width] = output_color_R/window_size;//三通道重聚焦圖像
output_image[y + x * height + 1 * height*width] = output_color_G/window_size;
output_image[y + x * height + 2 * height*width] = output_color_B/window_size;
}
}
注:1.Tao是用LFToolBox計算出了相機微透鏡的中心點座標,然後根據中心點和坐對原始圖像進行了重新採樣,也就是上面代碼中的im_in_remap,每個微透鏡下面以中心取radius*radius個像素,即角度分辨率個像素
2.Tao在論文裏面進行了256層重聚焦,alpha範圍爲(0.2,2),因此每一次改變焦平面,alpha值增加(2-0.2)/256
3.他輸入的中心點座標image_cords是[m,n,2],2代表橫座標,1是縱座標,這個需要注意。
結果展示
輸入的原始圖像
部分重聚焦圖像
alpha=0.2時:
alpha=0.2+(1.8/256)*78時:
alpha=2時:
參考:
1.光場成像技術研究-周志良
2.Light Field Photography with a Hand-held Plenoptic Camera–Ren-Ng
3.Depth from Combining Defocus and Correspondence Using Light-Field Cameras-W.Tao
4.https://www.cnblogs.com/riddick/p/6731130.html