matlab影象拼接融合(四種方法)
阿新 • • 發佈:2019-02-15
matlab影象拼接的四種方法
1、直接拼接,
2、亮度調整後拼接,
3、按距離比例融合,
4、亮度調整後按距離比例融合
流程:
1。讀入左,右圖,並取出重合部分,並轉化為亮度圖
2。分別把每點的亮度值相加,得到一個比值
3。把比值 乘以 右圖
特徵點匹配函式取自一個 siftDemoV4 包
1、直接拼接,
2、亮度調整後拼接,
3、按距離比例融合,
4、亮度調整後按距離比例融合
流程:
1。讀入左,右圖,並取出重合部分,並轉化為亮度圖
2。分別把每點的亮度值相加,得到一個比值
3。把比值 乘以 右圖
4。再把左 各 右圖 拼接
5。權重融合
左圖------------重合區----------------------右圖(相加)
100%-----------50%------------------------0%
0%--------------50%------------------------100%
%讀入原圖 (左 右) img1=imread('2.jpg'); img2=imread('1.jpg');
%查詢它們的SIFT特徵,並返回匹配點對---------------------特徵匹配 開始 [des1, des2] = siftMatch(img1, img2); des1=[des1(:,2),des1(:,1)];%左右(x和y)交換 % 為過濾匹配準備引數 des2=[des2(:,2),des2(:,1)];% %用 基礎矩陣F 過濾匹配的特徵點對 matchs = matchFSelect(des1, des2) %匹配位置索引(掩碼) des1=des1(matchs,:);%取出內點 des2=des2(matchs,:); % 畫出匹配特徵點的連線線(好點) drawLinedCorner(img1,des1,img2, des2) ;
1、直接拼接
[H,W,k]=size(img1);%影象大小 l_r=W-des1(1,2)+des2(1,2);%只取水平方向(第一個匹配點)重疊寬度 % 1、直接拼接------------------------------------------------- %[H,W,k]=size(img1); %l_r=405;%重疊寬度(W-寬 至 W)---如果不用特徵匹配這裡直接寫重合區寬 L=W+1-l_r;%左邊起點 R=W;%右邊尾點 n=R-L+1;%重疊寬度:就是l_r %直接拼接圖 im=[img1,img2(:,n:W,:)];%1全圖+2的後面部分 figure;imshow(im);title('直接拼接圖');
2、亮度調整後拼接
%根據之前H矩陣找到的兩幅圖的重疊(l_r)部分
A=img1(:,L:R,:);
B=img2(:,1:n,:);
%A、B 是對應在兩幅圖中的重疊區域
% A=uint8(A); figure;imshow(A);
% B=uint8(B);figure;imshow(B);
%
[ma,na,ka]=size(A);
I1=rgb2gray(A);%轉換為灰度影象
I1=double(I1);%轉換為雙精度
v1=0;
I2= rgb2gray(B);
I2=double(I2);
v2=0;
for i=1:ma
for j=1:na
%I1(i,j)=0.59*A(i,j,1)+0.11*A(i,j,2)+0.3*A(i,j,3);%按點轉化為灰度圖
v1=v1+I1(i,j);%所有亮度值相加(和)
%I2(i,j)=0.59*B(i,j,1)+0.11*B(i,j,2)+0.3*B(i,j,3);
v2=v2+I2(i,j);
end
end
%figure;imshow(I1,[]);
%figure;imshow(I2,[]);
%亮度比例,並按比例調整第二個圖
k=v1/v2;
BB2=img2(:,n:W,:)*k;%乘比值
im2=[img1,BB2];%拼接
figure;imshow(im2);title('調整亮度後拼接圖');
3、按距離比例融合
%[H,Y,t]=size(im);
C=im;%繼承前圖
D=im2;%繼承前圖(亮度)
% n=拼縫寬;
%for i=1:H %少一重迴圈
for j=1:n
d=1-(j)/n;%disp(d);% 距離權重
C(1:H,L+j,:)=d*A(1:H,j,:)+(1-d)*B(1:H,j,:);%互補融合
D(1:H,L+j,:)=d*A(1:H,j,:)+(1-d)*B(1:H,j,:)*k;
end
%end
C=uint8(C);
figure;imshow(C);title('直接融合拼接圖');%3
D=uint8(D);
figure;imshow(D);title('亮度處理後融合拼接圖');%4
4、亮度調整後按距離比例融合
完整的m檔案:
%matlab影象拼接(四種方法)
% 1、直接拼接,
% 2、亮度調整後拼接,
% 3、按距離比例融合,
% 4、亮度調整後按距離比例融合
%流程:
%1。讀入左,右圖,並取出重合部分,並轉化為亮度圖
%2。分別把每點的亮度值相加,得到一個比值
%3。把比值 乘以 右圖
%4。再把左 各 右圖 拼接
clear;close all,clc;
%讀入原圖 (左 右)
img1=imread('2.jpg');
img2=imread('1.jpg');
% figure;imshow(img1);%顯示
% figure;imshow(img2);
%查詢它們的SIFT特徵,並返回匹配點對---------------------特徵匹配 開始
[des1, des2] = siftMatch(img1, img2);
des1=[des1(:,2),des1(:,1)];%左右(x和y)交換 為基礎矩陣F 過濾匹配準備引數
des2=[des2(:,2),des2(:,1)];%
%用 基礎矩陣F 過濾匹配的特徵點對
matchs = matchFSelect(des1, des2) %匹配位置索引(掩碼)
des1=des1(matchs,:);%取出內點
des2=des2(matchs,:);
% 畫出匹配特徵點的連線線(好點)
drawLinedCorner(img1,des1,img2, des2) ;
%------------------------------------------------------特徵匹配 結束
[H,W,k]=size(img1);%影象大小
l_r=W-des1(1,2)+des2(1,2);%只取水平方向(第一個匹配點)重疊寬度
% 1、直接拼接-------------------------------------------------
%[H,W,k]=size(img1);
%l_r=405;%重疊寬度(W-寬 至 W)---如果不用特徵匹配這裡直接寫重合區寬
L=W+1-l_r;%左邊起點
R=W;%右邊尾點
n=R-L+1;%重疊寬度:就是l_r
%直接拼接圖
im=[img1,img2(:,n:W,:)];%1全圖+2的後面部分
figure;imshow(im);title('直接拼接圖');
% 2、亮度調整後拼接-------------------------------------------------
%根據之前H矩陣找到的兩幅圖的重疊(l_r)部分
A=img1(:,L:R,:);
B=img2(:,1:n,:);
%A、B 是對應在兩幅圖中的重疊區域
% A=uint8(A); figure;imshow(A);
% B=uint8(B);figure;imshow(B);
%
[ma,na,ka]=size(A);
I1=rgb2gray(A);%轉換為灰度影象
I1=double(I1);%轉換為雙精度
v1=0;
I2= rgb2gray(B);
I2=double(I2);
v2=0;
for i=1:ma
for j=1:na
%I1(i,j)=0.59*A(i,j,1)+0.11*A(i,j,2)+0.3*A(i,j,3);%按點轉化為灰度圖
v1=v1+I1(i,j);%所有亮度值相加(和)
%I2(i,j)=0.59*B(i,j,1)+0.11*B(i,j,2)+0.3*B(i,j,3);
v2=v2+I2(i,j);
end
end
%figure;imshow(I1,[]);
%figure;imshow(I2,[]);
%亮度比例,並按比例調整第二個圖
k=v1/v2;
BB2=img2(:,n:W,:)*k;%乘比值
im2=[img1,BB2];%拼接
figure;imshow(im2);title('調整亮度後拼接圖');
% 3、按距離比例融合-------------------------------------------------
% 4、亮度調整後按距離比例融合----------------------------------------
% 影象融合消除拼接縫隙
%用的漸入漸出融合即:距離權重融合
%[H,Y,t]=size(im);
C=im;%繼承前圖
D=im2;%繼承前圖(亮度)
% n=拼縫寬;
%for i=1:H %少一重迴圈
for j=1:n
d=1-(j)/n;%disp(d);% 距離權重
C(1:H,L+j,:)=d*A(1:H,j,:)+(1-d)*B(1:H,j,:);%互補融合
D(1:H,L+j,:)=d*A(1:H,j,:)+(1-d)*B(1:H,j,:)*k;
end
%end
C=uint8(C);
figure;imshow(C);title('直接融合拼接圖');%3
D=uint8(D);
figure;imshow(D);title('亮度處理後融合拼接圖');%4
特徵點匹配函式取自一個 siftDemoV4 包
matlab 7.0 執行
感謝 浮華三生 的評論!
我把siftMatch放在後面,並去掉matchFSelect函式,用上包上的findHomography函式。
先在 這裡下 http://www.cs.ubc.ca/~lowe/keypoints/siftDemoV4.zip
%查詢它們的SIFT特徵,並返回匹配點對---------------------特徵匹配 開始
[des1, des2] = siftMatch(img1, img2);
%為單應矩陣過濾匹配準備引數
pts1=des1';pts2=des2';
%單應矩陣過濾匹配
[Ht matchs] = findHomography(pts1,pts2);
pts1=pts1(:,matchs);%取出內點
pts2=pts2(:,matchs);
des1=pts1';%格式轉回
des2=pts2';
% 畫出匹配特徵點的連線線(好點)
drawLinedCorner(img1,des1,img2, des2) ;
%------------------------------------------------------特徵匹配 結束
替換前面部分
修改match函式為siftMatch:
% 此函式讀取兩幅影象,查詢它們的SIFT特徵
% 僅當匹配的距離小於與第二個最接近匹配的距離的閾值時,才接受匹配。
% 它返回兩個影象的匹配點,matchLoc1 = [x1,y1;x2,y2;...]
%
%
function [matchLoc1 matchLoc2] = siftMatch(img1, img2)
% 在每個影象查詢 SIFT 特徵點
[des1, loc1] = mosaic_sift(img1);
[des2, loc2] = mosaic_sift(img2);
% 對於MATLAB中的效率,計算單位向量之間的點乘比歐式距離更快捷。請注意:
% 注意角的比率(單位向量點積的反餘弦)是小角度的歐氏距離之比的近似值。
%
% distRatio: 在這兩隊匹配中只保留向量角從最近的第二近鄰的比值小於distRatio的。
distRatio = 0.7;
% 在第一個影象中的每個描述符,選擇它的匹配到第二個影象。
des2t = des2'; % 預計算矩陣轉置
matchTable = zeros(1,size(des1,1));
for i = 1 : size(des1,1)
dotprods = des1(i,:) * des2t; % 計算點積向量
[vals,indx] = sort(acos(dotprods)); % 取逆餘弦和排序結果
% 看看和最近的鄰居角比率小於distRatio。
if (vals(1) < distRatio * vals(2))
matchTable(i) = indx(1);
else
matchTable(i) = 0;
end
end
% 儲存匹配資料表
num = sum(matchTable > 0);
fprintf('找到 %d 對匹配點.\n', num);
idx1 = find(matchTable);
idx2 = matchTable(idx1);
x1 = loc1(idx1,2);
x2 = loc2(idx2,2);
y1 = loc1(idx1,1);
y2 = loc2(idx2,1);
matchLoc1 = [y1,x1];%把y座標放前面
matchLoc2 = [y2,x2];
end