Matlab圖像處理工具箱用戶指南——裁剪圖像及空間變換部分翻譯


本文翻譯了Image Processing Toolbox User’s Guide(R2012b)的6-6(P222)至6-21(P237)部分。

裁剪圖像(Cropping an Image)


注意 您也可以使用交互式圖像工具Image Tool裁剪圖像——請看“使用圖像裁剪工具裁剪圖像”。


為了從圖像中提取出一部分矩形區域,可使用imcrop函數。使用imcrop,您可以使用鼠標交互來確定裁剪區域,也可以通過程序確定裁剪區域的大小和位置。

這個例子說明了交互式用法。示例讀入了一幅圖像到MATLAB工作空間里,然后以這幅圖像為參數調用imcrop函數。imcrop會在一個圖形窗口中顯示這幅圖像,並等待您在圖像上畫出裁剪矩形。當您的鼠標移動到圖像之上時,鼠標指針形狀會變為十字線┼。點擊並拖拽指針以確定裁剪區域的大小和位置。您可以使用鼠標移動和調整裁剪矩形的尺寸。當您對裁剪矩形滿意時,雙擊以完成裁剪操作,也可以在裁剪矩形內部右擊並在右鍵菜單中選擇Crop Image。imcrop返回裁剪后的圖像在J中。

I = imread('circuit.tif');

J = imcrop(I);

您也可以在調用imcrop時指定裁剪矩形的大小和位置作為參數。通過一個4元素的位置向量[xmin ymin width height]指定裁剪矩形。

在這個例子中,您調用imcrop並指定了要裁剪的圖像I和裁剪矩形。imcrop返回裁剪后的圖像保存在J中。

I = imread('circuit.tif');

J = imcrop(I,[60 40 100 90]);

進行通用二維空間變換(Perform General 2-D Spatial Transformations)

空間變換步驟(Spatial Transformation Procedure)

進行通用二維空間變換共有三步:

1 定義空間變換的參數。請看“定義變換數據”以獲取更多信息。

2 創建名為TFORM的變換結構體,定義了您想要進行的空間變換的類型。

TFORM是一個MATLAB結構體,它包含了執行變換所需的全部參數。您可以在TFORM中定義很多種空間變換,包括仿射變換,例如平移、縮放、旋轉、扭曲,透視變換和自定義變換。獲取更多信息,請參閱“Control Point Registration”。(您也可以使用cp2tform函數創建TFORM。)

3 執行變換。為完成變換,您需要將要變換的圖像和TFORM結構體傳送給imtransform函數。

下面的圖表闡釋了這個流程。

通用二維空間變換流程概觀

使用maketform和imtransform變換圖像(Translate Image Using maketform and imtransform)

這個例子說明了如何使用maketform和imtransform函數對一幅圖像進行二維空間變換。例中進行了名為平移的簡單仿射變換。在平移變換中,您通過在x坐標和y坐標上加上指定數值使圖像在空間坐標中移動。示例按照如下步驟闡明:

第1步:導入要變換的圖像(Step 1:Import the Image to Be Transformed)

將要變換的圖像導入MATLAB工作空間中。本例使用checkerboard函數創建了一幅棋盤圖像。checkerboard默認創建一幅80×80像素的圖像。

cb = checkerboard;

imshow(cb)

原始圖像

第2步:定義空間變換(Step 2:Define the Spatial Transformation)

您必須定義您想要執行的空間變換。對於很多種二維空間變換,例如仿射變換,您可以使用一個3×3的變換矩陣來指定變換。您也可以使用輸入和輸出圖像中的點集來確定變換,讓maketform自動創建變換矩陣。欲知更多,請參閱“Defining the Transformation Data”。

本例使用下列的變換矩陣來定義一個平移空間變換。

xform = [ 1  0  0

          0  1  0

         40  40  1 ];

此矩陣中,xform(3,1)指定了圖像在水平方向上移動的像素距離,xform(3,2)指定了圖像在垂直方向上移動的像素距離。

第3步:創建TFORM結構體(Create the TFORM Structure)

您需要使用maketform函數創建一個TFORM結構體。您要指定欲進行的變換的類型和已創建的定義變換的變換矩陣(或點集)作為函數的參數。更多信息請參閱“Creating TFORM Structures”。

本例調用maketform,指定’affine’作為變換類型,因為平移是仿射變換的一種,而xform是在第2步中創建的變換矩陣。

