opencv实例练习(2)

发布时间 2023-12-05 14:49:54作者: taohuaxiaochunfeng

这里主要做一些图像几何变换的实例练习

Opencv提供了许多基础的图像变换函数,可以用于调整图像的大小、旋转、平移、裁剪等操作。

1、缩放图像

将图像对象缩小了一半并赋值给缩放后的图像

 1 import cv2
 2 import numpy as np
 3 
 4 Lmao = cv2.imread('longmao.jpg')
 5 print(Lmao.shape)
 6 
 7 # 将img图像对象缩小了一半并赋值给了resized
 8 Lmao_half = cv2.resize(Lmao,(int(Lmao.shape[1]/2), int(Lmao.shape[0]/2)))
 9 
10 
11 cv2.imshow('Lmao',Lmao)
12 cv2.imshow('Lmao_half',Lmao_half)
13 
14 cv2.waitKey(0)
15 cv2.destroyAllWindows()、

 2、仿射变换

仿射变换是一种仅在二维平面中发生的几何变形,变换之后的图像仍然可以保持直线的“平直性”和“平行性”,也就是说原来的直线变换之后还是直线,平行线变换之后还是平行线。常见的仿射变换效果如图所示,包含平移、旋转和倾斜。

语法:cv2.warpAffine(src, M, dsize, flags, borderMode, borderValue)

参数说明:src               ------ 原始图像

                  M                 ------ 一个2行3列的矩阵,根据此矩阵的值变换原图中的像素位置,M = [[a, b, c], [d, e, f]]

                  dsize            ------ 输出图像的尺寸大小

                  flags             ------ 可选参数,插值方式,建议使用默认值

                  borderMode ------ 可选参数,边界类型,建议使用默认值

                  borderValue ------ 可选参数,边界值,默认为0,建议使用默认值

图像做何种仿射变换,完全取决于M的值,仿射变换输出的图像按照以下公式进行计算:

新x    =    原x  * a  + 原 y * b  + c

新y    =    原x  * d  + 原 y * e  + f

原x和原y表示原始图像中像素的横坐标和纵坐标,新x与新y表示同一个像素经过仿射变换后在新图像中的横坐标和纵坐标。

2.1、平移

平移就是让图像中的所有像素同时沿着水平或垂直方向移动。实现这种效果只需要将M的值按照以下格式进行设置:
M = [ [1, 0, 水平移动的距离], [0, 1, 垂直移动的距离] ]

原始图像的像素就会按照以下公式进行变换:
新x = 原x × 1 + 原y × 0 + 水平移动的距离 = 原x + 水平移动的距离
新y = 原x × 0 + 原y × 1 + 垂直移动的距离 = 原y + 垂直移动的距离

 1 import cv2
 2 import numpy as np
 3 
 4 Lmao = cv2.imread('Longmao.png')
 5 print(Lmao.shape)
 6 
 7 
 8 #平移图像
 9 tx, ty = Lmao.shape[0]/5, Lmao.shape[1]/5
10 M = np.array([[1,0,tx], [0,1,ty]])
11 Lmao_pingyi = cv2.warpAffine(Lmao,M,dsize=(Lmao.shape[1],Lmao.shape[0]))
12 
13 cv2.imshow('Lmao',Lmao)
14 cv2.imshow('Lmao_pingyi',Lmao_pingyi)
15 
16 cv2.waitKey(0)
17 cv2.destroyAllWindows()

 2.2、旋转

首先获取了图像对象的行数和列数,并分别赋值给了rows和cols变量。

语法:M = cv2.getRotationMatrix2D( center , angel , scale )

参数:center ------图像的旋转中心,是一元祖类型的参数。即在图像构建的坐标系中选取旋转中心。

           angle ------ 旋转角度(角度制),正负值遵循坐标系角度规则。

          scale ------ 图像的缩放比例因子。

 1 import cv2
 2 import numpy as np
 3 
 4 Lmao = cv2.imread('longmao.png')
 5 print(Lmao.shape)
 6 
 7 centers = (Lmao.shape[1]/2, Lmao.shape[0]/2)
 8 M = cv2.getRotationMatrix2D(centers, 30, 1)
 9 
10 # 旋转图像
11 Lmao_xuanzhuan = cv2.warpAffine(Lmao,M,dsize=(Lmao.shape[1],Lmao.shape[0]))
12 
13 cv2.imshow('Lmao',Lmao)
14 cv2.imshow('Lmao_xuanzhuan',Lmao_xuanzhuan)
15 
16 cv2.waitKey(0)
17 cv2.destroyAllWindows()

 2.3、倾斜

OpenCV需要定位图像的3个点来计算倾斜效果,3个点的位置如图所示,这3个点分别是“左上角”点A、“右上角”点B和“左下角”点C。

OpenCV会根据这3个点的位置变化来计算其他像素的位置变化。因为要保证图像的“平直性”和“平行性”,所以不需要“右下角”的点做第4个参数,右下角这个点的位置根据A、B、C 3点的变化自动计算得出。

让图像倾斜也是需要通过M矩阵实现的,于是OpenCV提供了getAffineTransform()方法来自动计算倾斜图像的M矩阵。

语法:M = cv2.getAffineTransform(src, dst)

参数说明:src ------ 原图3个点坐标,格式为3行2列的32位浮点数列表,例如:[ [0, 1], [1, 0], [1, 1] ]

                  dst ------ 倾斜图像的3个点坐标,格式与src一样。

 1 import cv2
 2 import numpy as np
 3 
 4 Lmao = cv2.imread('longmao.png')
 5 print(Lmao.shape)
 6 
 7 rows,cols = len(Lmao),len(Lmao[0])
 8 
 9 # rows1,cols1 = Lmao.shape[0],Lmao.shape[1]
10 # print(rows1,cols1)
11 
12 print(rows,cols)
13 
14 src = np.float32([[0,0], [cols-1,0],[0,rows-1]])
15 dst = np.float32([[0,50],[cols-1,0],[0,rows-1]])
16 
17 M = cv2.getAffineTransform(src,dst)
18 Lmao_qingxie = cv2.warpAffine(Lmao,M,dsize=(Lmao.shape[1],Lmao.shape[0]))
19 
20 cv2.imshow('Lmao',Lmao)
21 cv2.imshow('Lmao_qingxie',Lmao_qingxie)
22 
23 cv2.waitKey(0)
24 cv2.destroyAllWindows()