1. 程式人生 > >4.影象的空間域變換操作

4.影象的空間域變換操作

更多MATLAB影象處理視訊請點選  http://study.163.com/course/courseMain.htm?courseId=1003594013

簡單地說,影象的空間域變換操作就是為了達到某種視覺效果,變換輸入影象的畫素位置,通過把輸入影象的畫素位置對映到一個新的位置以達到改變原影象顯示效果的目的。其實,也就是變換影象的座標系統。影象的空間域變換操作包括以下幾個方面:

更多MATLAB影象處理視訊請點選  http://study.163.com/course/courseMain.htm?courseId=1003594013

• 影象插值(Interpolation)
• 影象縮放(Resizing)
• 影象旋轉(Rotation)
• 影象剪下(Cropping)

在處理影象的過程中,有時需要對影象的大小和幾何關係進行調整,比如對影象進行縮放及旋轉,這時影象中每個畫素的值都要發生變化。數字影象的座標是整數,經過這些變換
之後的座標不一定是整數,因此要對變換之後的整數座標位置的畫素值進行估計。

1. 影象插值

          影象空間域變換操作可以認為是在輸入影象和輸出影象之間進行畫素—畫素變換,然而由於我們處理的是數字影象,其重要特點就是影象的橫縱座標值是離散的,這就使得執行空間域變換操作(如縮放、旋轉等)後的輸出影象中存在畫素點無法找到其在輸入影象中的對應點,而輸入影象的畫素點經過空間域變換後也可能落在輸出影象中的無效位置上,因而輸出影象中將會出現空白點,影象失去可視性。

        為了彌補這一顯示缺陷,需要引入影象插值操作,估計畫素點之間位置的畫素值,將輸入影象和輸出影象的畫素—畫素變換在數字影象的約束下完善起來,有效地填充影象中可能出現的空白點。在下一節將要介紹的影象縮放和影象旋轉操作都將涉及到影象插值運算。

        插值是常用的數學運算,通常是利用曲線擬合的方法,通過離散的取樣點建立一個連續函式來逼近真實曲線,用這個重建的函式便可求出任意位置的函式值。

        設已知函式值為 f (u 1 , v 1 )、f (u 2 , v 2 )⋯⋯f (u n , v n ),則未知點(u 0 , v 0 )的函式值通過插值可以表示為

 

其中,h()為插值核函式,f()為權係數

            插值演算法的數值精度及計算量與插值核函式有關,插值核函式的設計是插值演算法的核心。MATLAB 影象處理工具箱提供了 3 種插值方法:最近鄰插值(Nearest Neighbor Interpolation)、雙線性插值(Bilinear Interpolation)和雙三次插值(Bicubic Interpolation)。
            使用插值操作的空間域變換操作,如影象縮放、影象旋轉及其他一些一般性變換(仿射變換、投影變換或使用者自定義變換),一般需要在其相應操作中指明所使用的插值方法作為函式引數。如未指定,則系統預設執行最近鄰插值方式。另外,針對插值操作,還需要注意以下兩個方面:

         (1)對於 RGB 影象而言,插值操作將對其 R、G、B 3 個分量分別進行。

          (2)對於二值影象,在進行雙線性插值或雙三次插值時,計算得到的畫素值可能不再是隻有 0 和 1 兩個值,結果依賴於輸入影象資料的儲存型別。如果輸入影象的儲存型別是 double型別,則輸出影象將會包括 0 和 1 以外的值;而對於 uint8 型別的輸入影象,由於在插值過程中進行了四捨五入的操作,得到的輸出影象仍為 uint8 型別的二值影象。但是,當採用最近鄰插值時,無論輸入影象資料是何種儲存型別,得到的始終都是二值影象。

       下面簡單介紹 3 種插值方法。

          1.最近鄰插值

      最近鄰插值是最簡單的插值演算法,在這種演算法中,輸出影象中每一個畫素點的值就是與該點在輸入影象中變換位置最臨近取樣點的值。該演算法的數學表示為:

            

        最近鄰插值方法的運算量非常小,是影象空間域變換操作函式預設使用的插值方法。對於索引色影象來講,它是唯一可用的插值方法。不過,最近鄰插值法的核函式頻域特性不是很好,從它的傅立葉頻譜上可以看出,它與理想低通濾波器的性質相差較大。當用這種方法實現大倍數放大處理時,在影象中會明顯看出塊狀效應。

          2、雙線性插值

           雙線性插值法的輸出畫素值是它在輸入影象中 2×2 鄰域取樣點的平均值,它根據某輸出畫素點在輸入影象變換位置周圍 4 個畫素的灰度值在水平和垂直兩個方向上對其插值,如圖所示

         設(u0,v0)是要插值點的座標,則雙線性插值的方法為:

         第一步:從f(uk,vk)及f(uk+1,vk)求f(u0,vk);

         第二步:從f(uk,vk+1)及f(uk+1,vk+1)求f(u0,vk+1)。

     把按照上式計算出來的值賦予影象的幾何變換對應於(u0,v0)處的畫素,即可實現雙線性插值。

    

    3、雙三次插值

     雙三次插值的插值核為二次函式,其插值鄰域的大小為 4×4。它的插值效果相比前兩種方法要好,但相應的計算量也較大。為了計算(u0 ,v0 )  點的畫素值,採用雙三次插值法的示意圖如

第一步,在四條水平直線上分別用三次多項式插值計算點 a、b、c、d 處的灰度值;
第二步,對 a、b、c、d4 點在垂直方向上再做 3 次多項式內插,得到(u0 ,v0 ) 點的畫素值。