tform_translate = maketform('affine',xform);

第4步:執行變換(Step 4:Perform the Transformation)

執行變換需調用imtransform函數,並指定您要變換的圖像和存儲了所需變換參數的TFORM結構體。更多信息請看“Performing the Spatial Transformation”。

下面的例子將第1步中創建的棋盤圖像和第3步中創建的TFORM結構體傳遞給imtransform函數。imtransform返回變換后的圖像。

[cb_trans xdata ydata] = imtransform(cb, tform_translate);

例中包含兩個可選的輸出參數:xdata和ydata。這些參數返回輸出圖像在輸出坐標系下的位置。xdata包含輸出圖像角上像素點的x坐標,ydata包含這些像素點的y坐標。


注意 這章在表達像素位置時使用了空間坐標系。在空間坐標系中,x和y坐標確定了像素的中心。想要了解空間坐標系和像素坐標系間的區別,請看“Expressing Image Locations”。


下圖生動地展示了這個變換。按照慣例,輸入空間的坐標軸標注為u和v,輸出空間的坐標軸標注為x和y。在圖中,注意imtransform是怎樣改動輸入圖像中定義像素位置的空間坐標的值的。在(1,1)處的像素現在位於(41,41)。(在棋盤圖像中,每一個黑色、白色和灰色方塊是10像素高和10像素寬的。)

輸入圖像被變換

像素值和像素位置。上圖展示了imtransform是怎樣改變輸入空間和輸出空間中的像素位置的。輸入圖像中位於(1,1)的像素現在在輸出圖像中位於(41,41)。注意,不管怎樣,那個像素的值並沒有改變。像素點(1,1)在輸入圖像中是黑色的,輸出圖像中的像素點(41,41)也是黑色的。

imtransform通過將新位置映射回輸入圖像中的坐標位置(反向映射)來確定輸出圖像中像素的值。在平移中,因為輸出圖像的大小和方向與輸入圖像相同,確定新位置像素值是一個一對一的映射。對於其他類型的變換,例如縮放或旋轉,imtransform需要在輸入圖像中插值以計算輸出圖像中的像素值。查看imtransform以獲取關於支持的插值方法的信息。

第5步:查看輸出圖像(Step 5:View the Output Image)

在執行完變換之后,您或許想要查看變換后的圖像。這個示例使用了imshow函數來顯示變換后的圖像。

figure, imshow(cb_trans)

變換后圖像

理解變換后圖像的坐標。當查看變換后的圖像,特別是平移變換時,可能會有變換沒有效果的感覺。變換后的圖像看起來和原來的圖像完全一樣。然而,如果您檢查imtransform返回的xdata和ydata的值,您可以看到空間坐標已經改變了。輸入圖像左上角的坐標從(1,1)變為(41,41),輸入圖像右下角的坐標由(80,80)變為了(120,120)。每一個的值都被加上了40,就像所期望的那樣。

xdata =

41 120

ydata =

41 120

視覺上看起來沒有改變的原因是imtransform調整了輸出圖像使其正好包含整個變換后的圖像而不是整個輸出坐標空間。為了看到相對於原圖像的變換效果,您可以使用幾個可選的輸入參數以指定輸出圖像的大小和輸出圖像中要包含多少輸出空間。

示例使用了三個可選輸入參數中的兩個,XData和YData,以指定輸出坐標空間中有多少要包含在輸出圖像里。例中設置了XData和YData以包含原圖像的原點,而且足夠大以包含整個變換后的圖像。


注意 現在輸出圖像中所有在輸入圖像中沒有對應位置的像素點都是黑色的。imtransform將一個叫fill的值賦給這些像素。這個例子使用了默認的填充值,但您可以指定一個不同的值——詳見“Specifying Fill Values”。


cb_trans2 = imtransform(cb, tform_translate, ...

'XData', [1 (size(cb, 2) + xform(3, 1))], ...

'YData', [1 (size(cb, 1) + xform(3, 2))]);

figure, imshow(cb_trans2)

查看變換后的圖像與原始坐標空間的關系

定義變換數據(Defining the Transformation Data)

在您執行空間變換之前,您一定要首先定義變換的參數。下面的幾節里敘述了兩種定義空間變換的方法。

不管使用哪一種方法,您需要將結果傳遞給maketform函數以創建imtransform需要的TFORM結構體。

使用變換矩陣(Using a Transformation Matrix)

maketform函數可以接受不同大小的變換矩陣以進行N維變換。因為imtransform只進行二維變換,您可以只指定3×3變換矩陣。

例如,您可以使用一個3×3的矩陣來指定任何仿射變換。對於仿射變換,最后一列必須包含0 0 1([zeros(N, 1); 1])。您可以指定一個3×2的矩陣,這樣的話,imtransform會自動加上第三列。

下表列出了您使用imtransform可以執行的仿射變換,並列出了定義它們的變換矩陣。您可以組合多重仿射變換為一個矩陣。

仿射變換 示例 變換矩陣  
平移

tx指定沿x軸方向的位移

ty指定沿y軸方向的位移

比例

sx指定沿x軸方向的比例系數

sy指定沿y軸方向的比例系數

錯切

shx指定沿x軸方向的錯切系數

shy指定沿y軸方向的錯切系數

旋轉

q指定旋轉的角度

使用點集(Using Sets of Points)

除了指定變換矩陣,您也可以使用點集來確定變換,而讓maketform推斷出變換矩陣。

對於仿射變換來說,您必須在輸入圖像和輸出圖像中挑選出三個不共線的點。(這些點形成一個三角形。)對於投影變換,您必須選取四個點。(這些點形成一個四邊形。)

這個例子在輸入圖像中選取了三個點,在“Translate Image Using maketform and imtransform”里經過變換的輸出圖像中選取了三個點。例中將這些點傳遞給maketform,讓maketform推斷出變換矩陣。這三個點標記了輸入圖像中一個棋盤方塊和輸出圖像中同一個方塊的三個角。

inpts = [11 11; 21 11; 21 21];

outpts = [51 51; 61 51; 61 61];

tform2 = maketform('affine', inpts, outpts);

創建TFORM結構體(Creating TFORM Structures)

定義完變換數據(“Defining the Transformation Data”)之后,您必須創面一個TFORM結構體以確定空間變換。您要使用maketform函數來創建TFORM結構體。您將TFORM結構體傳遞給imtransform以執行變換。(您也可以通過cp2tform函數創建TFORM。)

示例創建了指定變換所需參數的TFORM結構體。

tform_translate = maketform('affine', xform);

要創建TFORM,您必須指定欲執行的變換類型並傳遞進變換數據。例中指定了’affine’作為變換類型,因為這是一個仿射變換,但是maketform也支持投影變換。另外,通過使用custom和composite選項,您可以指定一個幾乎沒有限制的空間變換類型用於imtransform。下表列出了maketform支持的變換類型。

變換類型 描述
‘affine’
仿射變換

包括平移、旋轉、比例和錯切。變換后,直線仍是直線,平行線保持平行,但矩形有可能變為平行四邊形。

‘projective’
透視變換

變換后,直線仍是直線,但平行線變成匯聚指向滅點。(滅點可以在圖像內或圖像外——甚至在無窮遠點。)

‘box’

仿射變換的特例,每一維獨立進行平移和比例操作。

‘custom’

用戶自定義變換,提供被imtransform調用的正映射和反映射函數。

‘composite’

兩種或更多種變換的合成。

執行空間變換(Performing the Spatial Transformation)

一旦你在TFORM里指定了變換,您就可以通過調用imtransform來執行變換。imtransform函數在輸入圖像的坐標上執行指定的變換並生成輸出圖像。

變換示例中調用了imtransform以執行變換,將要變換的圖像和TFORM結構體傳遞給了它。imtransform返回變換后的圖像。

cb_trans = imtransform(cb, tform_translate);

imtransform支持幾個可選輸入參數,您可以通過它們來控制變換的幾個方面,例如輸出圖像的大小和使用的填充值。要看使用XData和YData輸入參數的例子,請看“Register Image Using XData and YData”。更多關於填充值的信息見“Specifying Fill Values”。

指定填充值(Specifying Fill Values)

當執行變換時,輸出圖像中時常有像素不是原始輸入圖像的一部分。這些像素必須被賦予一些值,叫做填充值。默認情況下,imtransform將這些像素設為0,顯示出來是黑色的。在imtransform中使用FillValues參數,您可以指定一個其它的顏色。

灰度圖。如果要變換的圖像是灰度圖,您必須指定一個標量值以確定灰度的明暗。

