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