目录
1.鱼眼图像矫正原理
鱼眼镜头的成像模型通常可以用等距投影、等立体角投影或正交投影等模型来描述。这里以等距投影模型为例,在该模型下,鱼眼图像上的点 与对应的空间点的极坐标之间的关系为:
为了将鱼眼图像矫正为平面图像,需要根据上述成像模型进行反向变换。设矫正后图像上的点为(u,v),则其与鱼眼图像上点的坐标关系可以通过以下公式推导得到:
鱼眼图像存在径向畸变,通常可以用多项式函数来近似描述。假设径向畸变后的坐标为(xd,yd) ,原始无畸变坐标为(x,y),则径向畸变模型可以表示为:
在实际应用中,可以通过已知的标定板图像或其他方法来估计这些畸变系数,然后对鱼眼图像进行径向畸变校正,得到校正后的图像坐标,再进行上述的等距投影逆变换,以实现鱼眼图像的矫正。
2.Affine-sift 配准原理
尺度空间构建
极值点检测与定位
在 DOG 金字塔中,每个像素点与其相邻尺度和同一尺度的 8 个邻域像素点进行比较,检测出局部极值点。对于检测到的潜在极值点,通过泰勒展开式进行精确定位:
同时,计算该点的海森矩阵(Hessian Matrix),并根据其行列式和迹的值来去除低对比度和不稳定的边缘响应点。
方向分配
在以特征点为中心的邻域内,统计梯度方向直方图,将直方图的峰值方向作为该特征点的主方向,这样可以使特征描述符具有旋转不变性。
特征描述符生成
其中,hi是每个子区域内的梯度直方图的值,通过对特征点邻域内的像素梯度信息进行统计得到,并且对特征描述符进行归一化处理,使其具有光照不变性。
对两幅需要配准的图像(一幅经过矫正的鱼眼图像和另一幅参考图像)分别进行 SIFT 特征提取和描述符生成后,采用特征点描述符的匹配算法,如基于欧几里得距离的最近邻匹配(Nearest Neighbor Matching)。对于图像 1 中的每个特征点描述符,计算其与图像 2 中所有特征点描述符的欧几里得距离,找到距离最小的两个点,如果最近邻距离与次近邻距离的比值小于一个设定的阈值(例如 0.8),则认为这两个点是匹配的特征点对。
3.MATLAB程序
32.......................
scale=0.4;
img1=imread('test2\1.JPG');
img1R=imresize(img1,scale);
[img1] = fish_180_degree(img1R);
figure;
subplot(2,2,1),imshow(img1R);title('鱼眼图像');
subplot(2,2,2),imshow(img1);title('鱼眼图像校正');
img2=imread('test2\2.jpg');
img2R=imresize(img2,scale);
[img2] = fish_180_degree(img2R);
subplot(2,2,3),imshow(img2R);title('鱼眼图像');
subplot(2,2,4),imshow(img2);title('鱼眼图像校正');
FIG = 1;
Feature_point = 1;
%是否需要重新特征提取,%1:对以一组新的图片,需要选择1,对于同一组图片,直接设置0
sel = 1;
t = sqrt(2).^([0]);%选择不同的角度t,arccos(1/t);
%对两个图片分别进行角度选择和不同角度的特征提取
if sel == 1
tic;
disp('对图片1进行处理');
[Hrl_feature1,Hr_pointl_feature1,cnt1]=func_sift_angle(img1s,m1,n1,t);
Time = toc;
disp('对图片2进行处理');
[Hrl_feature2,Hr_pointl_feature2,cnt2]=func_sift_angle(img2s,m2,n2,t);
save feature_data_B1.mat Hrl_feature1 Hr_pointl_feature1 Hrl_feature2 Hr_pointl_feature2 cnt1 cnt2 Time
else
load feature_data_B1.mat
end
%进行配准
pp = 0;
level = 0.7;
image_match1 = [];
image_match2 = [];
for i = 1:(cnt1 - 1)
for j = 1:(cnt2 -1)
pp = pp + 1;
fprintf('处理进度:');fprintf('%3.2f',100*pp/(cnt1*cnt2));fprintf('%%\n\n');
NF1(i) = size(Hrl_feature1{i},1);
NF2(j) = size(Hrl_feature2{j},1);
same_feature = func_feature_match(Hrl_feature1{i},Hrl_feature2{j},level);
ind1 = find(same_feature);
ind2 = same_feature(ind1);
%根据门限来选择一定区域内的配准点
ind = find(sqrt(sum(((Hrl_feature1{i}(ind1,:)-Hrl_feature2{j}(ind2,:)).^2),2)) <= level);
ind1 = ind1(ind);
ind2 = ind2(ind);
Match1Tmp = Hr_pointl_feature1{i}(ind1,[ 1 2 3 end ]);
Match2Tmp = Hr_pointl_feature2{j}(ind2,[ 1 2 3 end ]);
image_match1 = [image_match1;Match1Tmp];
image_match2 = [image_match2;Match2Tmp];
end
end
4.仿真结果
5.完整程序下载
完整可运行代码,博主已上传至优快云,使用版本为matlab2022a: