图像变换
图像的放大与缩小
-
图像缩放
- resize(src, dst, dsize, fx, fy, interpolation)
- src: 源
- sdt: 目的 缩放完的输出结果
- dsize: 目标的大小,比如目前是640x360,需要放大到1280x720,此处写入1280*720即可
- fx: x轴的缩放因子
- fy: y轴的缩放因子
- dsize与fx fy冲突,存在一种即可
- interpolation: 插值算法,缩放时的算法
- INTER_NEAREST: 邻近插值,速度快,效果差。
- INTER_LINEAR: 双线性插值,原图中的4个点(该算法是默认算法)。
- INTER_CUBIC: 三次插值,原图中的16个点。
- INTER_AREA: 效果最好,根据一片区域进行计算。
- resize(src, dst, dsize, fx, fy, interpolation)
图像的翻转
-
flip(img, flipCode)
- flipCode == 0: 上下翻转
- flipCode > 0: 左右翻转
- flipCode < 0: 上下 + 左右翻转
图像的旋转
-
rotate(img, rotateCode)
- ROTATE_90_CLOCKWISE: 顺时针旋转90度
- ROTATE_180: 旋转180度
- ROTATE_90_COUNTERCLOCKWISE: 反向90度 结果270度
图像的仿射变换
- 仿射变换是图像旋转、缩放、平移的总称
- warpAffine(src, M, dsize, flags, mode, value)
- src: 源
- M: 变换矩阵(如果进行平移,就是2x3的矩阵)
- dsize: 输出尺寸大小
- flags: 与resize中的插值算法一致
- mode: 边界外推发标志
- value: 填充边界的值
图像的平移(平移矩阵)
- 矩阵中的每个像素由(x, y)组成
- 因此,其变换矩阵式2x2的矩阵
-
平移向量为2x1的向量,所在平移矩阵为2x3矩阵
仿射变换获取变换矩阵
-
getRotationMatrix2D(center, angle, scale) 自动生成
- center 中心点,图片在旋转的时候是以哪为中心点
- angle 角度,旋转的角度,是按照逆时针旋转的
- scale 缩放比例
仿射变换变换矩阵之二
-
getAffineTransform 通过三个点可以确定变换的位置
import cv2 import numpy as np dog = cv2.imread('./dog.jpeg') h, w, ch = dog.shape src = np.float32([[400, 300], [800, 300], [400, 1000]]) dst = np.float32([[200, 400], [600, 500], [150, 1100]]) M = cv2.getAffineTransform(src, dst) new = cv2.warpAffine(dog, M, (w, h)) cv2.imshow('dog', dog) cv2.imshow('new', new) cv2.waitKey(0)
OpenCV透视变换
- warpPerspective(img, M, dsize, ...) 透视变换API
- img 源
- M 变换矩阵
- dsize 目标输出的图像大小
-
getPersectiveTransform(src, dst) 获取透视变换矩阵
- src 源
- dst 目的(四个点)
import cv2 import numpy as np img = cv2.imread('perspective.jpeg') src = np.float32([[100, 1100], [2100, 1100], [0, 4000,], [2500, 3900]]) dst = np.float32([[0, 0], [2300, 0], [0, 3000], [2300, 3000]]) M = cv2.getPerspectiveTransform(src, dst) new = cv2.warpPerspective(img, M, (2300, 3000)) cv2.imshow('orgin', img) cv2.imshow('new', new) cv2.waitKey(0) cv2.imwrite('./math.png', new)