這個原理還是來自於《魚眼圖像校正算法研究》 這是作者在這篇論文中提出的自己改進的算法(我姑且叫它快速掃描算法吧)
A=imread('F:\orl_zhifangtu\yuyan1.jpg');
>> T=40;
>> [m,n,k]=size(A);
for i=1:m-1
for j=1:n
I(i,j)=0.59*A(i,j,1)+0.11*A(i,j,2)+0.3*A(i,j,3);
if(I(i,j)>=T)
I(i+1,j)=0.59*A(i+1,j,1)+0.11*A(i+1,j,2)+0.3*A(i+1,j,3);
if(I(i+1,j)>=T)
bottom=j;
break;
end
end
end
end
for i=m:-1:2
for j=1:n
I(i,j)=0.59*A(i,j,1)+0.11*A(i,j,2)+0.3*A(i,j,3);
if(I(i,j)>=T)
I(i-1,j)=0.59*A(i-1,j,1)+0.11*A(i-1,j,2)+0.3*A(i-1,j,3);
if(I(i-1,j)>=T)
top=i;
break;
end
end
end
end
for j=1:n-1
for i=1:m
I(i,j)=0.59*A(i,j,1)+0.11*A(i,j,2)+0.3*A(i,j,3);
if(I(i,j)>=T)
I(i,j+1)=0.59*A(i,j+1,1)+0.11*A(i,j+1,2)+0.3*A(i,j+1,3);
if(I(i,j+1)>=T)
right=j;
break;
end
end
end
end
for j=n:-1:2
for i=1:m
I(i,j)=0.59*A(i,j,1)+0.11*A(i,j,2)+0.3*A(i,j,3);
if(I(i,j)>=T)
I(i,j-1)=0.59*A(i,j-1,1)+0.11*A(i,j-1,2)+0.3*A(i,j-1,3);
if(I(i,j-1)>=T)
left=j;
break;
end
end
end
end
>> R=max(abs((right-left)/2),abs((bottom-top)/2));
B=imcrop(A,[left,top,2*R,2*R]);
>> imshow(B)
這是效果圖
原圖是如下:
這個算法大大的節約了時間 等一秒就出來了 不像之前那個逐行逐列掃描算法和區域生長算法一樣要等那麼久
後來我又換了一幅魚眼圖 又試了下 原圖:
下面是效果圖:
提取效果還是挺好的 作者的這個算法真的比區域生長算法省了太多時間 因爲區域生長是遍歷了所有像素點 而且每次還會重複很多 而這個的次數就很少 因爲只掃描了除了這個外接正方形以外的區域 所以很省時間