《基于几何成像模型的鱼眼镜头图像校正算法和技术研究》实现
这是根据2013一个期刊上的小论文《基于几何成像模型的鱼眼镜头图像校正算法和技术研究》中的校正原理式(11)和式(12)编写的,其实这两个式子给出的是二维的校正方法,就跟之前的经度坐标校正差不多都是平面校正,所以我不知道这篇论文中给出式(6)干嘛?有什么用?还有这论文里说校正后的图像宽为w,高为h,这两个参数怎么确定呢?在没校正之前我怎么知道校正后的图像是怎样大小的?有谁知道吗,如果有,请告诉我。这里,根据这两个式子编程其实很简单,我令校正和畸变鱼眼图一样大小,即2Rx2R。
function C=jihemoxing(A,R)
%基于几何成像模型的鱼眼镜头图像校正算法和技术研究
w=2*R;
h=2*R;
xo=w/2;
yo=h/2;
f=2*R/pi;
for u=1:w
for v=1:h
ho=sqrt((u-xo)^2+(v-yo)^2);
h1=f*atan2(ho,f);
x=h1*(u-xo)/ho+xo;
y=h1*(v-yo)/ho+yo;
x=round(x);
y=round(y);
C(u,v,1)=A(x,y,1);
C(u,v,2)=A(x,y,2);
C(u,v,3)=A(x,y,3);
end
end
C=uint8(C);
这是M文件 其中A是鱼眼图,R是鱼眼图半径
实验结果如下:
A=imread('F:\orl_zhifangtu\s3.jpg');
[A,R]=kuaisusaomiao(A,40);
C=jihemoxing(A,R);
>> imshow(C)
而原畸变鱼眼图是这样的:
可以看到 用这篇论文的方法校正其实不怎么好 丢失了原图的信息 当然 这可能和我将校正后的图规定为2Rx2R有关 于是 我将M文件里的校正后的图的大小改大 改成了3Rx3R这样 重新试了下
A=imread('F:\orl_zhifangtu\s3.jpg');
[A,R]=kuaisusaomiao(A,40);
>> w=3*R;
>> h=3*R;
>> xo=w/2;
yo=h/2;
f=2*R/pi;
for u=1:w
for v=1:h
ho=sqrt((u-xo)^2+(v-yo)^2);
h1=f*atan2(ho,f);
x=h1*(u-xo)/ho+xo;
y=h1*(v-yo)/ho+yo;
x=round(x);
y=round(y);
if(x>2*R || y>2*R || x<1 || y<1)
continue;
end
C(u,v,1)=A(x,y,1);
C(u,v,2)=A(x,y,2);
C(u,v,3)=A(x,y,3);
end
end
C=uint8(C);
>> imshow(C)
结果:
所以应该不是改预设图像大小的问题 有谁知道那个wxh怎么确定的 告诉我啊
我比较了一下经度坐标校正的效果 经度坐标校正的效果如下:
这样一比较 很明显看到 这篇论文的校正效果不够好 和经度坐标校正比起来差了很多 都是尚未插值的比较的 明显看得出来 感觉是不是这个算法不好
还有一个期刊上发表的《鱼眼图像校正和配准算法研究》这上面的校正原理我觉得没交代清楚 而是直接给出了公式,从目标图像到鱼眼图像反向映射的公式(3)(4)(5),既然给出来了 那就按照这个直接写哦:
A=imread('F:\orl_zhifangtu\s3.jpg');
[A,R]=kuaisusaomiao(A,40);
[m,n,k]=size(A);
for i=1:m
for j=1:n
theta=i/R;
fi=j/R;
x=R*cos(fi)*sin(theta);
y=R*sin(fi);
z=R*cos(fi)*cos(theta);
u=R*cos(1/tan(y/x))/tan(sqrt(x^2+y^2)/z);
v=R*sin(1/tan(y/x))/tan(sqrt(x^2+y^2)/z);
u=round(u);
v=round(v);
if(u<1||v<1||u>m||v>n)
continue;
end
C(i,j,1)=A(u,v,1);
C(i,j,2)=A(u,v,2);
C(i,j,3)=A(u,v,3);
end
end
>> imshow(C)
结果原图和校正图如下:
这是什么东西 明明按照公式写的 很简单啊 是期刊上那三个公式错了 没原理??
我觉得我没写错 这个乱七八糟的图 是公式的原因吧