鱼眼相机去畸变(图像拉直/展开/矫正)算法及实战总结

03-07 1037阅读

本文介绍两种方法

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 
VPS购买请点击我

文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

目录[+]