在Matlab中實現圖像的幾何變換


圖像的幾何變換,包括平移、旋轉、切變、縮放等規則的變換,還包括一些不規則的變換。主要的區別就體現在變換矩陣上。一般來說,當使用Homogeneous coordinates時,任何一個幾何變換都可以用一個三階矩陣h來表示。該矩陣有兩類,一類對應於平移、旋轉、切變、縮放等規則的變換,它的特點是第三行的第一二個元素是0,即h=

在Matlab中實現圖像的幾何變換

另一類稱為Homogeneous矩陣,即h=

在Matlab中實現圖像的幾何變換則對應於一些無法預測的變換。

可以看出,Homogeneous矩陣是最一般化的情形。

    下面的問題是如何用Matlab來實現Homogeneous矩陣變換。在很多參考書上,講到幾何變換的時候都是用Matlab中的現成函數,如平移函數、旋轉函數等,極少有直接運用矩陣的,本文則試圖做這方面的嘗試。

下面是一段Matlab代碼:

function r=translate(H,I)                               %H是homography matrix,I是輸入圖像
A=[];
[m,n,z]=size(I);
for i=1:m
    for j=1:n
        N=H*[i;j;1];  
        x=round(N(1)/N(3));
        y=round(N(2)/N(3));
        if(x>0 & y>0)                                   %N是變換后的坐標,N(1)是橫坐標,N(2)是縱坐標
        A(x,y,1)=I(i,j,1);                              %變換前后對應像素的值保持不變,red
        A(x,y,2)=I(i,j,2);                              %green
        A(x,y,3)=I(i,j,3);                              %blue
        end       

    end
end
A=uint8(A);
imshow(A)

    但是上述代碼有個問題,那就是對變換后的坐標值用了取整,這樣可能會導致圖像中出現一些黑點,影響圖像質量,一種較好的方法是利用Matlab中提供的interp2函數進行插值。部分代碼如下:

X = H \[ Xp(:) Yp(:) ones(n,1) ]';  

xI = reshape( X(1,:)./X(3,:),wp,hp);
yI = reshape( X(2,:)./X(3,:),wp,hp);
Ip(:,:,1) = interp2(double(I(:,:,1)), xI, yI, 'bilinear');                  % red
Ip(:,:,2) = interp2(double(I(:,:,2)), xI, yI, 'bilinear');                  % green
Ip(:,:,3) = interp2(double(I(:,:,3)), xI, yI, 'bilinear');                  % blue

    下面將展示一個具體例子:圖像拼接。即把兩張有部分相似的圖片拼接成一張完整的圖像。要做到這一點,首先要找出兩張圖片中相同點的對應坐標,可以利用Matlab提供的ginput函數來手動尋找(8組點);隨后,根據這8組坐標值來計算出Homogeneous矩陣H,利用的方法是最小二乘法;然后利用Homogeneous矩陣把一張圖片進行變換后疊加到另一張圖片上,拼接即告完成。下面是完整的代碼:

%Getting correspondences
I=imread('e:\uttower1.jpg');
I1=imread('e:\uttower2.jpg');
figure(1);
imshow(I);
[x,y]=ginput(8);                                            %先在I上取8個點
figure(2);
imshow(I1);
[xa,ya]=ginput(8);                                          %再在I1上取8個對應的點
%Computing the homography parameters
x1=x(1);
x2=x(2);
x3=x(3);
x4=x(4);
x5=x(5);
x6=x(6);
x7=x(7);
x8=x(8);
x1a=xa(1);
x2a=xa(2);
x3a=xa(3);
x4a=xa(4);
x5a=xa(5);
x6a=xa(6);
x7a=xa(7);
x8a=xa(8);
y1=y(1);
y2=y(2);
y3=y(3);
y4=y(4);
y5=y(5);
y6=y(6);
y7=y(7);
y8=y(8);
y1a=ya(1);
y2a=ya(2);
y3a=ya(3);
y4a=ya(4);
y5a=ya(5);
y6a=ya(6);
y7a=ya(7);
y8a=ya(8);
A=[x1,y1,1,0,0,0,-x1a*x1,-x1a*y1;                            %利用最小二乘法求H矩陣
    0,0,0,x1,y1,1,-y1a*x1,-y1a*y1;
   x2,y2,1,0,0,0,-x2a*x2,-x2a*y2;
    0,0,0,x2,y2,1,-y2a*x2,-y2a*y2;
    x3,y3,1,0,0,0,-x3a*x3,-x3a*y3;
    0,0,0,x3,y3,1,-y3a*x3,-y3a*y3;
    x4,y4,1,0,0,0,-x4a*x4,-x4a*y4;
    0,0,0,x4,y4,1,-y4a*x4,-y4a*y4;
    x5,y5,1,0,0,0,-x5a*x5,-x5a*y5;
    0,0,0,x5,y5,1,-y5a*x5,-y5a*y5;
    x6,y6,1,0,0,0,-x6a*x6,-x6a*y6;
    0,0,0,x6,y6,1,-y6a*x6,-y6a*y6;
    x7,y7,1,0,0,0,-x7a*x7,-x7a*y7;
    0,0,0,x7,y7,1,-y7a*x7,-y7a*y7;
    x8,y8,1,0,0,0,-x8a*x8,-x8a*y8;
    0,0,0,x8,y8,1,-y8a*x8,-y8a*y8];
b=[x1a;y1a;x2a;y2a;x3a;y3a;x4a;y4a;x5a;y5a;x6a;y6a;x7a;y7a;x8a;y8a];
h=A\b;
h=[h;1];                                                    %H矩陣的最后一個元素是1
H=reshape(h,3,3)';
%Warping between image planes
[h w d] = size(I);
cp = H*[ 1 1 w w ; 1 h 1 h ; 1 1 1 1 ];
Xpr = min([cp(1,:) 0]) : max([cp(1,:) w]); % min x : max x
Ypr = min([cp(2,:) 0]) : max([cp(2,:) h]); % min y : max y
[Xp,Yp] = meshgrid(Xpr,Ypr);
[wp hp] = size(Xp);
n = wp*hp;
X = H \[ Xp(:) Yp(:) ones(n,1) ]';                            %計算X=H\X'
clear Ip;
xI = reshape( X(1,:)./X(3,:),wp,hp);
yI = reshape( X(2,:)./X(3,:),wp,hp);
Ip(:,:,1) = interp2(double(I(:,:,1)), xI, yI, 'bilinear');    % red
Ip(:,:,2) = interp2(double(I(:,:,2)), xI, yI, 'bilinear');    % green
Ip(:,:,3) = interp2(double(I(:,:,3)), xI, yI, 'bilinear');    % blue
Ip=uint8(Ip);
figure(3);
imshow(Ip);                                                   %warping后的結果
%Create the output mosaic
hold on
imshow(I1);                                                   %最終結果

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM