资源简介
图像仿射变换的超分辨率经典程序
包括图像的配准,重建等
代码片段和文件信息
% 读入两幅图象,找出他们的特征块,然后进行匹配,最后在各匹配块之间连线以表示匹配情况
% function num = match(image1 image2)
function angle=rotation(ab)
img1=uint8(a);
img2=uint8(b);
% image1 = im2double(image1);
% H = fspecial(‘gaussian‘[3 3]1);
% image1 = conv2(image1H‘same‘);
% image1 = imnoise(image1‘salt & pepper‘ 0.02);
% 调用函数寻找每幅图象的特征点以及特征块.
% im = double(image)
% des 特征描述符
% loc 特征点坐标、角度、尺度
[im1 des1 loc1] = sift(img1);
[im2 des2 loc2] = sift(img2);
% fprintf(‘matching...‘);
%两个向量(a1a2a3...)(b1b2b3...)的距离,可以用欧基里德距离来计算:d=(a1-b1)^2+(a1-b1)^2+
%(a1-b1)^2+...也可以用d=acos(a1*b1+a2*b2+a3*b3)来计算,由于在MATLAB中后者的运算速度要远远快于前者
%所以这里用后者来计算两个特征向量之间的距离
%匹配时,用图象1里的一个向量和图象2中的所有向量进行匹配(即计算距离),那么有一个最佳匹配和一个次佳。distRatio表示
%次佳和最佳之间的比值,可以用来消除很大一部分的误配,distRatio越大=最后匹配点越多(误差越大),distRatio越小=最后
%匹配点越少(误差越小),
distRatio = 0.75;
%下面进行匹配
des2t = des2‘; % 转置
for i = 1:size(des11)
dotprods = des1(i:) * des2t; % 计算图象1中的一个向量和图象2中所有向量的距离,并进行排序
[valsindx] = sort(acos(dotprods));
% 如果最小距离小于次小距离的distRatio倍,则认为匹配成功.
if (vals(1) < 0.15) && (vals(1) < distRatio * vals(2))
match1(i) = indx(1); %匹配标记match1(i)>0表示此处匹配
else
match1(i) = 0;
end
end
%利用欧基里德距离计算,速度要慢很多
% distRatio = 0.6;
% for i = 1 : size(des11)
% error1 = [];
% for j = 1 : size(des21)
% error1 = [error1 sum(abs(des1(i:) - des2(j:)))];
% end
% [valsindx] = sort(error1);
% if (vals(1) < distRatio * vals(2))
% match1(i) = indx(1);
% else
% match1(i) = 0;
% end
% end
% 将2幅图象按一左一右放置.
%im3 = appendimages(im1im2);
% 显示图象匹配点之间的连线.其实这一步可以到最后面再做,因为下面还要先进行误配点的剔除,但是既然写在这里了,我就懒的改了,哈哈
%figure(‘Position‘ [100 100 size(im32) size(im31)]);
%colormap(‘gray‘);
%imagesc(im3);
%hold on;
cols1 = size(im12);
j = 1;
for i = 1: size(des11)
if (m
评论
共有 条评论