getAffineTransform函數
函數作用:
主要用於生成仿射變換矩陣
一個任意的仿射變換都能表示為 乘以一個矩陣 (線性變換) 接着再 加上一個向量 (平移).
綜上所述, 我們能夠用仿射變換來表示:
旋轉 (線性變換)
平移 (向量加)
縮放操作 (線性變換)
你現在可以知道, 事實上, 仿射變換代表的是兩幅圖之間的 關系 .
我們通常使用 矩陣來表示仿射變換.
考慮到我們要使用矩陣 和 對二維向量 做變換, 所以也能表示為下列形式:
或
怎樣才能求得一個仿射變換?
好問題. 我們在上文有提到過仿射變換基本表示的就是兩幅圖片之間的 聯系 . 關於這種聯系的信息大致可從以下兩種場景獲得:
我們已知 和 T 而且我們知道他們是有聯系的. 接下來我們的工作就是求出矩陣
我們已知 and . 要想求得 . 我們只要應用算式 即可. 對於這種聯系的信息可以用矩陣 清晰的表達 (即給出明確的2×3矩陣) 或者也可以用兩幅圖片點之間幾何關系來表達.
讓我們形象地說明一下. 因為矩陣 聯系着兩幅圖片, 我們以其表示兩圖中各三點直接的聯系為例. 見下圖:
點1, 2 和 3 (在圖一中形成一個三角形) 與圖二中三個點一一映射, 仍然形成三角形, 但形狀已經大大改變. 如果我們能通過這樣兩組三點求出仿射變換 (你能選擇自己喜歡的點), 接下來我們就能把仿射變換應用到圖像中所有的點.
函數的調用形式:
Mat getAffineTransform(InputArray src, InputArray dst)
參數詳解:
InputArray src:表示輸入的三個點
InputArray dstL:表示輸出的三個點
獲取變換矩陣
cv2.warpAffine
opencv中的仿射變換在python中的應用並未發現有細致的講解,函數cv2.warpAffine的參數也模糊不清,今天和大家分享一下參數的功能和具體效果,如下:
官方給出的參數為:
cv2.warpAffine(src, M, dsize[, dst[, flags[, borderMode[, borderValue]]]]) → dst
其中:
src - 輸入圖像。
M - 變換矩陣。
dsize - 輸出圖像的大小。
flags - 插值方法的組合(int 類型!)
borderMode - 邊界像素模式(int 類型!)
borderValue - (重點!)邊界填充值; 默認情況下,它為0。
上述參數中:M作為仿射變換矩陣,一般反映平移或旋轉的關系,為InputArray類型的2×3的變換矩陣。
flages表示插值方式,默認為 flags=cv2.INTER_LINEAR,表示線性插值,此外還有:cv2.INTER_NEAREST(最近鄰插值) cv2.INTER_AREA (區域插值) cv2.INTER_CUBIC(三次樣條插值) cv2.INTER_LANCZOS4(Lanczos插值)
日常進行仿射變換時,在只設置前三個參數的情況下,如 cv2.warpAffine(img,M,(rows,cols))可以實現基本的仿射變換效果,但可以出現“黑邊”現象;
這對后續的處理往往造成很大的困擾,第六個參數可以選擇填充的顏色,默認為黑色。
在python中設置warpAffine的參數與c++中有所不同,具體如下:
c++中:
warpAffine(src,img,M,Size(a,b),1,0,Scalar(255,255,255));
python中:
cv2.warpAffine(img,M,(rows,cols),flags=cv2.INTER_,borderMode=cv2.BORDER_REFLECT,borderValue=(255,255,255))
在python 中有一個好處是不必按順序設置,直接指明所設置的參數即可,如將上述圖片邊界區域填充為白色:
cv2.warpAffine(img,M,(lengh,lengh),borderValue=(255,255,255))
更高級的應用:
參考人臉提取框架MTCNN的相關代碼:mtcnn_pytorch/src/align_trans.py
參考:
getAffineTransform https://blog.csdn.net/qq_18343569/article/details/47953505
warp https://blog.csdn.net/qq878594585/article/details/81838260