Opencv学习笔记(4)

发布时间 2023-12-04 15:42:30作者: taohuaxiaochunfeng

进一步学习灵活的操作!

1、图像的旋转和平移

旋转和平移都是借助cv2.warpAffine()函数实现的,其区别是转换矩阵M的不同。

旋转利用cv2.getRotationMatrix2D()函数构造旋转矩阵,平移矩阵利用二维数组构建。

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

其中,src------源图像,M------转换矩阵

          desize------tuple类型参数。目标图像的宽高,即新的图像宽高(新的图像可能包含部分或者全部变换后的图像,其他区域一般由黑色像素填充)。

          dst------目标图像,在python中无任何意义,一般不传参或设成None。

          flags---插值方法。cv2.INTER_NEAREST,最近邻插值;cv2.INTER_LINEAR,线性插值(默认值);cv2.INTER_AREA,区域插值;cv2.INTER_CUBIC,三次样条插值等。

          borderMode ------边界像素模式

          borderValue ------边界填充值(即显示框内图像之外的区域),默认值为0.

 

旋转矩阵的构造:

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

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

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

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

 

平移矩阵的构造

语法:构造数组,2Darray = np.ndarray([[1,0,tx],[0,1,ty]])

参数:tx ------正值,图像将右移[tx]个像素;负值,将向左移[ tx]个像素。

           ty ------正值,图像将下降[ty]个像素;负值,将向上移[ty]个像素。

平移矩阵,M = 2Darray

相关例子:

 1 import cv2
 2 import numpy as np
 3 
 4 car = cv2.imread('car.png')
 5 print(car.shape)
 6 height, width = car.shape[:2]
 7 
 8 # 旋转图像
 9 center = (width/3 , height/10)
10 rotate_matrix = cv2.getRotationMatrix2D(center, -15, scale = 1.2)
11 rotate_car    = cv2.warpAffine(car, rotate_matrix, dsize = (500,300))
12 
13 # 原图像以坐标(width/3 , heigjht/10)为旋转中心旋转-15度然后再缩放1.2倍
14 
15 cv2.imshow('original_imag',car)
16 cv2.imshow('rotate',rotate_car)
17 cv2.waitKey(0)
18 cv2.destroyAllWindows()

 1 import cv2
 2 import numpy as np
 3 
 4 car = cv2.imread('car.png')
 5 print(car.shape)
 6 height, width = car.shape[:2]
 7 
 8 #平移图像
 9 tx, ty = width/5, -height/5
10 translation_matrix = np.array([[1,0,tx], [0,1,ty]])
11 translation_car = cv2.warpAffine(car,translation_matrix,dsize=(500,300))
12 cv2.imshow('original_img',car)
13 cv2.imshow('translation_car',translation_car)
14 cv2.waitKey(0)
15 cv2.destroyAllWindows()

 2、图像翻转

 图像翻转,也就是通常所说的镜像。主要包括垂直翻转、水平翻转、水平垂直翻转。

 语法:cv2.flip( src, flipCode)

 src         ------ 源图像

 flipCode ------ 翻转方式。  flipCode == 0 , 垂直翻转(沿x轴翻转)

                                           flipCode > 0 ,    水平翻转(沿y轴翻转)

                                           flipCode < 0 ,    水平垂直翻转(先沿X轴翻转,再沿Y轴翻转,等价于旋转180°)

 1 import cv2
 2 import numpy as np
 3 
 4 car = cv2.imread('car.png')
 5 # 翻转图像
 6 flip_cat1 = cv2.flip(car, flipCode=0)
 7 flip_cat2 = cv2.flip(car, flipCode=1)
 8 flip_cat3 = cv2.flip(car, flipCode=-1)
 9 
10 combined = np.hstack((car,flip_cat1,flip_cat2,flip_cat3))
11 cv2.imshow('combined',combined)
12 cv2.waitKey(0)
13 cv2.destroyAllWindows()