close all;clear;clc;
%以下是初始化
nTOTAL=38+32+35+37+30; %需要拼接的图片总数 具体数值见论文2.1
nMAX=[38;38+32;38+32+35;38+32+35+37;38+32+35+37+30]; %各列终点图像的编号索引值 具体数值见论文2.1
imgout=zeros(40000,25000,3,'uint8'); %初始化拼接结果图(带拼接图片均将粘贴到此张量的合适位置)
M=3648; %初始化图片尺寸 高
N=5472; %初始化图片尺寸 宽
X0_img1=16000;
Y0_img1=36000;
img1=imread('DJI_0142.JPG'); %加载第一张图 (10m图像第一张是0142,15m图像第一张是0955)
light=zeros(nTOTAL,1);
light(1)=mean(mean(rgb2gray(img1)));
imgout(Y0_img1:Y0_img1+M-1,X0_img1:X0_img1+N-1,:) = img1; %第一张图直接粘贴到结果图
record=zeros(nTOTAL,2);
record(1,:)=[X0_img1,Y0_img1];
%第一张图计算sift
SHRINK=3;
des=cell(1,nTOTAL);
loc=cell(1,nTOTAL);
[des{1}, loc{1}] = sift(rgb2gray(img1(1:SHRINK:M,1:SHRINK:N,:)));
for c=1:3
loc{1}(:,c)=SHRINK*loc{1}(:,c);
end
figure,imshow(imgout); %显示图像
%下面是循环拼接过程
collumn=1; % collumn用来记忆拼接到第几列了(collumn=1~5)
for i=1:nTOTAL-1
if nMAX(collumn)<i+1
img_first=imgout;
collumn=collumn+1;
end
%读取下一个图像 注意:15m图像序号不连续(0999接0001),这部分要改一下代码
img_name=['DJI_0' num2str(i+142) '.JPG'];
img2=imread(img_name);
% if mod(collumn,2)==0
% img2=rot90(img2,2);
% end
SHRINK=3;
while SHRINK<=5
[des{i+1}, loc{i+1}] = sift(rgb2gray(img2(1:SHRINK:M,1:SHRINK:N,:)));
%将loc的坐标、尺度增大SHRINK倍还原
for c=1:3
loc{i+1}(:,c)=SHRINK*loc{i+1}(:,c);
end
if size(loc{i+1},1)<=10000
break;
else
SHRINK=SHRINK+1;
end
end
%利用sift变换后的信息码找到图像特征点
%lastIndex是与当前图做match的图像的索引。第一列图像为竖向match,
%所以lastIndex为上一张图,其他列图像与前一列同行图像match,所以lastIndex指向当前图像左(右)边的图像
if collumn==1
lastIndex=i;
[matchLoc1, matchLoc2] = siftMatch(des{lastIndex}, loc{lastIndex},des{i+1},loc{i+1});
else
if collumn >2
s=nMAX(collumn-2)+1;
else
s=1;
end
lastIndex=nMAX(collumn-1);
while lastIndex>=s
if abs(lastIndex-(nMAX(collumn-1)-round((i+1-nMAX(collumn-1)))))>=2
lastIndex=lastIndex-1;
continue;
end
[matchLoc1, matchLoc2] = siftMatch(des{lastIndex}, loc{lastIndex},des{i+1},loc{i+1});
if size(matchLoc1,1)>=10
break;
end
lastIndex=lastIndex-1;
end
if lastIndex<s %找不到当前图像左右两侧匹配度足够高的参照图象,就把上一张图当作它的参照图象
lastIndex=i;
[matchLoc1, matchLoc2] = siftMatch(des{i}, loc{i},des{i+1},loc{i+1});
end
end
% 利用 RANSAC 算法找到单应性矩阵(homography matrix)和内点
[H, corrPtIdx] = findHomography(matchLoc2',matchLoc1');
pts1=matchLoc1';
pts2=matchLoc2';
pts1=pts1(:,corrPtIdx);%取出内点
pts2=pts2(:,corrPtIdx);
dist1=pts1';%格式转回
dist2=pts2';
record(i+1,:)=record(lastIndex,:)+round(dist1(1,:)-dist2(1,:)); %保存各个图像的绝对位置
%亮度调整
light(i+1,1)=mean(mean(rgb2gray(img2)));
if collumn>1
if mod(i-nMAX(collumn-1),2)~=0&&i~=nMAX(collumn)-1 %每隔1张图拼一次
img1=img2; %轮替下标
continue;
end
elseif mod(i,2)~=0&&i~=nMAX(collumn)-1 %每隔1张图拼一次
img1=img2; %轮替下标
continue;
end
%亮度调整
if collumn==1
img2(:,:,:)=round(img2(:,:,:)*(light(i-1,1)/light(i+1,1)));
else
img2(:,:,:)=round(img2(:,:,:)*(light(nMAX(collumn-1)-round((i+1-nMAX(collumn-1))*(nMAX(collumn-1)/nMAX(collumn)))+1)/light(i+1)));
end
%图像重合部分比例计算,以求达到渐变效果,使得图像融合更加自然
imgNext=img2; %将要被贴到结果图上的图像(当前图)
mergeRatio=500;
for j=1:M
for k=1:N
if imgout(record(i+1,2)+j-1,record(i+1,1)+k-1,2)<30||min([j,k,M-j,N-k])>mergeRatio
continue;
end
D=1-min([j,k,M-j,N-k])/mergeRatio;% 距离权重
imgNext(j,k,:) = D*imgout(record(i+1,2)+j-1,record(i+1,1)+k-1,:)+(1-D)*imgNext(j,k,:);
end
end
%粘贴操作
imgout(record(i+1,2):record(i+1,2)+M-1,record(i+1,1):record(i+1,1)+N-1,:)=imgNext(:,:,:);
% figure;imshow(imgout); %显示图像
%以下是更新轮替下标
img1=img2;
end
sift.rar 图像处理sift算法 matlab程序
需积分: 10 150 浏览量
2020-10-13
16:07:26
上传
评论 1
收藏 52KB RAR 举报
Mr_白驹
- 粉丝: 25
- 资源: 12
最新资源
- Screenshot_20240427_031602.jpg
- 网页PDF_2024年04月26日 23-46-14_QQ浏览器网页保存_QQ浏览器转格式(6).docx
- 直接插入排序,冒泡排序,直接选择排序.zip
- 在排序2的基础上,再次对快排进行优化,其次增加快排非递归,归并排序,归并排序非递归版.zip
- 实现了7种排序算法.三种复杂度排序.三种nlogn复杂度排序(堆排序,归并排序,快速排序)一种线性复杂度的排序.zip
- 冒泡排序 直接选择排序 直接插入排序 随机快速排序 归并排序 堆排序.zip
- 课设-内部排序算法比较 包括冒泡排序、直接插入排序、简单选择排序、快速排序、希尔排序、归并排序和堆排序.zip
- Python排序算法.zip
- C语言实现直接插入排序、希尔排序、选择排序、冒泡排序、堆排序、快速排序、归并排序、计数排序,并带图详解.zip
- 常用工具集参考用于图像等数据处理
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