基于MATLAB的摄像头

图像失真校正

上学的时候玩智能车摄像头组,从发现图像失真、到下载研究各种文档、再到写程序测试、最后实际运用,整个过程很有意思,特别是逆透视变换值得研究。下面的内容是那时候写的MATLAB结课作业,实际运用到K60单片机程序中,是用MATLAB生成图像失真的校正表和反校正表:

//用图像像素定位物理坐标X

const int16 IMG_X[ROW][COL]

//用图像像素定位物理坐标Y

const int16 IMG_Y[ROW][COL]

//物理坐标X轴反校正表  X-列   用物理坐标定位列

const int16 XY_COL[YMAX_1][XMAX2_1]

目 录

摘要

1 引言

2 图像校正理论

3 图像桶形校正

4 图像梯形校正

结束语

摘要

在机器视觉检测中大视场短焦距摄像机镜头一般都存在一定程度的光学畸变,本文以飞思卡尔智能车大赛为背景,由于摄像头光轴与地面呈一定夹角,于是其成像存在梯形失真;为了扩大视野,广角镜头越来越为很多队伍所采用,于是又存在桶形失真。MATLAB中的数字图像是以矩阵形式表示的,这意味着MATLAB强大的矩阵运算能力用于图像处理非常有利,矩阵运算的语法对MATLAB中的数字图像同样适用。本文继承了图像几何校正法坐标变换的思想精髓,简要论述了MATLAB对摄像头图像畸变失真校正原理和方法。

关键词: MATLAB 摄像头图像 失真校正

1、引言

智能车利用摄像头传感器,通过识获取别路面黑色条带状引导线实现自主导航是现阶段智能车较常用的导航方法。由于摄像头镜头为不均匀的透镜,拍摄到的图像会出一定的光学畸变,广角镜头的失真通常会很严重。摄像头所产生的失真主要是桶形失真[1],如图一。还有摄像头在拍摄图像的时候, 最理想的位置是能垂直于拍摄平面, 这样才能保证图像能按原来的几何比例重现。然而在智能车的实际运用中, 受到智能车车体结构的限制和车体控制需摄像头有一定预瞄距离的要求, 摄像头一般与地平面成一定角度安装。这种角度的存在会造成一定的成像畸变—梯形失真[2], 图像的畸变会产生一系列问题: 垂直线被拍摄成斜线导致斜率计算错误, 远处的弯道被压缩导致曲率计算错误等等。在这种情况下, 直接利用目标引导线在图像中的相对位置制定控制策略, 会造成较大的误差, 甚至使小车严重偏离导航线。针对此问题, 下面将运用MATLAB分别对桶形失真和梯形失真做校正。

图一:桶形失真                                       图二:梯形失真

2、图像校正理论

图像校正是指对失真图像进行的复原性处理。引起图像失真的原因有:成象系统的象差、畸变、带宽有限等造成的图象失真;由于成象器件拍摄姿态和扫描非线性引起的图象几何失真;由于运动模糊、辐射失真、引入噪声等造成的图像失真。图象校正的基本思路是,根据图像失真原因,建立相应的数学模型,从被污染或畸变的图象信号中提取所需要的信息,沿着使图象失真的逆过程恢复图象本来面貌。实际的复原过程是设计一个滤波器,使其能从失真图象中计算得到真实图象的估值,使其根据预先规定的误差准则,最大程度地接近真实图象。从数字图像处理的观点来考察畸变校正, 实际上是一个图像恢复的过程, 是对一幅退化了的图像进行恢复。几何畸变失真主要是表现在图像中像素点发生位移, 从而使图像中物体扭曲变形。造成这类图像退化的原因是多方面的, 而成像系统的非线性, 例如光学系统畸变像差是其中一个主要的因素。

3、图像桶形校正

文献一提出的关于几何畸变的校正研究已经比较成熟,其研究思路是:任何一种几何失真都可以用原始图像坐标和畸变图像坐标之间的关系加以描述,因而只需得到原始图像坐标和畸变图像坐标,就可以找出它们之间的对应关系,对图像进行坐标变换,从而得到校正图像[1]。下面运用这种方法在MATLAB对桶形失真做校正。

%% 镜头桶形失真校正(短焦镜头)

img_origin1 = imread('2.2.jpg');

img_origin = rgb2gray(img_origin1);

k1 = -0.000023; % 形变参数,根据实际情况调整

k2 = -0.0000037;

img_size = size( img_origin );

img_undist = zeros( img_size );

img_undist = uint8( img_undist );

for l1 = 1:img_size(1)% 垂直方向

y = l1 - img_size(1)/2;

for l2 = 1:img_size(2)% 水平方向

x = l2 - img_size(2)/2;

x1 = round( x * ( 1 + k1 * x * x + k2 * y * y ) ); %文献一公式

y1 = round( y * ( 1 + k1 * x * x + k2 * y * y ) );

y1 = y1 + img_size(1)/2;

x1 = x1 + img_size(2)/2;

y1 = uint8( y1 );

x1 = uint8( x1 );

img_undist(l1,l2) = img_origin(y1, x1);

end

end

figure(1);

