相机模型详解

相机模型

数码相机图像拍摄的过程实际上是一个光学成像的过程。相机的成像过程涉及到四个坐标系:世界坐标系、相机坐标系、图像坐标系、像素坐标系以及这四个坐标系的转换。

理想透视模型——针孔成像模型

相机模型是光学成像模型的简化,目前有线性模型和非线性模型两种。实际的成像系统是透镜成像的非线性模型。最基本的透镜成像原理如图所示:


其中 u 为物距, f 为焦距,v 为相距。三者满足关系式:


相机的镜头是一组透镜,当平行于主光轴的光线穿过透镜时,会聚到一点上,这个点叫做焦点,焦点到透镜中心的距离叫做焦距 f。数码相机的镜头相当于一个凸透镜,感光元件就处在这个凸透镜的焦点附近,将焦距近似为凸透镜中心到感光元件的距离时就成为小孔成像模型。小孔成像模型如图所示。


小孔成像模型是相机成像采用最多的模型。在此模型下,物体的空间坐标和图像坐标之间是线性的关系,因而对相机参数的求解就归结到求解线性方程组上。四个坐标系的关系图如下图所示,其中 M 为三维空间点,m 为 M 在图像平面投影成的像点。


世界坐标系:是客观三维世界的绝对坐标系,也称客观坐标系。因为数码相机安放在三维空间中,我们需要世界坐标系这个基准坐标系来描述数码相机的位置,并且用它来描述安放在此三维环境中的其它任何物体的位置,用(Xw, Yw, Zw)表示其坐标值。

相机坐标系(光心坐标系):以相机的光心为坐标原点,X 轴和Y 轴分别平行于图像坐标系的 X 轴和Y 轴,相机的光轴为Z 轴,用(Xc, Yc, Zc)表示其坐标值。

图像坐标系:以CCD 图像平面的中心为坐标原点,X轴和Y 轴分别平行于图像平面的两条垂直边,用( x , y )表示其坐标值。图像坐标系是用物理单位(例如毫米)表示像素在图像中的位置。

像素坐标系:以 CCD 图像平面的左上角顶点为原点,X 轴和Y 轴分别平行于图像坐标系的 X 轴和Y 轴,用(u , v )表示其坐标值。数码相机采集的图像首先是形成标准电信号的形式,然后再通过模数转换变换为数字图像。每幅图像的存储形式是M × N的数组,M 行 N 列的图像中的每一个元素的数值代表的是图像点的灰度。这样的每个元素叫像素,像素坐标系就是以像素为单位的图像坐标系。

像素坐标系与图像坐标系的关系如图。


他们之间的转换关系为:


采用齐次坐标再用矩阵形式将上式表示为:

其中(u0, v0)是图像坐标系原点在像素坐标系中的坐标,dx dy分别是每个像素在图像平面x y方向上的物理尺寸。

图像坐标系与相机坐标系的转换为:


其中 f 为焦距(像平面与相机坐标系原点的距离)。用齐次坐标系和矩阵表示上述关系:


相机坐标系与世界坐标系的变换为:


其中 R 为3 × 3正交旋转矩阵,t 为三维平移向量,综合起来:


ax, ay分别是图像水平轴和垂直轴的尺度因子。K的参数中只包含焦距、主点坐标等只由相机的内部结构决定,因此称 K 为内部参数矩阵,ax, ay , u0, v0叫做内部参数。M1中包含的旋转矩阵和平移向量是由相机坐标系相对于世界坐标系的位置决定的,因此称M1为相机的外部参数矩阵,R和t叫做外部参数,M 叫投影矩阵相机标定就是确定相机的内部参数和外部参数。

实际成像模型

理想的透视模型是针孔成像模型,物和像会满足相似三角形的关系。但是实际上由于相机光学系统存在加工和装配的误差,透镜就并不能满足物和像成相似三角形的关系,所以相机图像平面上实际所成的像与理想成像之间会存在畸变。畸变属于成像的几何失真,是由于焦平面上不同区域对图像的放大率不同形成的画面扭曲变形的现象,这种变形的程度从画面中心至画面边缘依次递增,主要在画面边缘反映比较明显。为了减小畸变,拍摄图片时应尽量避免用镜头焦距的最广角端或最远端拍摄。实际的相机成像模型如下图所示。


其中 mr(xr,yr)表示实际投影点的像平面坐标系下的物理坐标,mi(xi,yi)表示理想投影点的像平面坐标系下的物理坐标。镜头的畸变模型可表示为:


σx 和σy是非线性畸变值,它包括径向畸变和偏心畸变和薄棱镜畸变等。

理论上来说镜头都存在径向和切向畸变,但是通常径向畸变较大,切向畸变较小。径向畸变的模型可由下面的模型来表示:

其中k1 k2 k3……示径向畸变系数,通常情况下径向畸变系数只考虑到一阶或二阶就可以满足精度需求了。

偏心畸变模型是由于多个光学镜头的光轴不能完全共线产生的,这种畸变是由径向和切向畸变共同构成的,数学模型可表示如下:


