这个经度坐标校正的原理还是来源于之前的那篇 《鱼眼图像校正算法研究》 在进行校正时 作者提出了三个算法 这个2D的经度坐标校正是其中最简单的 效果可能没有后面两个3D校正算法效果好 但优势在于简单省时 容易用MATLAB实现
A=imread('F:\orl_zhifangtu\yuyan2.jpg');
T=40;
[A,R]=kuaisusaomiao(A,T);
[m,n,k]=size(A);
C=[];
x=n/2;
y=m/2;
for u=1:m
for v=1:n
i=u;
j=round(sqrt(R^2-(y-u)^2)*(v-x)/R+x);
if(R^2-(y-u)^2<0)
continue;
end
C(u,v,1)=A(i,j,1);
C(u,v,2)=A(i,j,2);
C(u,v,3)=A(i,j,3);
end
end
C=uint8(C);
%下面是自己编的一个插值 其实就是在一个最近区域内寻找一个最近点 来插值
for i=1:round((m-1)/2)
for j=1:round(n/2)
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)
for u=i:i+49
for v=j:j+49
I(u,v)=0.59*C(u,v,1)+0.11*C(u,v,2)+0.3*C(u,v,3);
if(I(u,v)>=T)
C(i,j,1)=C(u,v,1);
C(i,j,2)=C(u,v,2);
C(i,j,3)=C(u,v,3);
else
continue;
end
end
end
end
end
end
for i=1:round((m-1)/2)
for j=round(n/2):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)
for u=i:i+49
for v=j-49:j
I(u,v)=0.59*C(u,v,1)+0.11*C(u,v,2)+0.3*C(u,v,3);
if(I(u,v)>=T)
C(i,j,1)=C(u,v,1);
C(i,j,2)=C(u,v,2);
C(i,j,3)=C(u,v,3);
else
continue;
end
end
end
end
end
end
>> figure
>> imshow(C)
这是原图
这是快速扫描算法提取有效区域后的图
这是校正以后的图
这是用上个插值法后得到的图
然后我又用了cubic插值 看会不会比我的这个插值效果好一些 :
Y=[];
Z1=[];
Z2=[];
Z3=[];
for i=1:round((m-1)/2)
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)==0)
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
下图是效果 感觉没有那么惊艳啊 还不如我上个插值效果好
看来要找适合所有图片的插值算法还是不容易的 这个还是得改进