python opencv实践 图像去畸变

前言

由于相机的镜头并不完全理想,成像时会产生线条扭曲、失真等。对双目图像、鸟瞰图等进行处理时,首先要矫正去畸变。

镜头成像畸变原因

相机的镜头前有一块透镜,由于透镜的形状,当光线穿过透镜时,靠近光轴的光线折射比远离光轴的折射要小,就会产生径向畸变,此时真实世界中的直线在图像中会被弯曲,往外弯曲是枕形畸变,如下图(b),往里弯曲是桶形畸变,如下图(c)在这里插入图片描述
由于透镜不可能完全与相机里的成像面平行,就会造成切向畸变

去畸变方法

假设归一化平面上的点P(x, y),可用极坐标(r, θ)表示,r就是P与归一化平面原点之间的距离,径向畸变就可以视为坐标点沿着距离方向发生改变,可以用畸变参数k1,k2,k3来修正;切向畸变可以看作坐标点的水平夹角发生改变。用多项式进行畸变拟合:
x d i s t o r t = x ( 1 + k 1 r 2 + k 2 r 4 + k 3 r 6 + 2 p 1 x y + p 2 ( r 2 + 2 x 2 ) ) y d i s t o r t = y ( 1 + k 1 r 2 + k 2 r 4 + k 3 r 6 + p 1 ( r 2 + 2 y 2 ) + 2 p 2 x y ) \\x_{distort} =x(1+k_1r^2+k_2r^4+k_3r^6+2p_1xy+p_2(r^2+2x^2))\\ \\y_{distort}=y(1+k_1r^2+k_2r^4+k_3r^6+p_1(r^2+2y^2)+2p_2xy)\\ xdistort=x(1+k1r2+k2r4+k3r6+2p1xy+p2(r2+2x2))ydistort=y(1+k1r2+k2r4+k3r6+p1(r2+2y2)+2p2xy)
将这些畸变后的点在像素平面上的坐标计算出来:
u = f x x d i s t o r t + c x v = f y y d i s t o r t + c y u=f_xx_{distort}+c_x\\ v=f_yy_{distort}+c_y\\ u=fxxdistort+cxv=fyydistort+cy
然后把畸变后的像素放回原本的位置,即去除了畸变。

python去畸变

输入

一张工厂灰度图,由于畸变导致部分直线条明显被弯曲了

在这里插入图片描述

代码

采用cv2.undistort(path, P, K)函数去畸变
其中img表示输入图,P是3x3 numpy数组表示相机内参,K是1x1 numpy数组表示畸变参数[k1, k2, p1, p2, k3=None, k4=None, k5=None, k6=None]

import cv2
import numpy as np

img = cv2.imread('distorted.png')
P = [[458.654, 0, 367.215],
     [0, 457.296, 248.375],
     [0, 0, 1]]
K = [-0.28340811, 0.07395907, 0.00019359, 1.76187114e-05]
img_distort = cv2.undistort(img, np.array(P), np.array(K))
img_diff = cv2.absdiff(img, img_distort)
cv2.imshow('img', img)
cv2.imshow('img_distort', img_distort)
cv2.imshow('img_absdiff', img_diff)
cv2.imwrite('distorted_res.png', img_distort)
cv2.waitKey(0)

结果

矫正后的图像如下,可见弯曲的线都恢复正常了,但原图部分像素没有还原(落在了矫正后图像的外面)
在这里插入图片描述

  • 16
    点赞
  • 85
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值