仿射变换的原理
在條形碼識別軟件中有圖像預覽的功能。有時預覽的圖像需要進行轉(zhuǎn)置(旋轉(zhuǎn)180度或者90度)、縮放、鏡像(左右反轉(zhuǎn))等操作。OpenCV提供了相應的函數(shù)進行以上操作。例如:?
轉(zhuǎn)置:cv::WarpAffine()?
縮放:cv::resize()?
鏡像:cv::remap()?
如果同時要轉(zhuǎn)置,縮放和鏡像,就需要進行三次圖像運算。其實以上三個操作都是同一類型的變化,稱作仿射變化。可以把這3次圖像運算合并成一次,從而優(yōu)化運算時間。如何合并這三次運算,需要從仿射變換的原理說起。
舉個例子,我們需要對以下圖像(藍色)順時針旋轉(zhuǎn)90度(橙色),可以這么做:假設原來的圖像寬w高h?
(1) 創(chuàng)建寬h高w內(nèi)存區(qū)域存放新圖像;?
(2) 逐一把原圖像中的像素(x0,y0)搬到新圖像的對應像素(x1,y1)?
例如原圖像的左上角點①(0,0)被搬到新圖像的右上角(h,0);?
右上角點②(w,0)被搬到新圖像的右下角(h,w);?
右下角③(w, h)被搬到新圖像的左下角(0,w)?
以此類推,可以發(fā)現(xiàn)(x0, y0)和(x1, y1)之間存在以下規(guī)律:?
X1=-y0+h; y1=x0;
對于其他各種幾何變換,平移、縮放、鏡像等,我們都可以用類似的方法進行運算。因此可以把上式寫成通用的形式:
x1=ax*x0+bx*y0+cx
y1=ay*x0+by*y0+cy
在順時針旋轉(zhuǎn)90度的例子中,
?ax=0,bx=1,cx=0;ay=?1,by=0,cy=w?
更一般的,我們可以把上面寫成矩陣形式:
?
(x1y1)=(axaybxbycxcy)×???x0y01???或者齊次形式。
???x1y11???=???axay0bxby0cxcy1???×???x0y01???
我們把矩陣MT=???axay0bxby0cxcy1???稱作仿射矩陣。
總結
- 上一篇: PyTorch框架学习五——图像预处理t
- 下一篇: 模式识别与机器学习笔记(二)机器学习的基