1. 数学背景
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.实现方式及效果
2.1 【平移+镜像+旋转+缩放】 都可以以仿射矩阵实现
1⃣️生成一个和原始图像等大的全黑/全白的矩阵
2⃣️计算出平移后图像的起点和终点
3⃣️memcpy每行数据填充
OPENCV函数:仿射变换(afftine transformation)来实现
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...)

