目录
- 问题描述
- 验证分析
- 对图像左右镜像相当于对图像绕着y轴旋转180度
- 对图像上下镜像相当于对图像绕着x轴旋转180度
- 对图像先上下镜像,再左右镜像,相当于对图像沿顺时针旋转180度
问题描述
图像矫正,遇到图像开启上下翻转、左右翻转,很好奇,镜像翻转后的结果与常见的图像旋转操作的关系是什么呢?
验证分析
对图像左右镜像相当于对图像绕着y轴旋转180度
对图像左右镜像相当于对图像将每一行进行顺序反转,或者对图像进行绕y轴的翻转。因此,对图像左右镜像相当于对图像绕着y轴旋转180度。
可以将绕y轴的旋转转换成绕z轴旋转。具体来说,绕着y轴旋转180度可表示为先将原图像绕z轴旋转90度,然后再按照x轴进行翻转。这两个变换的矩阵表示分别为:
R_y(180) = [[-1 0 0], [0 1 0], [0 0 -1]] # 绕y轴旋转180度
F_x = [[1 0 0], [0 -1 0], [0 0 -1]] # 沿x轴进行翻转
将上述两个变换按照矩阵乘法的规则相乘,得到整体的旋转矩阵:
R = F_x * R_z(90) = [[1 0 0], [0 -1 0], [0 0 -1]] * [[0 -1 0], [1 0 0], [0 0 1]]
R = [[0 1 0], [-1 0 0], [0 0 -1]]
该矩阵表示将原图像绕z轴旋转90度,然后沿x轴进行翻转,最终得到的图像与对原图像进行左右镜像后得到的图像是相同的。
绕着z轴旋转90度,相当于将原图像中第i列变换到第width-1-i列,即:
flip(A, 1)[i,j] = A[i, width-1-j]
将j的取值范围从[0, width-1]变为[width-1, 0],即将j -> (widh-1-j),所以:
flip(A, 1) = R * A
因此,对图像进行左右镜像相当于对原图像绕z轴旋转90度,然后沿x轴进行翻转,即将原图像按照上述的旋转矩阵做矩阵乘法即可。
对图像上下镜像相当于对图像绕着x轴旋转180度
将原始图像绕着x轴旋转180度得到的图像就是对原始图像进行上下镜像的结果。因此,对图像上下镜像相当于对图像绕着x轴旋转180度。
绕着x轴旋转180度,相当于绕着y轴旋转180度再绕着z轴旋转180度,即先左右镜像再沿着垂直于图像平面的轴旋转180度。因此,对图像上下镜像相当于对图像左右镜像再相对于垂直于图像平面的轴进行180度旋转。这个轴在图像坐标系中对应的是x轴。
绕着x轴旋转180度的旋转矩阵表示为:
R_x(180) = [[1 0 0], [0 -1 0], [0 0 -1]]
其中,R_x(180)[i,j]表示旋转后的i轴上的j分量。对于图像中的像素点(x,y),它的坐标经过旋转变换后的新坐标为(x’,y’,z’),其中:
x' = x
y' = -y
z' = -z
因此,对图像上下镜像相当于将y坐标取反,即:
flip(A, 0)[i,j] = A[height-1-i,j]
将i的取值范围从[0, height-1]变为[height-1, 0],即将i -> (height-1-i),所以:
flip(A, 0) = R_x(180) * A
换句话说,对图像上下镜像等价于对原图像进行绕x轴旋转180度,即将原图像按照上述的旋转矩阵做矩阵乘法即可。
对图像先上下镜像,再左右镜像,相当于对图像沿顺时针旋转180度
对图像左右镜像,再做上下镜像相当于对图像先绕着y轴旋转180度,再绕着x轴旋转180度。可以将该变换写成以下矩阵的形式:
R = [[-1 0 0], [0 -1 0], [0 0 1]] * [[1 0 0], [0 -1 0], [0 0 -1]]
R = [[-1 0 0], [0 1 0], [0 0 -1]]
R表示先沿y轴进行翻转,再沿x轴进行翻转,相当于将原始图像先翻转180度,再沿着垂直于图像平面的轴旋转180度。
因此,对图像左右镜像,再做上下镜像相当于将原始图像绕着垂直于图像平面的轴旋转180度。这个轴在图像坐标系中对应的是z轴。``
对图像先上下镜像,再左右镜像,与对图像沿顺时针旋转180度是等效的,因为这两种操作会得到相同的图像。可以通过简单的推导来证明它们是等效的。
假设原始图像为A,先对A进行上下镜像得到A',然后对A'进行左右镜像得到A",即:
A' = flip(A, 0) # 上下镜像 A" = flip(A', 1) # 左右镜像,即对A进行水平镜像
根据flip函数的定义,有:
`
```powershell
flip(A, 0)[i,j] = A[height-1-i,j], 0 <= i < height, 0 <= j < width
flip(A, 1)[i,j] = A[i, width-1-j], 0 <= i < height, 0 <= j < width
将A"中的坐标表示代入上式中,有:
A"[i,j] = flip(A', 1)[i,j] = A'[i, width-1-j] = flip(flip(A, 0), 1)[i,j] = flip(flip(A, 1), 0)[height-1-i,j]
因此,对A先进行上下镜像再左右镜像,相当于对A进行沿顺时针旋转180度,即:
flip(flip(A, 1), 0) = flip(flip(A, 0), 1) = flip(A, -1) = rotate(A, 180)
所以,这两种操作都会得到与对图像沿顺时针旋转180度的相同结果。