Android圖像處理——Matrix

原文鏈接:http://www.cnblogs.com/leon19870907/articles/1978065.html

座標變換矩陣

座標變換矩陣是一個3*3的矩陣如圖2.1,用來對圖形進行座標變化,將原來的座標點轉移到新的座標點,

因爲一個圖片是有點陣和每一點上的顏色信息組成的,所以對座標的變換,就是對每一點進行搬移形成新的圖片。

具體的說圖形的放大縮小,移動,旋轉,透視,扭曲這些效果都可以用此矩陣來完成。


這個矩陣的作用是對座標x,y進行變換計算結果如下:
x'=a*x+b*y+c
y'=d*x+e*y+f
通常情況下g=h=0,這樣使1=0*x+0*y+1恆成立。和顏色矩陣一樣,座標變換矩陣真正使用的參數很少也很有規律。


上圖就是一個座標變換矩陣的簡單例子,計算後發現x'=x+50,y'=y+50.

可見圖片的每一點都在x和y方向上平移到了(50,50)點處,這種效果就是平移效果,將圖片轉移到了(50,50)處。

計算上面得矩陣x'=2*x,y‘=2*y.經過顏色矩陣和上面轉移效果學習,相信讀者可以明白這個矩陣的作用了,這個矩陣對圖片進行了放大,具體的說是放大了二倍。
下面將介紹幾種常用的變換矩陣:
1.      旋轉


繞原點逆時針旋轉θ度角的變換公式是 x' = xcosθ − ysinθ 與 y。' = xsinθ +    ycosθ
2.      縮放


變換後長寬分別放大x'=scale*x;y'=scale*y.
3.         切變


4.         反射

( , )單位向量
5.         正投影

( , )單位向量
 
上面的各種效果也可以疊加在一起,既矩陣的組合變換,可以用矩陣乘法實現之,如:R=B(A*C)=(B*A)C,注意一點就是B*A和A*B一般是不等的。





上面給出了用座標變換矩陣做出的各種效果,用座標變換矩陣可以方面的調節圖形的各種效果,

但是我們看看Matrix類就可以發現,實際上,matrix類本身已經提供了許多類似的方法,我們只要調用,就可以了。
 
setScale(float sx, float sy, float px, float py) 放大 
setSkew(float kx, float ky, float px, float py) 斜切 
setTranslate(float dx, float dy)                       平移 
setRotate(float degrees, float px, float py)    旋轉 
 
上面的函數提供了基本的變換平移,放大,旋轉,斜切。爲了做出更復雜的變換,同時不必親手去改動座標變換矩陣,

Matrix類提供了許多Map方法,將原圖形映射到目標點構成新的圖形,

下面簡述setPolyToPoly(float[] src, int srcIndex, float[] dst, int dstIndex, int pointCount) 的用法,希望起到舉一反三的作用。

參數src和dst是分別存儲了原圖像的點和和指定的目標點的一維數組,數組中存儲的座標格式如下:
 [x0, y0, x1, y1, x2,y2,...]
 
這個個函數將src中的座標映射到dst中的座標,實現圖像的變換。

具體的例子可以參考APIDemos裏的PolyToPoly,我在這裏就不再貼代碼了,只講一下函數是怎麼變換圖片的。下面是效果:


圖中寫1的是原圖,寫有2,3,4的是變換後的圖形。現在分析2是怎麼變換來的,變換的原座標點和目的座標點如下:
src=new float[] { 32, 32, 64, 32 }
dst=new float[] { 32, 32, 64, 48 }

從上圖標示出的座標看出原圖的(32,32)映射到原圖的(32,32),(64,32)映射到原圖(64,48)這樣的效果是圖像放大了而且發生了旋轉。這樣的過程相當於(32,32)點不動,然後拉住圖形(64,32)點並拉到(64,48)點處,這樣圖形必然會被拉伸放大並且發生旋轉。最後用一個平移將圖形移動到右邊現在的位置。希望能夠好好理解這一過程,下面的3,4圖是同樣的道理。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章