《基于几何成像模型的鱼眼镜头图像校正算法和技术研究》实现

来源:互联网 发布:苹果手机数据恢复公司 编辑:程序博客网 时间:2024/05/02 12:35

这是根据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)

结果原图和校正图如下:



这是什么东西 明明按照公式写的 很简单啊  是期刊上那三个公式错了  没原理??

我觉得我没写错  这个乱七八糟的图 是公式的原因吧

阅读全文
0 0