理论部分来自《单幅圆形鱼眼图像的校正》 其实他是在《应用经纬映射的鱼眼图像校正设计方法》得到经纬度后 再采用柱面压缩 把经纬度变换到一个图像平面即可
这篇其实我早就看了 只是之前经纬度校正程序编出来是一个乱七八糟的 现在既然把经纬度校正程序弄正确了 那就可以编这篇了 其实就最后一步不一样而已
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
结果:
可以看到最后一步处理与经纬度校正不一样 导致了出来结果和上一篇有点不一样 即 图片好像横向拉伸了 之前经纬度我用原图大小可以正好装下 不会丧失原图信息 可是这个柱面压缩校正不行 原图大小不能够容下它 我再改大点试试 也不能设定不能超过原图大小的条件看来 结果如下:
可以看到柱面压缩校正的确像拉伸了一样 校正图比原图大 右边这些黑的 是因为我刚刚只改了校正部分的大小 插值那里没改 所以只把原图大小的地方插值了 我再改下 结果:
这就是王志周童鞋这篇论文中用柱面压缩校正的效果
经纬度校正和柱面压缩校正对比下: