鱼眼全景成像是利用超广角镜头来实现全 成像的 种成像技术,这里的超广角镜头
通常指的就是鱼眼镜头。
1.1鱼眼镜头
鱼眼镜头其实是一种焦距极短并且视角接近或等于
180度
的超广角镜头,之所以称为
"鱼眼镜头",是因为它的镜片结构与真实鱼眼的结构颇为相似。
鱼眼镜头具有相当长的景深,有利于表现图像的长景深效果。鱼眼镜头有两种,一种像其他镜头一样,成像充满画面,另一种成像为圆形。
1.2成像投影模型
普通的光学镜头都遵守"相似"成像准则,即像与物总是相似的,理想的像高公式为:
式中为光学镜头的焦距
;w
为物方
半视场角
对于鱼眼成像而言,其目的就是要将半球空间中的景物成像在有限的像面上,即 趋近于
90 度
,此时
将趋近于无穷大,
即对于接近半球面的物面,像面将变得无穷 ,这
是不可能实现的
,而且
将半球面成
像为平面本身也违反了"相似"成像准则
。
为了实现鱼眼成像,即将半球物面成像在有限像面上,
需要选择适当的理想成像公
式来满足鱼眼镜头的成像要求,
一般有如下
几种投
影公式可以将半球视场或大于半球视
场的
空域投影在有限的像面上。
目前,市场上的大部分鱼眼镜头采
用的是式
等距投影模型:
图8.23
1.3鱼眼图像的矫正方法
在讨论鱼眼图像的校正方法之前,先证明理想鱼眼镜头的一个性质。如图8
-24
示,在照相机坐标系
中,以视点为球心,以照相机焦距/为球半径的球面上有
个点P(x,y,z),点P在xz平面上的投影点,为Q(u,0,w),设
代码:
from PIL import Image
import math
def fish_eye_dis(img):
"fish eye distortion"
width_in, height_in = img.size;
im_out = Image.new("RGB",(width_in,height_in));
radius = max(width_in, height_in)/2;
#assume the fov is 180
#R = f*theta
lens = radius*2/math.pi;
for i in range(width_in):
for j in range(height_in):
#offset to center
x = i - width_in/2;
y = j - height_in/2;
r = math.sqrt(x*x + y*y);
theta = math.atan(r/radius);
if theta<0.00001:
k = 1;
else:
k = lens*theta/r;
src_x = x*k;
src_y = y*k;
src_x = src_x+width_in/2;
src_y = src_y+height_in/2;
pixel = im.getpixel((src_x,src_y));
im_out.putpixel((i,j),pixel);
return im_out;
if __name__=="__main__":
input_name = "image0.jpg";
output_name = "image_dis.jpg";
im = Image.open(input_name);
img_out = fish_eye_dis(im);
img_out.save(output_name);
print "fish eye distortion completely, save image to %s" % output_name
代码来源:https://blog.csdn.net/smallflyingpig/article/details/56687436
仅作学习,详情请参考《计算摄影学基础》