1. 數(shù)學背景
1. 幾何變換的含義:改變圖像的幾何位置、形狀、尺寸等幾何特征

2018042310533551.jpeg
1.1 位置變換:(剛性變換)
平移
平移后:(x1,y1)
平移前:(x0-tx,y0-ty)
如果對應的平移前的點不在原圖中,則需要考慮賦0或255
鏡像
水平鏡像(假設原圖寬w)
垂直鏡像(假設原圖高h)
旋轉
以圖像中心點為旋轉中心:
以指定點(a,b)為旋轉中心:
- 轉置:
1.2 形狀變換:縮放、錯切
- 縮放:
以圖像中心為原點
-
錯切:圖像的錯切變換實際上是平面景物在投影平面上的非垂直投影效果
Screen Shot 2019-07-21 at 10.58.21 PM.png
沿Y方向錯切:
沿X方向錯切與沿Y方向錯切類似
1.3 仿射變換:仿射變換是圖像的位置變換、形狀變換的各種組合,位置圖像的“平直性”和“平行性”
-
仿射以及其他更復雜幾何變換
20180423105453782.jpeg
- 幾何變換的特點:變換前后只改變圖像像素的空間位置,不改變像素的像素值
2.實現(xiàn)方式及效果
2.1 【平移+鏡像+旋轉+縮放】 都可以以仿射矩陣實現(xiàn)
1??生成一個和原始圖像等大的全黑/全白的矩陣
2??計算出平移后圖像的起點和終點
3??memcpy每行數(shù)據(jù)填充
OPENCV函數(shù):仿射變換(afftine transformation)來實現(xiàn)
warpAffine(src, M, dsize, dst=None, flags=None, borderMode=None, borderValue=None)
src: 輸入圖像
M: 變換矩陣 (2X3)
dsize: 指定圖像輸出尺寸
dst: 輸出圖像,尺寸由dsize指定,圖像類型與原圖像一致
flags: 插值算法標識符
borderMode: 邊界像素模式,有默認值BORDER_CONSTANT
borderValue: 邊界取值,有默認值Scalar()即0
image = imread('cat.jpeg')
image = cv2.resize(image,(0,0),fx=0.5,fy=0.5,interpolation=cv2.INTER_LINEAR)
[h,w] = (image.shape[0],image.shape[1])
##以圖像中心為原點
M1 = np.float32([[-1,0,w-1],[0,1,0]])# 水平鏡像
M2 = np.float32([[1,0,0],[0,-1,h-1]])#垂直鏡像
M3 = np.float32([[1,0,5],[0,1,10]])#水平方向右移5個像素,垂直方向下移10個像素
xmirror = cv2.warpAffine(image,M1,(image.shape[1],image.shape[0]))
ymirror = cv2.warpAffine(image,M2,(image.shape[1],image.shape[0]))
shitfed = cv2.warpAffine(image,M3,(image.shape[1],image.shape[0]))
image_T = cv2.warpAffine(image,M4,(image.shape[1],image.shape[0]))
show(image)
show(xmirror)
show(ymirror)
show(shitfed)

Screen Shot 2019-07-21 at 10.12.13 PM.png
2.2 仿射等復雜變換
可以參考這篇blog:這是個鏈接
3.應用
圖像配準(雙光融合、雙攝或多攝像、AR/VR...)

