数字图像处理之图像几何变换

1.裁剪、放大、缩小

裁剪

实现:数组选择方法(冒号)

1
2
3
img = cv.imread('pic/rabbit500x333.jpg')
rabbit = img[150:450, 50:300, :] #选取范围,行列层,即yx
show(rabbit)

放大缩小

实现:resize( ) 函数

1
2
3
4
5
# opencv x, y	在openCV中顺序是xy
img2 = cv.resize(img, (500, 400))
show(img2)

img3 = cv.resize(img, (500, 400), interpolation=cv.INTER_NEAREST) #使用特定差值方法

不同插值方式差距不大

放大选用 cv.INTER_LINEAR

缩小选用 cv.INTER_AREA

2.平移变换

实现:平移矩阵

仿射:平移 + 线性 (第三行为1)

透视: (第三行不为1)

1
2
3
4
5
6
7
8
M = np.array([
[1, 0, 100],
[0, 1, 50]
], dtype=np.float32) #变换矩阵

img2 = cv.warpAffine(img, M, (533, 560))
#仿射变换(原图像,变换矩阵,图像最终大小)
show(img2)

3.错切变换


错切效果图

实现:错切矩阵

水平错切

垂直错切

1
2
3
4
5
6
7
M = np.array([
[1, 0.2, 0],
[0, 1, 0]
], dtype=np.float32)
img3 = cv.warpAffine(img, M, (533,500))
#仿射变换(原图像,变换矩阵,图像最终大小)
show(img3)

4.镜像变换

实现:镜像矩阵

f~w~ 为图像宽度,f~H~为图像高度

水平镜像

垂直镜像

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#仿射变换方法
#水平镜像
Mx = np.array([
[-1, 0, 333],
[0, 1, 0]
], dtype=np.float32)

img2 = cv.warpAffine(img, Mx, (333, 500))
show(img2)
#垂直镜像
My = np.array([
[1, 0, 0],
[0, -1, 500]
], dtype=np.float32)

img3 = cv.warpAffine(img, My, (333, 500))
show(img3)

#函数方法
img4 = cv.flip(img, 1) #水平镜像
img5 = cv.flip(img, 0) #垂直镜像
img6 = cv.flip(img, -1) #水平镜像、垂直镜像
show(np.hstack([img, img4, img5, img6]))

5.旋转变换

实现:旋转矩阵


旋转效果图
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#仿射变换方式
beta = np.pi / 4
M = np.array([
[np.cos(beta), np.sin(beta), 0],
[-np.sin(beta), np.cos(beta), 0]
], dtype=np.float32)

img2 = cv.warpAffine(img, M, (533, 500))
show(img2)

#函数获得变换矩阵
h, w, c = img.shape
M2 = cv.getRotationMatrix2D((w//2, h//2), 45, 1)
img3 = cv.warpAffine(img, M2, (533, 500))
show(img3)
#旋转函数生成(旋转中心,旋转角度,放大或缩小)
#旋转角度是角度制的,第三位为1表示不缩放

#函数方式-只能旋转90
img4 = cv.rotate(img, cv.ROTATE_90_CLOCKWISE)

6.透视变换

应用:车到检测、图片矫正


透视变换效果图
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
src = np.array([
[210, 50],
[610, 270],
[650, 470],
[150, 450]
], dtype=np.float32) #原图中要变正矩形的四个角的点

dst = np.array([
[150, 50],
[650, 50],
[650, 470],
[150, 470]
], dtype=np.float32) #矩形变正后的点坐标(自己定义)

M = cv.getPerspectiveTransform(src, dst) #获取透视变换矩阵

h, w, c = img.shape
img2 = cv.warpPerspective(img, M, (w, h))
#应用在透视矩阵变换上