opencv 图像几何变换

阅读更多
opencv 图像几何变换

实现旋转、平移和缩放图片
了解仿射变换和透视变换
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()








你可能感兴趣的:(opencv 图像几何变换)