1. 程式人生 > >matlab影象拼接融合(四種方法)

matlab影象拼接融合(四種方法)

matlab影象拼接的四種方法
 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