Affine Transformation
This program facilitates the application of the affine transformation to a 2-D Image.
看完了這段英文...我想這段英文寫的意思是:
這段程式,幫助2D影像仿射轉換的運用。
MATLAB網站:
http://www.mathworks.com/matlabcentral/fileexchange/3025
而所謂的「Affine Transformation (仿射轉換)」就是將影像坐標(Sample, Line)轉換成像坐標(x,y)。
-------------------------------------------------------------------------------------
Chapter 6:Image Geometry
開頭的那段寫著:
有很多的情況,我們可能想要去改變影像的形狀、大小或方位。
我們可能想要去擴大影像去適合特定的空間或印刷;
也可能想要去縮小它的尺寸,包括在網頁上。
我們可能希望去旋轉它,可能對不合適的相機角度做調整,或單純地為了效果。
旋轉和比率(大小)是仿射轉換的例子,線條轉換成線條,尤其是平行線在轉換之後保持平行。
非仿射的幾合轉換包含彎曲,但我們經常沒有把它考慮在這裡。
這段大概就是做初步的帶入,但我真的看不太懂倒數第二行的線條轉換成線條是什麼意思@@"
6.1 Interpolation of Data
Start with a simple problem:
suppose we have a collection of four values that we wish to enlarge to eight.
「如何把四個數字擴大八個數字?」
課本上提到了三種方法:
1)Slightly redrawn
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjzkVw4JpNI4HuLPiEksKQ635qWsiMDlksJaFfeqsPXOsT4CDEjs7T63s7kG-j4EVKFF2QIWJ1thM6qihELHroouAbJuoC6zhqaOGcAhYiG_NgpR4Sx559wptQfqjI6CR5Ge8yXJ_-raw/s320/%E5%BD%B1%E5%83%8F146.jpg)
X1 ~ X4 之間一共有三個間隔,而每個間隔相差的直為1,
X'1 ~ X'8 的長度與 X1~X4的長度相等,X'1 ~ X'8之間一共有七個間隔(如上圖6.1所示),
所以每個間隔的大小為3/7 大約等於0.4286。
數學公式如下:
X'=1/3(7x-4)
X =1/7(3x'+4)
將等長度由四等份分為八等份,故每段長度變小(如下圖6.2所示)。
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQ7Cfj5DDOQxnIogKpyTbxVamCALfkc3taaV5-a6mhjyXPzR-gxY1utArrGbWEsqQjwyraVcbzCm-QNkCET_sRmoAh4K9ka6EKvbI1AKCx2g_mMg-ufOnED9shebrWT9twrpoGUGFeXg/s320/%E5%BD%B1%E5%83%8F152.jpg)
2)Nearest-neighbor interpolation
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj7BDs0KgBBEXNRr512QzfwOiGd6MMYZ7N97kzFmvEp6E8D-XshiUd9hfO8rJMA1zeyu-uciIX6YsgZfYUh78NmCPmwEnJigI7-HgyfrJL8C1Lzaxn6dC_ghB3f7SiKZY3z-0BTq5eoMA/s320/%E5%BD%B1%E5%83%8F153.jpg)
X →X' 挑最近的的點,如上圖6.3所示:
X1最近的點:X'1 & X'2 (X'2標空圈)
X2最近的點:X'3 & X'4
X3最近的點:X'5 & X'6
X4最近的點:X'7 & X'8 (X'7標空圈)
3)Linear interpolation
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiGJ_Q6RxH2frk6H9FI5s_GCt31ZjSbuS8waB4jp3Ajti4aOR3LHtn5b_NhSXgE9fy28eGhtdobYCvqLdSUGOw-pLaH62vbtCRp_JD0HVKaahvRyE4E7TXAoVbuhmA27TvITwL9wZxIIw/s320/%E5%BD%B1%E5%83%8F154.jpg)
主要是將X1與X2連線,取X'2對應到線上的點為X'2(X'2標空圈),以此類推。
而要計算linearly interpolated values,一定要為線型。
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhty-EgXkqWSfh7DztY001vS_jRg9Vq5GEBAPpbnZOuNUgjFT_ZrNgl_9nKdU15VOx_qf7x7XcY1eBFQkfVgey1Ztk7DdM-abG0gK02hGZimdFQhoT6kC3-XLsTTSRod1egwRdTxt6WBg/s320/%E5%BD%B1%E5%83%8F155.jpg)
數學原理為:
〔F-f(X)〕/λ = 〔f(X2)-f(X1)〕/1
→F=λf(X2)+(1-λ)f(X1)
註:F是想知道的X'n
λ是以 X1 到 X2 的距離,F距離 X1 佔整段比例的比數
6.2 Image Interpolation
在6.1提到了點與線之間的數值放大(使用線性做範例),
而在此6.2則是討論一個面的,也就是Image。
例如:將4×4的Image放大到8×8,
(x,y)對應到放大後的位置,用下面的公式計算,
則該公式稱為 bilinear interpolation。
f(x',y')=λ〔μf(x+1,y+1)+(1-μ)f(x+1,y)〕
+(1-λ)〔μf(x,y+1)+(1-μ)f(x,y)〕
=λμf(x+1,y+1)+λ(1-μ)f(x+1,y)
+(1-λ)μf(x,y+1)+(1-λ)(1-μ)f(x,y)
上面最後的方程式為bulinear interpolation的公式。
Matlab內有個 function 叫做 imresize,負責上述提過的處理,
它的語法是:imresize(A, k, 'method')
A是任何型態的影像,K是比率係數,
而method是 "nearest" 或 "'bilinear" 二者之中任一個。
另一種imresize的語法則是:
imresize(A, [m,n] , 'method')
[m,n] 則表示輸出的比率大小。
下面是課本上的程式碼:
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5N0wNjiDt0qY7eOhktAiJGBQMXBvK4JSQ7TvTBl7oA7HOiptkgpKvEGB4PtfLOj9mnoU2DZnMIywhGXAglEg1vbkBgsLYCR5gWbb1DYcbhF6Xz4Utp9L_JYWzXBSb6nF0x0uaTwjVXg/s320/1.jpg)
而下面則是nearest和bilinear的比較:
下圖為bicubic
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjrWi6FmI-5oeUs_JyULOiFwEHn0kRm9i-SxhOp1bCScncoSbD5YyR8PqqExKhWGySvu_GueZ-cIJvMjrpErGGs4aEe68YLiXtxQWkfPxzArXIYytrm5HmVB3N4LUMNyTVltGJkQs2oCQ/s320/bilinear.jpg)
而下圖為nearest neighbor
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjEC-BouYeAXys3f5SYfkRQesIOELY6vWScWSlesoIDv3eBLFZpl_wecsPEbKAdURXO6bbzMMyZuBBe0uRTcV2WPMa03uPQ5xk8RQlTLhMcjtnq2i8nUQ5uPc4w4_Wdvk1-EUKyHY_s7w/s320/nearest.jpg)
根據二張圖的推判,得知用nearest內插法誤差大於用bilinear內插法!
6.3 General Interpolation
一開始我們希望把 x' 插在 x1 ≤ x' ≤ x2 之間,並假設 x' - x1 = λ。
然後定義一個interpolation function R(u)且 f(x') = R(-λ)f(x1) + R(1-λ)f(x2)。
利用三種函數方程式表示6.2所示的方法
(1)Nearest-neighbor interpolation
{0 if u≦-0.5
R0(u)={1 if -0.5<u≦0.5
{0 if u>0.5
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3aL3Qow1_9I2rn2h8bftBxl6IVpxcWf0b40CI_zESgw6Vh8MVWwTeH6nKOj9gvBDfeCGvdn8I-UBIdgtSLqxiqlPmX1lMWyqHOTLVnRxIoYZ044-E4-Ir7p0QkFOj3wUdLEk9iwMbmg/s320/%E5%BD%B1%E5%83%8F149.jpg)
(2)Linear interpolation
R1(u)={1+u if u≦0
{1-u if u≧0
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhJI0LS61fmRerBIF-n42YSyBXmBEHCqqWuJut49uq2vzFb6AhVvlQ7X4fvJQlOwjgsNwSCNty4AZLq8SfeT1oyBakZ7aU7YGF-8YWT1FnPFJw6B4t3uFSyowhxdIrEQhN53EARCiYs4w/s320/%E5%BD%B1%E5%83%8F165.jpg)
(3)Cubic interpolation
也就是Method中的bicubic....
因為計算的過程中該曲線f(x)的x值,最高項次是 3次方,
而且,在平面上求得(x',y')需仰賴bilinear的概念
所以稱為bicubic interpolation。
R3(u)={1.5∣u∣^3-2.5∣u∣^2+1, if ∣u∣≦1,
{-0.5∣u∣^3+2.5∣u∣^2-4∣u∣+2 if 1<∣u∣≦2
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhhdtI4cX0Zraj9ZD9i0QEryK8pB0IQbYAi6bFVeogGQ6EneqU2J3fm-Rz76llUFmRCSUDd3NwXHdhS-oOP3jW374PB3ov5AckDZ6XUh5NKbvswBHNZJQUlkGV7R5So8TvTYrDqdX5lyg/s320/%E5%BD%B1%E5%83%8F166.jpg)
6.4 Enlargement by Spatial Filtering
如果只是要將圖放大兩倍, 有個快速且糟糕的方法就是使用linear filtering。
step1.對這個矩陣做zero-interleave,即在原行列之間加零。
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjiD1r-CoQSFOXRQffsuhyDjCdMyEBspMyNejaLq03BcS1cKCEG5peKQ0G5WGsuGpMOZfxEThr5EnJiUZkWvAuIuEAfrwjqKMlNXAuBDAATyHQkQ4iwICQI20AtAfftYVrp9SQ4Bvr7XA/s320/13.jpg)
step2.做filtering。
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhlWRCrSdk8Dotfn9uUC_a4THQ4qTPnJO4bO2USZNyoVJE2NkZmDrGOEs22XuMg1Z5tuf466jfxabBgR8f4DTKqK2d_mPTT66CoBM1GXcMyr2Q7ZjE6UihqjOu4aT7hjOiJ5kQwp5-6sg/s320/14.jpg)
6.5 Scaling Smaller
讓Image變比較小,也稱為Image minimization,
有一種方法是刪除間隔的pixel值,稱為subsampling,
它符合 imresize 的 nearest,是一種非常簡單的手段,但對高頻的部分效果不佳。
(是因為相近的pixel值差很多,但這些相近的pixel都被刪除了嗎?????)
沒有留言:
張貼留言