14. OpenCV几何变换 扩展缩放 平移 旋转 仿射变换 透视变换
学习的函数
cv2.INTER_AREA,cv2.INTER_CUBIC,cv2.INTER_LINEAR,cv2.warpAffine(),cv2.getRotationMatrix2D,cv2.wrapAffine,
14.1 扩展缩放
# 14.1 扩展缩放 # cv2.INTER_AREA # cv2.INTER_AREA是OpenCV库中的一个插值方法,用于图像缩放。当图像的尺寸缩小时,使用此方法可以减小计算量和避免像素化。 # cv2.INTER_CUBIC # cv2.INTER_CUBIC是OpenCV库中三次样条插值法,适用于放大图像尺寸。当图像的尺寸放大时,使用此方法可以产生较为平滑的图像效果。 # cv2.INTER_LINEAR # cv2.INTER_LINEAR是OpenCV库中线性插值法,适用于缩小图像尺寸。当图像的尺寸缩小时,使用此方法可以产生较为平滑的图像效果。 # 将图片缩小两倍 import cv2 import numpy as np img = cv2.imread('messi5.jpg') print(img.shape) height,width= img.shape[:2] #获取图像的形状,然后通过切片操作只取前两个元素,即高度和宽度 res = cv2.resize(img,(width//2,height//2),interpolation=cv2.INTER_CUBIC) # 设置输出图像的尺寸 while(1): cv2.imshow('res',res) cv2.imshow('img',img) if cv2.waitKey(1) & 0xFF == 27: break cv2.destroyAllWindows()
14.2 平移
# 14.2 平移 # cv2.warpAffine() #cv2.warpAffine()是OpenCV库中的一个函数,用于对图像进行仿射变换。 #仿射变换是一种二维线性映射,可以表示为一个矩阵乘法的形式。通过指定仿射变换的参数,可以将图像中的点从一个坐标系映射到另一个坐标系,从而实现图像的平移、旋转、缩放等操作。 #使用cv2.warpAffine()函数时,需要提供以下参数: #src:输入图像,可以是彩色或灰度图像。 #M:仿射变换矩阵,由cv2.getRotationMatrix2D()、cv2.getAffineTransform()等函数生成。 #dsize:输出图像的大小,以像素为单位。 #flags:插值方法,可选值为cv2.INTER_LINEAR(线性插值)、cv2.INTER_NEAREST(最近邻插值)、cv2.INTER_AREA(区域插值)等。 #borderMode:边界处理方式,可选值为cv2.BORDER_CONSTANT(常量填充)、cv2.BORDER_REPLICATE(复制边缘像素)、cv2.BORDER_REFLECT(反射边缘像素)等。 #borderValue:边界填充值,仅在borderMode为cv2.BORDER_CONSTANT时有效。 import cv2 import numpy as np def translate_image(img, x, y): # 获取图像的高度和宽度 height, width = img.shape[:2] # 定义平移矩阵 M = np.float32([[1, 0, x], [0, 1, y]]) # 使用cv2.warpAffine()函数进行平移操作 translated_img = cv2.warpAffine(img, M, (width, height)) return translated_img # 读取图像 img = cv2.imread('pingpangqiu.JPG') # 平移图像 translated_img = translate_image(img, 300, 0) # 显示原图和平移后的图像 cv2.imshow('Original Image', img) cv2.imshow('Translated Image', translated_img) # 等待按键,然后关闭窗口 cv2.waitKey(0) cv2.destroyAllWindows()
14.3 旋转
# 14.3 旋转 # cv2.getRotationMatrix2D #cv2.getRotationMatrix2D是OpenCV库中的一个函数,用于获取图像的旋转矩阵。 #cv2.getRotationMatrix2D(center, angle, scale) #其中: #center:旋转中心点的坐标,以元组形式表示,例如(x, y)。 #angle:旋转角度,以度为单位。正值表示逆时针旋转,负值表示顺时针旋转。 #scale:缩放比例,默认为1.0 import cv2 import numpy as np img = cv2.imread('pingpangqiu.JPG',0) rows,cols = img.shape # 获取图像的行数和列数,rows表示图像的行数,cols表示图像的列数 M = np.float32([[1, 0.5, 0], [0, 1, 0]]) dst = cv2.warpAffine(img, M, (2 * cols, 2 * rows)) while(1): cv2.imshow('img',dst) if cv2.waitKey(1) & 0xFF == 27: break cv2.destroyAllWindows()
14.4 仿射变换
# 14.4 仿射变换 # cv2.wrapAffine #cv2.wrapAffine是OpenCV库中的一个函数,用于对图像进行仿射变换。 #cv2.warpAffine(src, M, dsize[, flags[, borderMode[, borderValue]]]) #其中: #src:输入图像,可以是彩色或灰度图像。 #M:仿射变换矩阵,由cv2.getRotationMatrix2D()、cv2.getAffineTransform()等函数生成。 #dsize:输出图像的大小,以像素为单位。 #flags:插值方法,可选值为cv2.INTER_LINEAR(线性插值)、cv2.INTER_NEAREST(最近邻插值)、cv2.INTER_AREA(区域插值)等。 #borderMode:边界处理方式,可选值为cv2.BORDER_CONSTANT(常量填充)、cv2.BORDER_REPLICATE(复制边缘像素)、cv2.BORDER_REFLECT(反射边缘像素)等。 #borderValue:边界填充值,仅在borderMode为cv2.BORDER_CONSTANT时有效。 import cv2 import numpy as np from matplotlib import pyplot as plt img = cv2.imread('drawing.png') rows, cols, ch = img.shape # 获取到图像的行数、列数和通道数 pts1 = np.float32([[50, 50], [200, 50], [50, 200]]) pts2 = np.float32([[10, 100], [200, 50], [100, 250]]) M = cv2.getAffineTransform(pts1, pts2) #获取两个点集之间的仿射变换矩阵。其中pts1和pts2分别是源点集和目标点集。 dst = cv2.warpAffine(img, M, (cols, rows)) # 表示仿射变换矩阵,它是一个2x3的矩阵,用于描述图像在二维空间中的平移、旋转和缩放等变换 # (cols, rows):输出图像的大小,以像素为单位 plt.subplot(121) # 表示创建一个包含两个子图的图形,当前选中的是第一个子图(索引从1开始) plt.imshow(img) plt.title('Input') plt.subplot(122) plt.imshow(dst) plt.title('Output') plt.show()
14.5 透视变换
# 14.5 透视变换 # cv2.warpPerspective() #cv2.warpPerspective()是OpenCV库中的一个函数,用于对图像进行透视变换。 #该函数的语法如下: #cv2.warpPerspective(src, M, dsize[, flags[, borderMode[, borderValue]]]) #src:输入图像,可以是彩色或灰度图像。 #M:透视变换矩阵,由cv2.getPerspectiveTransform()等函数生成。 #dsize:输出图像的大小,以像素为单位。 #flags:插值方法,可选值为cv2.INTER_LINEAR(线性插值)、cv2.INTER_NEAREST(最近邻插值)、cv2.INTER_AREA(区域插值)等。 #borderMode:边界处理方式,可选值为cv2.BORDER_CONSTANT(常量填充)、cv2.BORDER_REPLICATE(复制边缘像素)、cv2.BORDER_REFLECT(反射边缘像素)等。 #borderValue:边界填充值,仅在borderMode为cv2.BORDER_CONSTANT时有效。 import cv2 import numpy as np from matplotlib import pyplot as plt img = cv2.imread('sudoku.jpg') rows, cols, ch = img.shape pts1 = np.float32([[56, 65], [368, 52], [28, 387], [389, 390]]) pts2 = np.float32([[0, 0], [300, 0], [0, 300], [300, 300]]) M = cv2.getPerspectiveTransform(pts1, pts2) dst = cv2.warpPerspective(img, M, (300, 300)) # plt.subplot(121) plt.imshow(img) plt.title('Input') plt.subplot(122) plt.imshow(dst) plt.title('Output') plt.show()
小结
今天学习的关于OpenCV的图像的扩展缩放,平移,旋转,仿射变换,透视变换会在后面图像处理中经常用到,例如人脸识别,车牌识别,答题卡识别等等。之后我会不断的系统的分享关于我对OpenCV的图像处理函数的学习以及图像处理进阶例如人脸识别,车牌识别,答题卡识别等等。大家可以关注,点赞加收藏,一起学习,欢迎评论,私信,我会第一时间回复,谢谢大家。关注我大家一起学习进步。