2. 影象縮放

     MATLAB 影象處理工具箱中的函式 imresize 可以對影象進行縮放操作,同時指定以上所介紹的插值方法作為其函式引數,如不指定,則預設為是最近鄰插值法。

    imresize 函式的語法格式為:
    B = imresize(A, m)
    B = imresize(A,m, method)
    B = imresize(A,[mrows ncols], method)
    B = imresize(⋯,method, n)
    B = imresize(⋯,method, h)

  這些語句的功能就是按照指定的放大倍數和插值方法等引數將影象A縮放成影象B。其中,引數 m 表示放大倍數,m>1 表示影象放大,m<1 表示影象縮小;引數 method 表示選用的插值方法,其可選值為 nearest(最近鄰插值)、bilinear(雙線性插值)和 bicubic(雙三次插值)。

  B=imresize(A,[mrows ncols], method)語句通過[mrows ncols]指定了輸出影象的大小為mrows×ncols,從而達到了對原影象 A 進行指定大小縮放的目的。

  B=imresize(⋯,method, n)語句在 imresize 函式中引入了一個表徵濾波器大小的整數作為引數。在使用雙線性插值和雙三次插值法縮小影象時,為消除引入的高頻成分,imresize 在插值之前使用一個低通濾波器來減弱混疊現象,n 就是這個低通濾波器的大小,表示 n×n 的視窗,預設值為 11×11。如果 n 取值為 0,則表示忽略濾波步驟。  

  B=imresize(⋯,method, h)語句允許使用者自行指定濾波器,其中 h 表示一個二維 FIR 濾波器,例如由函式 ftrans2、fwind1、fwind2 或 fsamp2 生成的濾波器結構。

例:

A=imread('C:\Users\Administrator\Desktop\picture\MATLAB影象處理\part4\1.png');
X1=imresize(A,2);
X2=imresize(A,2,'bilinear');
X3=imresize(A,2,'bicubic');
figure,imshow(A),title('原始影象');
>> figure,imshow(X1),title('最近鄰插值法');
>> figure,imshow(X2),title('雙線性插值法');
>> figure,imshow(X3),title('雙三線性插值法');

        從以上 3 種插值方法對影象放大的結果可以看出,採用最近鄰插值法的放大影象中明顯可以看出塊狀效應,但對於質量要求不高的情況下,效果還是還可以接受的,雙線性插值法和雙三次插值法的結果則沒有塊狀效應,但雙線性插值法有些模糊,雙三次插值法效果最好。

 3.影象旋轉

         在對數字影象進行旋轉的時候,各畫素的座標將會發生變化,使得旋轉之後不能正好落在整數座標處,需要進行插值。在工具箱中的函式 imrotate 可用上述 3 種方法對影象進行插值旋轉,預設的插值方法也是最近鄰插值法。

      imrotate 的語法格式為:
      B = imrotate(A, angle)
      B = imrotate(A, angle, method)
      B = imrotate(A, angle, method, bbox)

       函式 imrotate 對影象 A 進行旋轉得到影象 B,引數 angle 用於指定影象按逆時針方向旋轉的角度,引數 method 用於指定插值的方法,可選的值為 nearest(最近鄰插值)、bilinear(雙線形插值)及 bicubic(雙三次插值),預設值為 nearest。一般來說,旋轉後的影象會比原圖大,超出原影象的部分值為 0。使用者也可以指定 crop 引數對旋轉後的影象進行剪下(取影象的中間部分),使返回的影象與原圖大小相同。

例:

A=imread('C:\Users\Administrator\Desktop\picture\MATLAB影象處理\part4\1.png');
J=imrotate(A,45,'bilinear');
figure;
imshow(A),title('原圖')
figure
imshow(J),title('旋轉之後的圖');

4.影象剪下

         當只需要處理影象中的一部分時,或者需要將某一部分取出,這樣就要對影象進行剪下。影象處理工具箱提供函式 imcrop 用於剪下影象中的一個矩形子圖,使用者可以通過引數指定這個矩形頂點的座標,也可以用滑鼠指標選取這個矩形。

         imcrop 函式的語法格式為:
       I2 = imcrop(I)
       X2 = imcrop(X,map)
       RGB2 = imcrop(RGB)
       I2 = imcrop(I,rect)
       X2 = imcrop(X,map,rect)
       RGB2 = imcrop(RGB,rect)
       [⋯] = imcrop(x,y,⋯)
       [A,rect] = imcrop(⋯)
       [x,y,A,rect] = imcrop(⋯)

       其中 I2=imcrop(I)、X2=imcrop(X, map)和 RGB2=imcrop(RGB)為互動式地對灰度影象、索 引 色 圖 像 和 真 彩 色 圖 像 進 行 剪 切 。 I2=imcrop(I,rect),X2=imcrop(X,rnap,rect) 和RGB2=imcrop(RGB,rect)按指定的矩形框 rect 剪下影象,rect 是一個四元向量[xmin ymin widthheight],分別表示矩形的左上角的座標、寬度和高度。[⋯] = imcrop(x,y,⋯)在指定座標系(x,y)中剪下影象。[A,rect]=imcrop(⋯)和[x,y,A,rect]=imcrop(⋯)在使用者手動選取剪下影象的同時返回剪下框的引數 rect。

例:

 A=imread('C:\Users\Administrator\Desktop\picture\MATLAB影象處理\part4\1.png');
 I=imcrop(A,[30 40 100 150]);
 figure,imshow(A),title('原圖');
 figure,imshow(I),title('裁剪後的圖');

例:互動式裁剪

>> A=imread('C:\Users\Administrator\Desktop\picture\MATLAB影象處理\part4\1.png');
I=imcrop(A);%互動式裁剪
>> figure,imshow(A),title('原圖');
>> figure,imshow(I),title('互動式裁剪');

更多MATLAB影象處理視訊請點選  http://study.163.com/course/courseMain.htm?courseId=1003594013