鱼眼相机去畸变(图像拉直/展开/矫正)算法及实战总结
本文介绍两种方法
1、经纬度矫正法
2、棋盘格矫正法
一、经纬度矫正法
1、算法说明
经纬度矫正法, 可以把鱼眼图想象成半个地球, 然后将地球展开成地图,经纬度矫正法主要是利用几何原理, 对图像进行展开矫正。
经过P点的入射光线没有透镜的话,本应交于相机成像平面的e点。然而,经过鱼眼相机的折射,光线会交于相机成像平面的d点,就产生了畸变,因此畸变图像整体上呈现出像素朝图像中心点聚集的态势。
而去畸变,就是将折射到d点的点,重新映射回到e点,因此去畸变之后的图像与原始的鱼眼图像相比,仿佛是把向心聚集的像素又重新向四周铺展开来。
详细的推导流程及公式见地址:AVM环视系统——鱼眼相机去畸变算法 - 知乎
2、 代码
import math from PIL import Image im = Image.open("/Users/Fisheye_photo-600x600.jpg") im.show() width, high = im.size sqrt_len = min(width, high) im = im.transform((sqrt_len, sqrt_len), Image.EXTENT, ((width-sqrt_len)/2, (high-sqrt_len)/2, sqrt_len+(width-sqrt_len)/2, sqrt_len+(high-sqrt_len)/2) ) width = high = sqrt_len idata = im.getdata() odata = [] alpha = math.pi/2 out_high = round(high * math.tan(alpha/2)) out_width = round(width * math.tan(alpha/2)) out_radius = round(high * math.tan(alpha/2)) out_center_x = out_width / 2 out_center_y = out_high / 2 out_bl_x = 0 out_br_x = out_width - 1 out_bt_y = 0 out_bb_y = out_high - 1 out_bl_cx = out_bl_x - out_center_x out_br_cx = out_br_x - out_center_x out_bt_cy = out_bt_y - out_center_y out_bb_cy = out_bb_y - out_center_y src_radius = round(high * math.sin(alpha/2)) src_center_x = width / 2 src_center_y = high / 2 for i in range(0, high * width): ox = math.floor(i / out_width) oy = i % out_high cx = ox - out_center_x; cy = oy - out_center_y; out_distance = round(math.sqrt(pow(cx, 2) + pow(cy, 2))) theta = math.atan2(cy, cx) if (-math.pi/4
文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。