subplot(121); imshow(img_origin);title('原图,60*160');

subplot(122); imshow(img_undist);title('校正图');

imwrite(img_origin,'1.bmp');

imwrite(img_undist,'2.bmp');

运行程序将输出如下图像:

图像原图中,上下原来为直线的条状物由于桶形失真变为了弯曲状,经过校正后恢复直线条状物。

4、图像梯形失真

文献三提出为实现摄像机畸变参数标定, 提出了一种基于非线性逆透视变换模型的标定新方法. 根据线性视变换模型和畸变模型推导出非线性逆透视变换模型, 以及逆透视变换参数与畸变参数之间的关系[3]。下面运用这种方法在MATLAB对梯形失真做校正。

%%首先测量四组物理坐标xy值,生成M矩阵

x1=-20;

y1=20;

u1=13;

v1=37;

x2=20;

y2=20;

u2=126;

v2=37;

x3=-30;

y3=40;

u3=8;

v3=22;

x4=30;

y4=40;

u4=132;

v4=22;

A=[u1,v1,1,0,0,0,-u1*x1,-v1*x1;0,0,0,u1,v1,1,-u1*y1,-v1*y1;u2,v2,1,0,0,0,-u2*x2,-v2*x2;0,0,0,u2,v2,1,-u2*y2,-v2*y2;

u3,v3,1,0,0,0,-u3*x3,-v3*x3;0,0,0,u3,v3,1,-u3*y3,-v3*y3;u4,v4,1,0,0,0,-u4*x4,-v4*x4;0,0,0,u4,v4,1,-u4*y4,-v4*y4];

B=[x1;y1;x2;y2;x3;y3;x4;y4];

M=A\B

M =

1.0477

0.0349

-74.1094

-0.0000

-1.8277

126.8219

-0.0000

0.0530

运行上面这段程序获得M矩阵,即摄像头的畸变参数,为下面的逆变换计算参数:

%% 镜头失真校正--逆变换

clear,clc

img_origin1 = imread('107_1.BMP'); %读取图像文件

img_origin = rgb2gray(img_origin1); %将真彩色图像转换为灰度图像二维矩阵

img_size = size( img_origin ); % 返回矩阵的行数或列数 其中r=size(A,1)该语句返回矩阵A的行数row为垂直方向

m1=1.0477; %上面程序生成的m参数

m2=0.0349;

m3=-74.1094;

m4=0;

m5=-1.8277;

m6=126.8219;

m7=0;

m8=0.0530;

u=160; % 水平方向column

v=0; % 行row为垂直方向

x=(m1*u+m2*v+m3)/(m7*u+m8*v+1);% 水平方向column

y=(m4*u+m5*v+m6)/(m7*u+m8*v+1); % 行row为垂直方向

x=uint16(x);

y=uint16(y); %本段为生成新矩阵容纳校正后的图像

img_undist = zeros(y ,x ); % zeros(m,n)产生m×n的全0矩阵 所有元素初始化为0

new_size = size(img_undist); % 返回m×n全0矩阵的行数或列数

img_undist = uint8( img_undist );

for i = 1:(img_size(1)) % 行row为垂直方向

for j = 1:(img_size(2)) % 水平方向column

u=j; % 水平方向column

v=i; % 垂直方向

x=(m1*u+m2*v+m3)/(m7*u+m8*v+1); % 水平方向column

y=(m4*u+m5*v+m6)/(m7*u+m8*v+1);% 行row为垂直方向

x=int16(x)+new_size(2)/2; %物理坐标用负,现修正显示

y=int16(y);

if(y>0 &&x>0 )

img_undist(y,x)= img_origin(i,j); %对应坐标

end

end

end

img_undist=flipud(img_undist); %矩阵以水平轴翻转

subplot(1,2,1);imshow(img_origin);title('原图,60*160');

subplot(1,2,2);imshow(img_undist);title('校正图');

运行程序将输出如下图像:

从校正图可以看出:原图两条黑线呈梯形向前方缩进;还有前方越远图像信息被压缩得越严重。

5、结束语

MATLAB是一种基于向量而不是标量的高级程序语言,因而MATLAB从本质上就提供了对图像的支持。从图像的数字化过程知道,数字图像实际上就是一组有序的离散数据,使用MATLAB可以结这些离散数据形成的矩阵进行一次整体概念。用MATLAB数字图像处理技术来实现光学系统的畸变校正, 是畸变像差校正的一种新的尝试。它非常适用于那些很难用光学像差校正方法来实现其畸变校正的光学系统。通过对它们所成的畸变图像进行校正处理, 不但能够减小图像的目视失真, 还能够使图像达到测量的要求, 做为定量分析的基础。摄像头失真使其应用受到了很大的限制,本文关于摄像头失真校正的研究,可以应用于任何一个成像系统失真的校正,,对图像识别、图像配准以及图像拼接等研究有很大的帮助,具有较高的实用价值。

[参考文献]

[1] 徐海云 王普 王广生 摄像头失真校正的研究

[2] 甄红涛 齐晓慧 白勇博 智能车摄像头图像畸变矫正的研究

