您的位置:首页 > 其它

经纬度映射法校正鱼眼图像 程序

2015-09-02 17:52 393 查看
理论是根据《应用经纬映射的鱼眼图像校正设计方法》作者由畸变鱼眼图上像素点(i,j)得到了经纬度坐标



然后我根据这个编出来效果不对 出来是个全黑屏的figure 然后我又看了另几篇关于经纬度校正的论文 不只是像那个论文作者写的那样 有了经纬度坐标就行了 她省略了后面的一步 可能她以为我们都知道 原来还要将得到的经纬度坐标再转换成图像平面坐标 这次是按照正向映射编的 只是为了看有没校正效果 如果有校正效果 再反一下 采用反向映射编就好了

原图:



提取有效区域后的图:



经纬度校正法效果图:


可以看到我正向映射而且没有插值的有空隙点 所以需要改成反向映射 然后图左右反了 所以应该程序哪里弄反了 不过这已经比我前一段时间弄出的全黑屏好多了
至少我感觉还是有希望的

A=imread('F:\fisheye\s2.jpg');

[A,R]=kuaisusaomiao(A,40);

[m,n,k]=size(A);

for i=1:m

for j=1:n

u=j-R;

v=R-i;

r=sqrt(u^2+v^2);

if(r==0)

fi=0;

elseif(u>=0)

fi=asin(v/r);

else

fi=pi-asin(v/r);

end

f=R*2/pi;

theta=r/f;

x=f*sin(theta)*cos(fi);

y=f*sin(theta)*sin(fi);

z=f*cos(theta);

rr=sqrt(x^2+z^2);

sita=pi/2-atan(y/rr);

if(z>=0)

fai=acos(x/rr);

else

fai=pi-acos(x/rr);

end

xx=round(f*sita);

yy=round(f*fai);

if(xx<1||yy<1||xx>m||yy>n)

continue;

end

C(xx,yy,1)=A(i,j,1);

C(xx,yy,2)=A(i,j,2);

C(xx,yy,3)=A(i,j,3);

end

end

刚刚在这基础上改了下 结果:


的确是将左右重新反过来了 可是可以看到 正向映射是多对一 比如下面这一块本来是校正成黑色的物体 结果原图房子的像素 以及某块天空的像素也映射在这黑色物体上了
造成了叠加 不行

刚刚又改了改 上个改的不行 这次改的才对 结果:


这就比较好了 只有待插值的空隙点 没有之前的叠加现象

然后我用的是cubic插值 结果如下:


初步插值的效果还算行 因为我是一行一行插值的 所以像被一个东西横向碾压过一样 我再修改修改


调整了一个阈值的大小 现在这样好点了 下面黑色物体这里插值痕迹比较明显

又修改了下 结果:


这个已经比较完美了吧

经纬度算法校正还是比较快的 一下就出来图了 但是插值相对较慢 要等一下 才弹出图来

好了 全部编成M文件 现在 再拿几幅图试试经纬度校正的效果:

A=imread('F:\fisheye\s3.jpg');

>> [A,R]=kuaisusaomiao(A,40);

>> figure

>> imshow(A)

>> C=jingwei(A,R);

>> figure

>> imshow(C)

原图和校正图:





再试一个:原图和效果图:




这个的阈值我其实应该再调节小一点 下面插值的痕迹太明显了

这个经纬映射校正总体还可以 但并不是对所有的都非常适合 就像一种插值方法不可能适用于所有的图像一样 这个经纬度校正以及cubic插值也不是对所有图像都有很好的校正效果 比如下面的:

原图和效果图




可以看到
还是有变形 这可能是不适用于这幅图的原因 也可能是因为这幅图采用的鱼眼相机的视场角、焦距和我假设的不一样 我编程时是假设视场角为180 焦距f=r/theta 还假设相机采用等距投影 如果这幅图的相机不是按照我假设的这样 那么较正效果成这个样子 那我也能理解 毕竟我们学校太穷了 买不起鱼眼相机 不可能用来做实验 即使买得起 也不是给我用。。。

插值还是有点慢 我刷了会微博才出来图。。。不过 可以自己再改个快一点的插值方法就行了。

由于王志周童鞋也编过一个经纬度映射校正 理论部分和我上面编的是来自同一篇论文 他告诉我还可以在最后得到经纬度后平铺或者叫平均到一个图像平面上 然后我试了他的 即将我最后得到的经纬度做如下变换:

uu=fai/dx;

vv=sita/dy;

初步效果如下:


和我之前编的效果几乎一样!!!其实我们只是得到经纬度后的处理不一样 他是平铺到一个图像平面 而我是做下面变换:

xx=round(f*sita);

yy=round(2*R-f*fai); 因为我的之前会比原图宽一倍 全部是黑色背景 所以我做了这个变换

其实我今天又再次看了下为什么会一样的结果 发现道理其实一样的 我对经纬度的处理变换下就可以得到他那样子 同理 他的也可以简单变换下就成为我这样子

然后我对按照他平铺后的图进行再处理以及插值 结果:


结果和我之前的效果一样 本来也就应该一样

话说他的OpenCV学得真好 而我还没用OpenCV编过程序 只是学了点皮毛现在 哎
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: