二维空间变换
之前看到matlab做空間變換,一直想看看,趁現在有點時間翻譯一下matlab的幫助吧!
綜述
?????????執行一般的二維空間變換包括如下三步:
1.?????????定義空間變換的參數;
2.?????????創建變換結構體TFORM,它定義了你所要執行變換的類型;
TFORM結構體包含了執行變換需要的所有參數。你可以定義很多類型的空間變換,包括放射變換affine transformations(如平移translation,縮放scaling,旋轉rotation,剪切shearing)、投影變換projective transformations和自定義的變換custom transformations。
創建結構體的方法有兩種:使用maketform或者使用cp2tform。
3.?????????執行變換。
通過將要變換的圖像和TFORM結構體傳遞給imtransform函數即可實現變換。
?????????用圖來表示就是
?
?
例子
?????????下面以一個簡單的平移仿射變換來展示空間變換的使用方法。
Step 1:?導入要變換的圖像
?????????Matlab提供了一個棋盤圖像,可以以此作為例子,它的調用函數為checkerboard,它將創建一個80X80像素的圖像。
%?導入圖像
cb = checkerboard;
figure
imshow(cb)
Step 2:?定義空間變換
?????????定義二維的空間變換需要一個3X3的變換矩陣,也可以通過在輸入圖像和輸出圖像上指定對應點的方式由maketform自動創建變換矩陣。
?????????這里使用如下的變換矩陣來定義空間平移變換
%?定義變換矩陣
xform = [ 1??0??0
????0??1??0
????20 40??1 ];
?????????在這個矩陣中,xform(3, 1)定義了圖像在水平方向上平移的像素數,xform(3, 2)定義了圖像在垂直方向上平移的像素數。
?
Step 3:?創建TFORM結構體
?????????使用maketform函數可以創建TFORM結構體,參數為希望執行變換的類型和變換矩陣。
%?創建TFORM結構體
tform_translate = maketform('affine', xform);
?
Step 4:?執行變換
?????????使用imtransform函數執行變換,參數為要變換的圖像和TFORM結構體,函數將返回變換后的圖像。
%?執行變換
[cb_trans xdata ydata]= imtransform(cb, tform_translate);
?????????返回值中包含的另兩個額外輸出參數xdata和ydata,表示輸出圖像在輸出坐標空間的位置。xdata包含了輸出圖像拐角處像素的x坐標,ydata包含了這些像素的y坐標(這里說的x、y坐標是指像素的中點)。
?????????下圖展示了平移變換的效果,可以看到,(1, 1)點的像素轉移到了(41, 41)的位置,注意那一點的像素值沒有變。
imtransform函數決定輸出圖像的像素值是把新位置映射回輸入圖像的相應位置。在平移變換中,由于圖像的大小和旋轉角度沒有變,所以是一一映射;對于其他類型的變換,如放縮、旋轉,此函數將在輸入圖像上插值計算輸出圖像的像素值。學過圖像處理的這個應該很清楚。
?
Step 5:?觀察輸出圖像
?????????使用如下語句顯示變換后的圖像
%?顯示變換結果
figure
imshow(cb_trans)
從結果看來,貌似變換沒有效果,變換后圖像和原圖像是一樣的。但如果你檢查xdata和ydata的數值,就會看到圖像的空間坐標已經改變了。原始圖像左上角的坐標由(1, 1)變為了(41, 41),右下角由(80, 80)變為了(120, 120),40已經被加到了每個像素的空間坐標上。
>> xdata
xdata =
????41???120
>> ydata
ydata =
41???120
而顯示結果上沒有變化的原因是函數imtransform得到的輸出圖像足夠包含了變換后的圖像,但沒有包含全部的坐標空間。要看到變換的效果,需要使用imtransform函數的額外輸入參數來指定輸出圖像的大小和能包含輸出圖像的輸出空間。
下面的代碼使用了XData和YData兩個額外參數來指定能包含輸出圖像的輸出空間,而對于輸出空間中不在輸出圖像上的像素默認為黑色,這可以通過改變imtransform函數的FillValues參數來指定。
%?修正的變換結果
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)
?
?
定義空間變換的方式
?????????下面來討論定義空間變換的兩種方式:使用變換矩陣和使用對應點。
使用變換矩陣
?????????Maketform函數可以接受一個N維的變換矩陣來產生TFORM結構體。而由于imtransform只能做二維變換,故只能指定3X3的轉換矩陣。
如使用3X3的矩陣來指定任何的仿射變換,而對于仿射變換,最后一列必須是0 0 1,所以你指定3X2的矩陣就足夠了,在這種情況下,imtransform會自動添加第三列。
下面的表格列舉了imtransform可以執行的仿射變換以及相應矩陣的定義方法。
使用對應點
?????????除了指定變換矩陣,你還可以通過使用對應點來定義一個變換,讓maketform自動生成變換矩陣。
?????????要對一個仿射變換使用此方法,需要在輸入、輸出圖像上拾取3對非線性的點,而對于投影變換,則需要指定四對點。如
in_points = [11 11;21 11; 21 21];
out_points = [51 51;61 51;61 61];
tform2 = maketform('affine', in_points, out_points);
?
?
創建TFORM結構體
?????????有了上面的變換數據,就可以用maketform創建TFORM結構體了,也可以使用cp2tform函數來創建,具體詳見Image Registration。
???????? ? 在使用 maketform 創建 TFORM 結構時,需要指定必要的變換方式。如要做平移變換需要指定為仿射變換方式,除此 maketform 還支持投影變換,另外可以使用 custom 和 composite 選項來指定任意的空間變換。下表列出了 maketform 支持的變換類型?
?
執行空間變換
?????????有了上面的TFORM結構體,就可以調用imtransform執行變換了。正如上面例子中所使用的那樣
[cb_trans xdata ydata]= imtransform(cb, tform_translate);
?????????另外,imtransform函數還支持幾個可選輸入參數來控制轉換的不同效果,如輸出圖像的大小、填充值等。上面例子中的XData和YData就是控制輸出圖像大小的輸入參數。對于填充值可以如下設置。
指定填充值
?????????當執行一個變換時,輸出圖像上有很多像素不在位于原輸入圖像的位置,這些像素必須被賦予一些值,這就是填充值。默認情況下,imtransform函數設置這些像素為0,顯示為黑色。而通過使用FillValues參數可以指定不同的顏色。
對于灰度圖像
?????????如果待轉換的圖像是灰度圖像,就需要指定一個標量值來設置灰度的陰暗度。如下
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)
得到結果為
對于RGB圖像
?????????對于RGB彩色圖像,可以使用一個標量值或者一個1X3的向量。如果使用標量,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)
結果如下
?
總結
- 上一篇: 基于androidstudio校园快递A
- 下一篇: 计算机网络学习笔记 概论