实现旋转、平移和缩放图片
了解仿射变换和透视变换
OpenCV函数:cv2.resize(), cv2.warpAffine(), cv2.warpPerspective()
缩放
可以按照比例缩放,也可以按照指定的大小缩放
resize(src, dsize, dst=None, fx=None, fy=None, interpolation=None)
平移图片(用仿射变换来完成的)
warpAffine(src, M, dsize, dst=None, flags=None, borderMode=None, borderValue=None)
M为变换矩阵
borderMode: 边界像素模式,有默认值BORDER_CONSTANT
borderValue: 边界取值,有默认值Scalar()即0
旋转图片
旋转同平移一样,也需要定义一个变换矩阵。OpenCV直接提供了cv2.getRotationMatrix2D()函数用来生成这个矩阵,
getRotationMatrix2D(center, angle, scale)
(中心点,角度,缩放)
翻转图片
镜像翻转图片,可以用cv2.flip()函数
flip(src, flipCode, dst=None)
参数2 = 0:垂直翻转(沿x轴),参数2 > 0: 水平翻转(沿y轴),参数2 < 0: 水平垂直翻转。
仿射变换
要生成这个变换矩阵,需要定义变换前后的三个点,
生成变换矩阵 getAffineTransform(src, dst)
透视变换
透视变换绝对是一项很酷的功能。我们经常会用手机去拍身份证和文件,无论你怎么拍,貌似都拍不正或者有边框。如果你使用过手机上面一些扫描类软件,比如”扫描全能王“,”Office Lens“,它们能很好地矫正图片。
生成透视变换矩阵
getPerspectiveTransform(src, dst)
透视变换
warpPerspective(src, M, dsize, dst=None, flags=None, borderMode=None, borderValue=None)
# -*-encoding:utf-8-*- import pytesseract from PIL import Image from PIL import ImageFilter from PIL import ImageFont from PIL import ImageDraw import numpy as np from PIL import Image import cv2 def main(): # 颜色空间转换 img = cv2.imread("learn.jpg") # =================================缩放 # 按照指定的宽度、高度缩放图片 res = cv2.resize(img, (150, 150)) # 按照比例缩放,如x,y轴均放大一倍 res2 = cv2.resize(img, None, fx=0.5, fy=0.5, interpolation=cv2.INTER_LINEAR) # cv2.imshow('shrink', res) # cv2.imshow('zoom', res2) # cv2.waitKey(0) # =================================平移图片 rows, cols = img.shape[:2] print("rows = ", rows) print("cols = ", cols) M = np.float32([[1, 0, 100], [0, 1, 50]]) # x轴平移100,y轴平移50, # 用仿射变换实现平移(平移后的位置用黑包色填充(borderValue指定)) dst = cv2.warpAffine(img, M, (cols, rows), borderValue=(255, 255, 255)) # cv2.imshow('shift', dst) # cv2.waitKey(0) # =================================旋转图片 M = cv2.getRotationMatrix2D((cols / 2, rows / 2), 45, 1) print("Rotation M = ", M) dst = cv2.warpAffine(img, M, (cols, rows)) # cv2.imshow('rotation', dst) # cv2.waitKey(0) # =================================翻转图片 dst = cv2.flip(img, 1) # 参数2 = 0:垂直翻转(沿x轴),参数2 > 0: 水平翻转(沿y轴),参数2 < 0: 水平垂直翻转。 # cv2.imshow('flip', dst) # cv2.waitKey(0) # =================================仿射变换 # 变换前的三个点 pts1 = np.float32([[50, 65], [150, 65], [210, 210]]) # 变换后的三个点 pts2 = np.float32([[50, 100], [150, 65], [100, 250]]) # 生成变换矩阵 M = cv2.getAffineTransform(pts1, pts2) print("getAffineTransform M = ", M) dst = cv2.warpAffine(img, M, (cols, rows)) # # cv2.imshow('warpAffine', dst) # cv2.waitKey(0) # =================================透视变换 # 原图中卡片的四个角点 pts1 = np.float32([[148, 80], [437, 114], [94, 247], [423, 288]]) # 变换后分别在左上、右上、左下、右下四个点 pts2 = np.float32([[0, 0], [320, 0], [0, 178], [320, 178]]) # 生成透视变换矩阵 M = cv2.getPerspectiveTransform(pts1, pts2) print("getPerspectiveTransform M = ", M) # 进行透视变换 dst = cv2.warpPerspective(img, M, (cols, rows)) cv2.imshow('warpAffine', dst) cv2.waitKey(0) if __name__ == '__main__': main()