图像畸变的校正算法
⑴ 怎么解决手机镜头畸变校正 简述怎么解决手机镜头畸变校正
1、点击对应软件。
2、点击对应设备。
3、点击右上角三个点图标。
4、下拉菜单中,点击摄像机设置。
5、界面跳转,点击画面设置。
6、在镜头畸变纠正处,点击右侧按钮即可。相机标定算法比较复杂,详情参考我的前面博客。这里不再对算法做具体解释说明,只简单介绍一下标定的方法。在OPECV中,标定有两种算法,一种是棋盘纸,类似方格子纸,一种是圆圈阵列纸,两种方法实现的原理一样,都是通过分析图像上固定角点的位置实现,取得的标定的参数也一样,下面具体实现代码,通过一个布尔变量使得我们的校正算法可以兼容棋盘和圆圈阵列两种方式。核心函数是findCirclesGrid和findChessboardCorners。
⑵ 对图像进行伽马校正
一. 伽马校正简介:
拿氏型 伽马校正用来对照相机等电子设备传感器的非线性光电转换特性进行校正。如果图像原样显示在显示器等上,画面就会显得很暗。伽马校正通过预先增大 RGB 的值来排除影响,达到对图像校正的目的。
二. 伽马校正算法:
非线性变换是由下式引起的,其中I_in和I_out 被归一化,限定在 [0,1] 范围内,c是常数,g为伽马变量,通常取 2.2。
消猜 我们只需要进行上面非线性变换的逆变换就可以进行伽马校正了,伽马校正式子如下:
三. 伽马校正python实现,其中c=1,g=2.2
import cv2
import numpy as np
import matplotlib.pyplot as plt
# gamma correction
def gamma_correction(img, c=1, g=2.2):
out = img.()
out /= 255.
out = (1/c * out) ** (1/g)
out *= 255
out = out.astype(np.uint8)
return out
# Read image
img = cv2.imread("../paojie.jpg").astype(np.float)
# Gammma correction
out = gamma_correction(img)
# Save result
cv2.imshow("result", out)
cv2.imwrite("out.jpg", out)
cv2.waitKey(0)
cv2.destroyAllWindows()
四. 实验结果:
核蚂说白了,照相机等电子设备传感器在成像时会使得图像变暗,变得不真实,我们采用伽马校正来校正图像,使得图像明亮真实。
五. 参考内容:
https://www.cnblogs.com/wojianxin/p/12511477.html
https://blog.csdn.net/Ibelievesunshine/article/details/104924723
⑶ 径向畸变达到多少需要校正
畸变矫正主要包括径向畸变和切向畸变
(1)径向畸变(枕形、桶形):光线在远离透镜中心的地方比靠近中心的地方更加弯曲
(2)切向畸变:透镜不完全平行于图像平面,即sensor装配时与镜头间的角度不准
2、径向畸变矫正原理
(1)矫正前后的坐标映射
输出图像(nJ,nI)--(宽高缩放比)->矫正后图像--(张氏标定法)->矫正前图像(输入图像(fOrgJ,fOrgI))
(2)映射到原图的坐标不一定是整数,双线性插值
举例:输出图像(3,4)映射到输入图像(5.25,6.75)
输出图像(3,4) = 输入图像取(5,6)、(5,7)、(6,6)、(6,7)四点像素值双线性插值
= 输入图像(5+0.25,6+0.75)
= (1-0.25)(1-0.75)f(5,6)+(1-0.25)*0.75*f(5,6+1)+0.25*(1-0.75)f(5+1,6)+0.25*0.75*f(5+1,6+1)
3、径向畸变矫正算法伪代码
张氏标定法
其中(u, v)代表理想无畸变(即矫正后)的像素坐标,(˘u, ˘v)代表实际径像畸变的情况下(矫正前)的像素坐标,(u0, v0)代表理想无畸变(即矫正后)的图像主点,(u1, v1)代表实际径像畸变(即矫正前)的图像主点。x, y在这里分别代表矫正后图像中(u, v)点像素分别在行向和列向与主点的距离。
(1)输入图像主点(图像中心点坐标)--(张氏标定法)->矫正后图像主点(矫正后图像宽高)--->计算输出图像与矫正后图像宽高缩放比
(2)输出图像坐标通过宽高缩放比映射到矫正后图像坐标
(3)矫正后图像坐标通过张氏标定法映射到输入图像坐标
(4)双线性插值
4、优化、加速策略
(1)双线性插值
*源图像和目标图像几何中心对齐
SrcX=(dstX+0.5)* (srcWidth/dstWidth) -0.5
SrcY=(dstY+0.5) * (srcHeight/dstHeight)-0.5
*将浮点运算转换成整数运算(除法采用移位操作)
*多线程
⑷ 如何利用opencv计算图像畸变系数,并进行校正与摄像机标定
如果知道图像,不知道相机还怎么通过相机来标定畸变?
1、只给定一张图片可以根据图像中相关特征进行标定,比如:图像中的某个物体具有直线性特点。一般是找出本来应当是直线的物体边缘,在其上取若干点,根据这些点将图像中的物体边缘重新校正为直线。简单讲就是利用: line is straight 这个原理。
2、目前最常用的张正友在1998年提出的一种标定方法,是通过二维标定板(平面标定板),根据小孔成像的原理,通过对 reprojection error 最小化进行非线性优化,来实现对相机的标定。并非根据看似高大上的训练集来标定。
当然他写这篇文章的目的不单单是为了校正畸变。畸变参数只是张正友相机标定法所求参数的一部分,即:两个径向畸变系数和两个切向畸变系数。
消除畸变的目的是让相机尽量地逼近针孔相机模型,这样相机成像时直线才会保持其直线性。一般常见的畸变校正算法都是根据这一原理来实现的。
当然,还有二般的情况。比如:图像中压根就没有直线性物体存在。我们该怎么办?还能进行标定吗?
答案是肯定的。可以利用对极约束,对图像畸变进行标定。不过,这需要至少两幅图像,而且这两幅图像必须是同一相机在短时间内拍摄得到。
⑸ 远心镜头畸变校正是什么
由于远心镜头是现实世界中的对象,它们有一定的剩余畸变,这会影响测量精度。通过一个二阶多项式能接近,畸变的计算公式为实际和预计的图像高度的不同百分比。如果我们定义从图像中心的径向距离如下:
Ra = 实际半径
Re = 预计半径
实际半径的功能是计算畸变:
dist (Ra) = (Ra - Re)/Ra = c*Raˆ2 + b*Ra + a
其中a, b和c 是恒定值,它定义畸变曲线的表现; 注意"a"通常表示零畸变,它通常是在图像的中心。在有些情况下,三阶多项式可以得到曲线完美契合。除了径向畸变外,梯形畸变也必须考虑。这种情况可以被 认为是由于光学和机械部件偏离角度的错误,其后果是图像空间和对象空间的平行线转化为会聚(或发散)。这样的状况,也称为"梯形畸变"或"薄棱镜",可以 很容易地通过相当常见的算法,计算会聚束线相互交叉的点。有趣的是,径向和梯形畸变是两个完全不同的物理现象,因此,他们可以通过两个独立的空间转换功 能,通过数学方法来随后校正。另一种方法是马上校正到合适的畸变:网格的图案是用来定义畸变的误差值,它们有区带。最终的结果是一个向量场关联到一个具体 的图像区,每个向量定义修正已被应用到的x, y坐标的图像范围内来进行测量。
有点复杂,看不懂的朋友可以找昆山慕藤光的技术工程师,他们就是做远心镜头的,知道的机器视觉知识都很全面,希望这个回答对你有帮助。
⑹ matlab图像畸变校正
你自己看这一段
for i=1:h %从理想图像矩阵出发处理
for j=1:w
x=[1,j-og(1),i-og(2),(j-og(1))^2,(i-og(2))*(j-og(1)),(i-og(2))^2];
u=x*a0+og(2); % 逆向映射(j,i)到畸变图像矩阵(v,u)
v=x*b0+og(1);
if (u>1)&&(u<w)&&(v>1)&&(v<野搜弯h) %处理在图像大小范围内的像素点
uu=floor(u); %对u取整
vv=floor(v); %对v取整
arf=u-uu; %计算上面提到的
bta=v-vv; %计算上面提到的
for k=1:3 %进行灰度双线性插值
ft1=(1-bta)*b(vv,uu,k)+bta*b(vv+1,uu,k);
ft2=(1-bta)*b(vv,uu+1,k)+bta*b(vv+1,uu+1,k);
sp(i,j,k)=(1-arf)*ft1+arf*ft2;
end
end
imshow(uint8(sp)); %显示校正图像
3个for加一个if,可只有2个end,程序都没写完当然出错。
———————————颂闷———————————————————漏中————
然后还有这一段
for k=1:n%转换到以对称点为原点的空间关系并构造矩阵A
A(k)=[1,gm(k,1)-og(1),gm(k,2)-og(2),(gm(k,1)-og(1)^2), (gm(k,1)-og(1))*(gm(k,2)-og(2)),(gm(k,2)-og(2) ^2)];
end
A(k)是一个元素,可你却把它定义为一个数组,肯定也要出错。
————————————————————————————————
你要我改,我只能保证程序能运行,但对不对我无法保证。
function gmodify(pic,uv,gm,og) %pic表示要处理的图像的路径文件名
%uv是一个二维矩阵,uv(:,1)代表上面提到的,uv(:,2)表示
%gm是一个二维矩阵,gm(j,:)代表在校正图空间上与uv(j,:)一一应的点
%og 代表对称中心,它是一个二维向量
a=imread(pic);
b=double(a);
n=size(gm(:,1));
for k=1:n%转换到以对称点为原点的空间关系并构造矩阵A
A(k,:)=[1,gm(k,1)-og(1),gm(k,2)-og(2),(gm(k,1)-og(1)^2), (gm(k,1)-og(1))*(gm(k,2)-og(2)),(gm(k,2)-og(2) ^2)];
end
[h,w]=size(b(:,:,1));
sp=zeros(h,w,3)+255;
a0=pinv(A)* uv(:,2); %计算上面提到的地址映射的系数估计a
b0=pinv(A)* uv(:,1); %计算上面中提到的地址映射的系数估计b
for i=1:h %从理想图像矩阵出发处理
for j=1:w
x=[1,j-og(1),i-og(2),(j-og(1))^2,(i-og(2))*(j-og(1)),(i-og(2))^2];
u=x*a0+og(2); % 逆向映射(j,i)到畸变图像矩阵(v,u)
v=x*b0+og(1);
if (u>1)&&(u<w)&&(v>1)&&(v<h) %处理在图像大小范围内的像素点
uu=floor(u); %对u取整
vv=floor(v); %对v取整
arf=u-uu; %计算上面提到的
bta=v-vv; %计算上面提到的
for k=1:3 %进行灰度双线性插值
ft1=(1-bta)*b(vv,uu,k)+bta*b(vv+1,uu,k);
ft2=(1-bta)*b(vv,uu+1,k)+bta*b(vv+1,uu+1,k);
sp(i,j,k)=(1-arf)*ft1+arf*ft2;
end
end
end
end
imshow(uint8(sp)); %显示校正图像