Android中影像變換Matrix的原理、程式碼驗證和應用(一)
第一部分 Matrix的數學原理
在Android中,如果你用Matrix進行過影像處理,那麼一定知道Matrix這個類。Android中的Matrix是一個3 x 3的矩陣,其內容如下:
Matrix的對影像的處理可分為四類基本變換:
Translate 平移變換
Rotate 旋轉變換
Scale 縮放變換
Skew 錯切變換
從字面上理解,矩陣中的MSCALE用於處理縮放變換,MSKEW用於處理錯切變換,MTRANS用於處理平移變換,MPERSP用於處理透視變換。實際中當然不能完全按照字面上的說法去理解Matrix。同時,在Android的文件中,未見到用Matrix進行透視變換的相關說明,所以本文也不討論這方面的問題。
針對每種變換,Android提供了pre、set和post三種操作方式。其中
set用於設定Matrix中的值。
pre是先乘,因為矩陣的乘法不滿足交換律,因此先乘、後乘必須要嚴格區分。先乘相當於矩陣運算中的右乘。
post是後乘,因為矩陣的乘法不滿足交換律,因此先乘、後乘必須要嚴格區分。後乘相當於矩陣運算中的左乘。
除平移變換(Translate)外,旋轉變換(Rotate)、縮放變換(Scale)和錯切變換(Skew)都可以圍繞一箇中心點來進行,如果不指定,在預設情況下是圍繞(0, 0)來進行相應的變換的。
下面我們來看看四種變換的具體情形。由於所有的圖形都是有點組成,因此我們只需要考察一個點相關變換即可。
一、 平移變換
假定有一個點的座標是 ,將其移動到 ,再假定在x軸和y軸方向移動的大小分別為:
如下圖所示:
不難知道:
如果用矩陣來表示的話,就可以寫成:
二、 旋轉變換
2.1 圍繞座標原點旋轉:
假定有一個點 ,相對座標原點順時針旋轉後的情形,同時假定P點離座標原點的距離為r,如下圖:
那麼,
如果用矩陣,就可以表示為:
2.2 圍繞某個點旋轉
如果是圍繞某個點順時針旋轉,那麼可以用矩陣表示為:
可以化為:
很顯然,
1.
是將座標原點移動到點後, 的新座標。
2.
是將上一步變換後的,圍繞新的座標原點順時針旋轉 。
3.
經過上一步旋轉變換後,再將座標原點移回到原來的座標原點。
所以,圍繞某一點進行旋轉變換,可以分成3個步驟,即首先將座標原點移至該點,然後圍繞新的座標原點進行旋轉變換,再然後將座標原點移回到原先的座標原點。
三、 縮放變換
理論上而言,一個點是不存在什麼縮放變換的,但考慮到所有影像都是由點組成,因此,如果影像在x軸和y軸方向分別放大k1和k2倍的話,那麼影像中的所有點的x座標和y座標均會分別放大k1和k2倍,即
用矩陣表示就是:
縮放變換比較好理解,就不多說了。
四、 錯切變換
錯切變換(skew)在數學上又稱為Shear mapping(可譯為“剪下變換”)或者Transvection(縮並),它是一種比較特殊的線性變換。錯切變換的效果就是讓所有點的x座標(或者y座標)保持不變,而對應的y座標(或者x座標)則按比例發生平移,且平移的大小和該點到x軸(或y軸)的垂直距離成正比。錯切變換,屬於等面積變換,即一個形狀在錯切變換的前後,其面積是相等的。
比如下圖,各點的y座標保持不變,但其x座標則按比例發生了平移。這種情況將水平錯切。
下圖各點的x座標保持不變,但其y座標則按比例發生了平移。這種情況叫垂直錯切。
假定一個點經過錯切變換後得到,對於水平錯切而言,應該有如下關係:
用矩陣表示就是:
擴充套件到3 x 3的矩陣就是下面這樣的形式:
同理,對於垂直錯切,可以有:
在數學上嚴格的錯切變換就是上面這樣的。在Android中除了有上面說到的情況外,還可以同時進行水平、垂直錯切,那麼形式上就是:
五、 對稱變換
除了上面講到的4中基本變換外,事實上,我們還可以利用Matrix,進行對稱變換。所謂對稱變換,就是經過變化後的影像和原影像是關於某個對稱軸是對稱的。比如,某點 經過對稱變換後得到,
如果對稱軸是x軸,難麼,
用矩陣表示就是:
如果對稱軸是y軸,那麼,
用矩陣表示就是:
如果對稱軸是y = x,如圖:
那麼,
很容易可以解得:
用矩陣表示就是:
同樣的道理,如果對稱軸是y = -x,那麼用矩陣表示就是:
特殊地,如果對稱軸是y = kx,如下圖:
那麼,
很容易可解得:
用矩陣表示就是:
當k = 0時,即y = 0,也就是對稱軸為x軸的情況;當k趨於無窮大時,即x = 0,也就是對稱軸為y軸的情況;當k =1時,即y = x,也就是對稱軸為y = x的情況;當k = -1時,即y = -x,也就是對稱軸為y = -x的情況。不難驗證,這和我們前面說到的4中具體情況是相吻合的。
如果對稱軸是y = kx + b這樣的情況,只需要在上面的基礎上增加兩次平移變換即可,即先將座標原點移動到(0, b),然後做上面的關於y = kx的對稱變換,再然後將座標原點移回到原來的座標原點即可。用矩陣表示大致是這樣的:
需要特別注意:在實際程式設計中,我們知道螢幕的y座標的正向和數學中y座標的正向剛好是相反的,所以在數學上y = x和螢幕上的y = -x才是真正的同一個東西,反之亦然。也就是說,如果要使圖片在螢幕上看起來像按照數學意義上y = x對稱,那麼需使用這種轉換:
要使圖片在螢幕上看起來像按照數學意義上y = -x對稱,那麼需使用這種轉換:
相關文章
- 驗證碼原理及驗證
- 數字影像處理學習筆記(1)——傅立葉變換在影像處理中的應用筆記
- 基於FPGA的影像一維FFT變換IFFT逆變換verilog實現,包含tb測試檔案和MATLAB輔助驗證FPGAFFTMatlab
- 手機驗證碼登入原理、風險和應對策略
- AJAX應用【股票案例、驗證碼校驗】
- asp.net驗證碼應用ASP.NET
- 應用:隨機生成驗證碼隨機
- 驗證碼的識別和運用
- 驗證碼影像處理(JavaScript 版)JavaScript
- Android中Google Authenticator驗證系統工作原理分析AndroidGo
- 瞭解Android Matrix轉換Android
- 驗證碼處理在自動化測試中的應用
- 零知識證明在隱私保護和身份驗證中的應用
- 如何應用 matrix3d 對映變幻3D
- 驗證碼程式
- 驗證碼的原理、作用及實現
- 傳統 Web 應用中的身份驗證技術Web
- HACCP原理——驗證程式(轉載)
- 生成驗證碼程式程式碼
- 霍夫變換圓檢測原理及 OpenCV API 應用OpenCVAPI
- 深入理解 Android 中的 MatrixAndroid
- JavaScript驗證碼生成和驗證效果JavaScript
- Android中mmap原理及應用簡析Android
- 開發中遇到的jquery函式應用和表單驗證處理jQuery函式
- ACCESS 密碼驗證/文字驗證中的小坑密碼
- 從對抗出發,以變制變,看動態素材在驗證碼攻防對抗中的應用
- shell指令碼中的變數及應用指令碼變數
- Python 實現影像快速傅立葉變換和離散餘弦變換Python
- CodeArts如何保證客戶程式碼和應用安全?
- 中文彩色驗證碼實現(變形/噪點/點選更換
- 用C#生成中文漢字驗證碼的基本原理C#
- android 驗證碼,稍微修改Android
- 用WPS格式轉換工具校驗身份證號碼
- 照片和影像編輯應用程式為何盈利?
- PHP算式驗證碼和漢字驗證碼的實現方法PHP
- Ajax的原理和應用
- OpenCV計算機視覺學習(11)——影像空間幾何變換(影像縮放,影像旋轉,影像翻轉,影像平移,仿射變換,映象變換)OpenCV計算機視覺
- Android中獲取應用程式(包)的資訊-----PackageManager的使用(一)AndroidPackage