例如,在“第5步:查看輸出圖像”中,示例顯示了相對於原始坐標空間的變換后的棋盤圖像,您可以指定灰色方塊顏色的值作為填充值,而不是默認的黑色。

cb_fill = imtransform(cb, tform_translate, ...

'XData', [1 (size(cb, 2) + xform(3, 1))], ...

'YData', [1 (size(cb, 1) + xform(3, 2))], ...

'FillValues', .7);

figure, imshow(cb_fill)

用灰色填充值的變換后圖像

彩色圖像。 如果要變換的圖像是彩色圖像,您可以使用標量值或者1×3向量。如果您指定標量,imtransform對彩色圖像的每一個色彩平面使用其對應的明暗值。如果您指定一個1×3向量,imtransform將其解釋為RGB顏色值。

例如,這段代碼變換一幅彩色圖像,指定了一個彩色值作為填充值。例子指定了一種淡綠色的顏色值作為填充值。

rgb = imread('onion.png');

xform = [ 1  0  0

          0  1  0

         40  40  1 ];

tform_translate = maketform('affine', xform);

cb_rgb = imtransform(rgb, tform_translate, ...

'XData', [1 (size(rgb, 2) + xform(3, 1))], ...

'YData', [1 (size(rgb, 1) + xform(3, 2))], ...

'FillValues', [187; 192; 57]);

figure, imshow(cb_rgb)

使用彩色填充值的變換后彩色圖像

如果您在變換多幅彩色圖像,您可以為每張彩色圖像指定不同的填充值。例如,如果您想轉換一組10幅圖像,一個大小為200×200×3×10的4維數組,您有幾種方案。您可以指定一個標量值,對每一幅圖像使用一個灰度級填充值。您也可以用一個1×3的向量為這一組所有的彩色圖像指定一個彩色數值。為每一幅彩色圖像指定不同的顏色填充值,要指定一個3×10的數組來包含這些顏色值。

進行N維空間變換(Performing N-Dimensional Spatial Transformations)

以下這些函數,當組合使用時,為定義和使用2維、N維和混合維的空間變換提供了豐富的選項。

  • maketform
  • fliptform
  • tformfwd
  • tforminv
  • tindbounds
  • makeresampler
  • tformarray
  • imtransform

imtransform,findbounds和tformarray函數內部使用了tformfwd和tforminv函數來壓縮決定輸出圖像或數組的范圍和將輸出像素或數組位置映射回輸入位置的正向變換。您可以通過在點和直線上應用tformfwd和tforminv並將結果畫出來探索變換的幾何效應。它們支持對圖像和逐點數據進行一致性處理。

接下來的例子,“Performing the Spatial Transformation”,使用了帶標准插值方法的makeresampler函數。您也可以使用它來獲取特殊效果或進行自定義處理。例如,您可以指定您自己的可分離的濾波或插值核心,用MATLAB的interp2和interp3函數構造一個自定義的重采樣,甚至可以實施先進的抗混疊技術。

而且,正如已經提過的,您可以使用tformarray進行任意維的數組變換。數組甚至不需要有相同的維數。輸出可能有比輸入更高或者更低的維數。

例如,如果您在2維平面上對3維數據進行采樣,輸入數組可能會有更低的維數。輸出的維數可能會更高,例如,如果您組合多重2維變換成為一個單一的2維至3維的操作。

I = checkerboard(20, 1, 1);

figure; imshow(I)

T = maketform('projective', [1 1; 41 1; 41 41; 1 41], ...

              [5 5; 40 5; 35 30; -10 30]);

R = makeresampler('cubic', 'circular');

K = imtransform(I, T, R, 'Size', [100 100], 'XYScale', 1);

figure, imshow(K)

原始圖像 變換后圖像

imtransform的函數選項讓您可以控制變換的很多方面。例如,注意變換后的圖像似乎包含了原始圖像的多重復制。這是通過使用’Size’選項完成的,使得輸出圖像比輸入圖像更大,然后指定填充方法為通過重復循環像素的模式來擴展輸入圖像。圖像處理工具箱圖像變換演示提供了使用imtransform函數的更多例子,還有進行不同類型空間變換的相關函數。

備注

本人盡量保證翻譯的准確性,但畢竟水平有限,有些地方僅憑個人感覺會意而述。如有疑惑,可參閱英文原版

我還做了這一部分的ppt演示文檔,已上傳百度文庫,可點此查看


免責聲明!

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



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