您的位置:首页 > 编程语言 > MATLAB

《单幅圆形鱼眼图像的校正》matlab程序

2016-04-29 10:55 453 查看
声明:本文转载至http://blog.csdn.net/wd1603926823/article/details/48374369。转载至此,方便以后查阅

理论部分来自《单幅圆形鱼眼图像的校正》 其实他是在《应用经纬映射的鱼眼图像校正设计方法》得到经纬度后 再采用柱面压缩 把经纬度变换到一个图像平面即可

这篇其实我早就看了 只是之前经纬度校正程序编出来是一个乱七八糟的 现在既然把经纬度校正程序弄正确了 那就可以编这篇了 其实就最后一步不一样而已

function C=zongxiangyasuo(A,R)

%《单幅圆形鱼眼图像的校正》

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

C=zeros(m,n);

f=2*R/pi;

dx=pi/m;

dy=dx;

for i=1:m

for j=1:n

u=i-R;

v=R-j;

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

if(ro>R)

continue;

end

if(ro==0)

phi=0;

elseif(u>0)

phi=asin(v/ro);

else

phi=pi-asin(v/ro);

end

theta=ro/f;

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

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

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

vv=round(sita/dy);

if(fai>pi/2)

uu=2+sqrt(2-2*sin(fai))/sin(pi/2-atan((1-sin(fai))/abs(cos(fai))));

else

uu=2-sqrt(2-2*sin(fai))/sin(pi/2-atan((1-sin(fai))/abs(cos(fai))));

end

uu=2*R-round(uu/dx);

if(uu<1||vv<1||uu>m||vv>n)

continue;

end

C(vv,uu,1)=A(j,i,1);

C(vv,uu,2)=A(j,i,2);

C(vv,uu,3)=A(j,i,3);

end

end

C=uint8(C);

T=15;

Y=[];

Z1=[];

Z2=[];

Z3=[];

for i=1:m

for j=1:n

I(i,j)=0.59*C(i,j,1)+0.11*C(i,j,2)+0.3*C(i,j,3);

if(I(i,j)>=T)

Y=[Y j];

Z1=[Z1 C(i,j,1)];

Z2=[Z2 C(i,j,2)];

Z3=[Z3 C(i,j,3)];

end

end

if(size(Y)<3)

Y=[];

Z1=[];

Z2=[];

Z3=[];

continue;

else

for j=1:n

I(i,j)=0.59*C(i,j,1)+0.11*C(i,j,2)+0.3*C(i,j,3);

if(I(i,j)<T)

C(i,j,1)=interp1(Y,double(Z1),j,'cubic');

C(i,j,2)=interp1(Y,double(Z2),j,'cubic');

C(i,j,3)=interp1(Y,double(Z3),j,'cubic');

end

end

end

Y=[];

Z1=[];

Z2=[];

Z3=[];

end

结果:


可以看到最后一步处理与经纬度校正不一样 导致了出来结果和上一篇有点不一样 即 图片好像横向拉伸了
之前经纬度我用原图大小可以正好装下 不会丧失原图信息 可是这个柱面压缩校正不行 原图大小不能够容下它 我再改大点试试 也不能设定不能超过原图大小的条件看来 结果如下:


可以看到柱面压缩校正的确像拉伸了一样 校正图比原图大 右边这些黑的 是因为我刚刚只改了校正部分的大小
插值那里没改 所以只把原图大小的地方插值了 我再改下 结果:


这就是王志周童鞋这篇论文中用柱面压缩校正的效果

经纬度校正和柱面压缩校正对比下:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: