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


發佈了91 篇原創文章 · 獲贊 320 · 訪問量 53萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章