001.opencv图像几何变换

1. 数学背景

1. 几何变换的含义:改变图像的几何位置、形状、尺寸等几何特征
2018042310533551.jpeg
1.1 位置变换:(刚性变换)
  • 平移
    平移后:(x1,y1)
    平移前:(x0-tx,y0-ty)

    如果对应的平移前的点不在原图中,则需要考虑赋0或255
    \left[\begin{array}{c}{x_{0}} \\ {y_{0}} \\ {1}\end{array}\right]=\left[\begin{array}{ccc}{1} & {0} & {-t x} \\ {0} & {1} & {-t y} \\ {0} & {0} & {1}\end{array}\right]\left[\begin{array}{c}{x 1} \\ {y{1}} \\ {1}\end{array}\right]

  • 镜像
    水平镜像(假设原图宽w)
    \left[\begin{array}{c}{x 0} \\ {y_{0}} \\ {1}\end{array}\right]=\left[\begin{array}{ccc}{-1} & {0} & {w} \\ {0} & {1} & {0} \\ {0} & {0} & {1}\end{array}\right]\left[\begin{array}{c}{x 1} \\ {y 1} \\ {1}\end{array}\right]
    垂直镜像(假设原图高h)
    \left[\begin{array}{c}{x 0} \\ {y_{0}} \\ {1}\end{array}\right]=\left[\begin{array}{ccc}{1} & {0} & {0} \\ {0} & {-1} & {\mathrm{h}} \\ {0} & {0} & {1}\end{array}\right]\left[\begin{array}{c}{x 1} \\ {y 1} \\ {1}\end{array}\right]

  • 旋转
    以图像中心点为旋转中心:
    \left[\begin{array}{c}{x 1} \\ {y^{1}} \\ {1}\end{array}\right]=\left[\begin{array}{ccc}{\cos (a)} & {\sin (a)} & {0} \\ {-\sin (a)} & {\cos (a)} & {0} \\ {0} & {0} & {1}\end{array}\right]\left[\begin{array}{c}{x{0}} \\ {y{0}} \\ {1}\end{array}\right]
    以指定点(a,b)为旋转中心:

\begin{aligned}\left[\begin{array}{c}{x_{0}} \\ {y_{0}} \\ {1}\end{array}\right] &=\left[\begin{array}{ccc}{1} & {0} & {a} \\ {0} & {-1} & {b} \\ {0} & {0} & {1}\end{array}\right]\left[\begin{array}{ccc}{\cos \theta} & {\sin \theta} & {0} \\ {-\sin \theta} & {\cos \theta} & {0} \\ {0} & {0} & {1}\end{array}\right]\left[\begin{array}{ccc}{1} & {0} & {-c} \\ {0} & {-1} & {d} \\ {0} & {0} & {1}\end{array}\right]\left[\begin{array}{c}{x_{1}} \\ {y_{1}} \\ {1}\end{array}\right] \\ =\left[\begin{array}{ccc}{\cos \theta} & {-\sin \theta} & {-c \cos \theta+d \sin \theta+a} \\ {\sin \theta} & {\cos \theta} & {-c \sin \theta-d \cos \theta+b} \\ {0} & {0} & {1}\end{array}\right] \end{aligned}

  • 转置:
    \left[\begin{array}{c}{\mathrm{x} 0} \\ {\mathrm{y} 0} \\ {1}\end{array}\right]=\left[\begin{array}{ccc}{0} & {1} & {0} \\ {1} & {0} & {0} \\ {0} & {0} & {1}\end{array}\right]\left[\begin{array}{c}{\mathrm{x} 1} \\ {\mathrm{y} 1} \\ {1}\end{array}\right]
1.2 形状变换:缩放、错切
  • 缩放:
    以图像中心为原点
    \left[\begin{array}{c}{x_{0}} \\ {y_{\mathrm{o}}} \\ {1}\end{array}\right]=\left(\begin{array}{ccc}{\frac{1}{f_{x}}} & {0} & {0} \\ {0} & {\frac{1}{f_{y}}} & {0} \\ {0} & {0} & {1}\end{array}\right)\left[\begin{array}{c}{x} \\ {y} \\ {1}\end{array}\right]
    x_{0}=\frac{x}{f_{x}} \quad y_{0}=\frac{y}{f_{y}}
  • 错切:图像的错切变换实际上是平面景物在投影平面上的非垂直投影效果


    Screen Shot 2019-07-21 at 10.58.21 PM.png

沿Y方向错切:
\begin{array}{l}{X+\sin (\theta) * Y=\hat{X}} \\ {Y * \cos (\theta)=\dot{Y}}\end{array}
\left[\begin{array}{c}{\dot{X}} \\ {\dot{Y}} \\ {1}\end{array}\right]=\left[\begin{array}{ccc}{1} & {\sin (\theta)} & {0} \\ {0} & {\cos (\theta)} & {0} \\ {0} & {0} & {1}\end{array}\right] *\left[\begin{array}{l}{X} \\ {Y} \\ {1}\end{array}\right]
沿X方向错切与沿Y方向错切类似

1.3 仿射变换:仿射变换是图像的位置变换、形状变换的各种组合,位置图像的“平直性”“平行性”
  • 仿射以及其他更复杂几何变换


    20180423105453782.jpeg
  1. 几何变换的特点:变换前后只改变图像像素的空间位置,不改变像素的像素值

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...)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容