(4)图像的几何变换
import cv2 # opencv读取的格式是BGR
# import matplotlib.pyplot as plt # Matplotlib是RGB
import numpy as np
import time
# .........................缩放............................
# 1.dsize参数实现缩放
img = cv2.imread('1.jpeg')
dst1 = cv2.resize(img, (100, 100)) # 缩小
dst2 = cv2.resize(img, (900, 900)) # 放大
# cv2.imshow('dst1', dst1)
# cv2.imshow('dst2', dst2)
# 2.fx和fy参数实现缩放
# 新图像宽度 = round(fx × 原图像宽度)
# 新图像高度 = round(fy × 原图像高度)
# dsize参数值必须使用None,否则fx和fy失效。
dst3 = cv2.resize(img, None, fx=1/3, fy=1/2)
dst4 = cv2.resize(img, None, fx=3, fy=2)
# cv2.imshow('dst3', dst3)
# cv2.imshow('dst4', dst4)
# .........................翻转............................
# flip:改变,快速翻动
dst5 = cv2.flip(img, 0) # 沿x轴翻转
dst6 = cv2.flip(img, 1) # 沿y轴翻转
dst7 = cv2.flip(img, -1) # 同时沿x轴和y轴翻转
# cv2.imshow('img', img)
# cv2.imshow('dst5', dst5)
# cv2.imshow('dst6', dst6)
# cv2.imshow('dst7', dst7)
# .........................仿射变换............................
# 仿射矩阵M = [[a, b, c],[d, e, f]]
# 新x = 原x × a + 原y × b + c
# 新y = 原x × d + 原y × e + f
# 1.平移
# M = [[1, 0, 水平移动的距离],[0, 1, 垂直移动的距离]]
# 新x = 原x × 1 + 原y × 0 + 水平移动的距离 = 原x + 水平移动的距离
# 新y = 原x × 0 + 原y × 1 + 垂直移动的距离 = 原y + 垂直移动的距离
rows = len(img) # 像素行数,len函数特定用法
cols = len(img[0]) # 像素列数,len函数特定用法
# M = np.float32([[1, 0, 50], [0, 1, 100]]) # 图像向右移动50像素、向下移动100像素
# M = np.float32([[1, 0, 0], [0, 1, -50]]) # 横坐标不变 纵坐标向上移动50像素
M = np.float32([[1, 0, -200], [0, 1, 0]]) # 横坐标向左移动200像素 纵坐标不变
dst8 = cv2.warpAffine(img, M, (cols, rows))
# cv2.imshow('dst8', dst8)
# 2.旋转
center = (rows/2, cols/2) # 图像的中心点
M = cv2.getRotationMatrix2D(center, 30, 0.8) # 以图像为中心,逆时针旋转30度,缩放0.8倍
dst9 = cv2.warpAffine(img, M, (cols, rows))
# cv2.imshow('dst9', dst9)
# 3.倾斜
p1 = np.zeros((3, 2), np.float32) # 32位浮点型空列表,原图三个点
p1[0] = [0, 0] # 左上角坐标
p1[1] = [cols - 1, 0] # 右上角坐标
p1[2] = [0, rows - 1] # 左下角坐标
p2 = np.zeros((3, 2), np.float32) # 32位浮点型空列表,倾斜图三个点
# # 右倾斜
# p2[0] = [50, 0] # 左上角坐标,右移50像素
# p2[1] = [cols - 1, 0] # 右上角坐标,位置不变
# p2[2] = [0, rows - 1] # 左下角坐标,位置不变
# # 左倾斜
p2[0] = [0, 0] # 左上角坐标,位置不变
p2[1] = [cols - 1 - 50, 0] # 右上角坐标,左移50像素
p2[2] = [50, rows - 1] # 左下角坐标,右移50像素
M = cv2.getAffineTransform(p1, p2) # 根据三个点的变化计算出M矩
dst10 = cv2.warpAffine(img, M, (cols, rows))
# cv2.imshow('dst10', dst10)
# 3.透视
# 模拟从底部观察图像得到的透视效果,将图像顶部边缘收窄,底部边缘保持不变
p1 = np.zeros((4, 2), np.float32) # 32位浮点型空列表,原图4个点
p1[0] = [0, 0] # 左上角坐标
p1[1] = [cols - 1, 0] # 右上角坐标
p1[2] = [0, rows - 1] # 左下角坐标
p1[3] = [cols - 1, rows - 1] # 右下角坐标
p2 = np.zeros((4, 2), np.float32) # 32位浮点型空列表,倾斜图三个点
p2[0] = [90, 0] # 左上角坐标,右移90像素
p2[1] = [cols - 90, 0] # 右上角坐标,左移90像素
p2[2] = [0, rows - 1] # 右下角坐标,位置不变
p2[3] = [cols - 1, rows - 1] # 右上角坐标,位置不变
M = cv2.getPerspectiveTransform(p1, p2) # 根据4个点的变化计算出M矩
dst11 = cv2.warpPerspective(img, M, (cols, rows))
# cv2.imshow('dst11', dst11)
cv2.waitKey()
cv2.destroyAllWindows()