14. OpenCV几何变换 扩展缩放 平移 旋转 仿射变换 透视变换(韩详细代码注释)

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.1

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.2

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.3

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.4

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()

14.5

小结

今天学习的关于OpenCV的图像的扩展缩放,平移,旋转,仿射变换,透视变换会在后面图像处理中经常用到,例如人脸识别,车牌识别,答题卡识别等等。之后我会不断的系统的分享关于我对OpenCV的图像处理函数的学习以及图像处理进阶例如人脸识别,车牌识别,答题卡识别等等。大家可以关注,点赞加收藏,一起学习,欢迎评论,私信,我会第一时间回复,谢谢大家。关注我大家一起学习进步。