其中p1, p2为切向畸变系数。薄棱镜畸变是由于镜头设计制造缺陷和加工安装所造成的,如镜头与相机成像平面有一个很小的倾角等。因为薄棱镜畸变非常小,通常不考虑,这里只考虑径向畸变和偏心畸变,畸变总的可以表示为:


实际的成像模型为:


******************

作者:hao_09

时间:2015/8/13

文章地址:http://blog.csdn.net/lsh_2013/article/details/47615309

******************



 

  • 56
    点赞
  • 252
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
在水下成像中,物体的图像会受到水的折射、吸收、散射等多种因素的影响,从而导致图像退化。其中,背景光的影响也是不可避免的。因此,分离背景光是水下成像图像处理的一个重要步骤。 在物理模型法中,可以通过建立物理模型来描述水下成像图像的退化过程,从而实现背景光的分离。常用的物理模型有单散射模型和双散射模型。在此,我以单散射模型为例,介绍如何使用Matlab编写代码进行背景光分离。 1. 背景光建模 首先,需要将水下图像中的物体分为背景和前景,通常可以通过阈值分割或者边缘检测等方法实现。然后,将背景光建模为一个灰度值常数,记为B0。 2. 水下成像模型 水下成像模型可以表示为: I(x,y) = B(x,y) + S(x,y) + N(x,y) 其中,I(x,y)为水下图像的灰度值,B(x,y)为背景光的灰度值,S(x,y)为物体的反射光的灰度值,N(x,y)为噪声的灰度值。 3. 背景光分离 根据单散射模型,可以得到: S(x,y) = I(x,y) - B0 * exp(-αd(x,y)) 其中,α为水的吸收系数,d(x,y)为物体到相机的距离。由此可以得到: B(x,y) = B0 * exp(-αd(x,y)) 因此,可以通过求解d(x,y)来分离背景光。具体步骤如下: (1)对水下图像进行预处理,包括去噪、增强等操作,得到预处理后的图像Ip(x,y)。 (2)计算Ip(x,y)与B0 * exp(-αd(x,y))之间的误差,即E(d(x,y)) = |Ip(x,y) - B0 * exp(-αd(x,y))|。 (3)求解d(x,y),使得误差E(d(x,y))最小化。可以使用优化算法,如非线性最小二乘等方法求解。 (4)根据求解出的d(x,y),可以得到背景光B(x,y)。 4. Matlab代码实现 下面给出Matlab代码实现背景光分离的主要步骤: (1)读取水下图像,进行预处理。 ```matlab I = imread('underwater_image.jpg'); % 读取水下图像 I = im2double(I); % 归一化 I = imnoise(I, 'gaussian', 0, 0.01); % 添加高斯噪声 ``` (2)设定模型参数。 ```matlab B0 = 0.8; % 背景光灰度值常数 alpha = 0.1; % 水的吸收系数 ``` (3)计算误差函数。 ```matlab d = 0:0.1:10; % 设置距离值的范围 E = zeros(length(d), size(I, 1), size(I, 2)); % 初始化误差矩阵 for i = 1:length(d) B = B0 * exp(-alpha * d(i)); % 计算背景光 E(i, :, :) = abs(I - B); % 计算误差函数 end ``` (4)求解最小误差。 ```matlab E_sum = sum(E, 2); % 对距离维度求和 [~, idx] = min(E_sum(:)); % 找到最小误差值的索引 [d_idx, x_idx, y_idx] = ind2sub(size(E_sum), idx); % 将索引转换为坐标值 ``` (5)计算背景光。 ```matlab d_est = d(d_idx); % 得到距离估计值 B_est = B0 * exp(-alpha * d_est); % 计算背景光 ``` (6)显示结果。 ```matlab figure; subplot(1, 2, 1); imshow(I); title('原始图像'); subplot(1, 2, 2); imshow(B_est); title('背景光'); ``` 完整的Matlab代码可以参考以下代码: ```matlab I = imread('underwater_image.jpg'); % 读取水下图像 I = im2double(I); % 归一化 I = imnoise(I, 'gaussian', 0, 0.01); % 添加高斯噪声 B0 = 0.8; % 背景光灰度值常数 alpha = 0.1; % 水的吸收系数 d = 0:0.1:10; % 设置距离值的范围 E = zeros(length(d), size(I, 1), size(I, 2)); % 初始化误差矩阵 for i = 1:length(d) B = B0 * exp(-alpha * d(i)); % 计算背景光 E(i, :, :) = abs(I - B); % 计算误差函数 end E_sum = sum(E, 2); % 对距离维度求和 [~, idx] = min(E_sum(:)); % 找到最小误差值的索引 [d_idx, x_idx, y_idx] = ind2sub(size(E_sum), idx); % 将索引转换为坐标值 d_est = d(d_idx); % 得到距离估计值 B_est = B0 * exp(-alpha * d_est); % 计算背景光 figure; subplot(1, 2, 1); imshow(I); title('原始图像'); subplot(1, 2, 2); imshow(B_est); title('背景光'); ``` 注意:以上代码仅为示例,实际应用中需要根据具体情况进行修改和优化。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值