[3] 李颢 杨明 基于非线性逆透视变换的摄像机畸变参数标定

matlab几何失真校正,摄像头图像失真校正相关推荐

  1. matlab怎么进行色偏校正,色偏图像的校正方法

    色偏图像的校正方法 [专利摘要]本发明提供了一种色偏图像的校正方法,其特征在于包括以下步骤:1.对色偏图像进行软分类,计算每一类图像的比例系数ρk:2.根据ρk对每一类图像进行高光提取,得到每一类图像 ...

  2. matlab使用webcam获取摄像头图像

    安装驱动https://blog.csdn.net/zzx2016zzx/article/details/82725712 使用的是matlab2016a版本,摄像头驱动需提前下载安装 1在循环中获取 ...

  3. 摄像头图像桶形畸变校正测试

    from: http://blog.csdn.net/hyanglu1573/article/details/12876727 1        桶形畸变原理 如果摄像头使用短焦距广角镜头,那么得到的 ...

  4. MATLAB基于Randon变换的图像倾斜校正算法及实现

    Radon变换的基本原理: 一个平面内沿不同的直线(直线与原点的距离为d,方向角为alfa)对f(x,y)做线积分,得到的像F(d,alfa)就是函数f的Radon变换.也就是说,平面(d,alfa) ...

  5. 倾斜校正-表格图像的校正

    方法一:直接寻找表格边框的倾斜角 如果表格中的水平边框能够很好经过预处理得到,那么通过定位这一边框.得到边框的起始点和斜率,就能得到相应的角度.通过角度就能够实现校正. 难点在于如何得到边框的起始点. ...

  6. python图像倾斜校正_python 图像倾斜校正

    图像倾斜可以分为两种情况,一种是平面倾斜,这种情况下拍照设备与试卷平行,拍出来的图像只需要进行旋转即可完成矫正:另一种是Z轴倾斜,这种情况下拍照设备与试卷存在一定的角度,拍出来的图像要先进行透视变换, ...

  7. matlab 倾斜矫正,matlab图像倾斜校正

    4 图像颜色畸变校正介绍图像颜色畸变现象可以是由摄像器材导致,也可以是由于真实环境本身就偏 色导致,还有的是由于图像放置过久氧化.老化导致.无论其产生的原因如何, 其校正方法都是类似的.如果用 Mat ...

  8. 鱼眼图像畸变校正matlab,鱼眼镜头畸变校正算法的设计

    王赛男 刘涛 左震宇 摘   要:鱼眼镜头的拍摄角度大,成像角度宽,但是在进行图像采集和成像的过程中存在大量畸变,直接使用采集而来的图像很难满足实际需求,因此需要对图像进行后续处理.本文根据摄像机参数 ...

  9. Matlab实现基于二维伽马函数的光照不均匀图像自适应校正算法

    Matlab程序: %% % 基于二维伽马函数的光照不均匀图像自适应校正算法 % %% clc,close all; tic; im=imread('你的图片.jpg'); figure; imsho ...

最新文章

  1. 面试官(7): 聊一聊 Babel?
  2. thinkPHP开发基础知识 包括变量神马的
  3. Nginx:几种负载均衡调度策略配置
  4. shell怎么把负数变成正数_excel怎么计算平方根-记住简单的收藏复杂的
  5. Spring-Cloud中的 熔断、限流、降级
  6. JetBrains又出神器啦,Fleet,体验飞一般的感觉
  7. C#发布程序添加其他程序文件
  8. 拼图登陆拼图二维码验证_另一个拼图观点
  9. Linux监控CPU关闭服务器,监控Linux服务器CPU和内存
  10. 月老在线牵盲盒/交友盲盒公众号版本1.04支持交友同城
  11. 《精通Spring 4.x 企业应用开发实战》读书笔记
  12. 如何使用Secure CRT连接到华三模拟器上和华为模拟器上(更新模拟器版本,SecureCRT版本)
  13. hdu 3183(贪心)
  14. atitit 常见个人与企业与组织机构的信息化.docx
  15. C语言从入门到放弃2022年8月2号
  16. 联想计算机 屏幕 无法进入,解决方案:联想笔记本如何进入BIOS?联想出现在计算机屏幕上。...
  17. WPS Excel快捷键
  18. 对《骨骼运动变换的数学计算过程详解》一文的理解
  19. JAva继承编写自行车例子,java – Freemarker中的继承/实例检查
  20. 新东方 词根词缀 excel_词根词缀记忆英语单词,高效,不易遗忘

热门文章

  1. 永磁同步电机——矢量控制(基于PI调节器)
  2. 如何10分钟零基础实现Web3D(在线3D模型可视化)
  3. 寻找终极流量,县镇市场+线下零售+社交零售会是什么?
  4. python实现单纯形法迭代形式(待更新人工法+对偶)
  5. 非三星手机上不能登录Galaxy wearable解决方法
  6. 对于SQL语句执行过程你确定了解吗
  7. pg_cron PostgreSQL的定时任务插件
  8. 基于python的几种中文分词-词性获取
  9. 自动化测试工具2022年排名(前10名)
  10. smali语言详解之一般/构造方法(函数)的声明与返回值关键字