5 图像的基本变换
5.1 图像的放大与缩小
- cv2.resize(src, dsize[, dst[, fx[, fy[, interpolation]]]])
其中interpolation:插值算法主要有以下几种:
- INTER_NEAREST:邻近插值,速度快,效果差
- INTER_LINEAR:双线性插值,使用原图中的4个点进行插值
- INTER_CUBIC:三次插值,原图中的16个点
- INTER_AREA:区域插值,效果最好,计算时间最长
import cv2
import numpy as np
#导入图片
dog = cv2.imread('./dog.jpeg')
#要缩放的图片,缩放之后图片的大小,缩放之后的输出图片,x轴(宽度)、y轴(高度)缩放比,插值算法
new_dog1 = cv2.resize(dog, dsize=(800, 800), interpolation=cv2.INTER_NEAREST)
new_dog2 = cv2.resize(dog, dsize=(800, 800), interpolation=cv2.INTER_LINEAR)
new_dog3 = cv2.resize(dog, dsize=(800, 800), interpolation=cv2.INTER_CUBIC)
new_dog4 = cv2.resize(dog, dsize=(800, 800), interpolation=cv2.INTER_AREA)
#按照x,y轴的比例进行缩放
new_dog = cv2.resize(dog, dsize=None, fx=0.5, fy=0.5)
cv2.imshow('new_dog1', new_dog1)
cv2.imshow('new_dog2', new_dog2)
cv2.imshow('new_dog3', new_dog3)
cv2.imshow('new_dog4', new_dog4)
cv2.imshow('new_dog', new_dog)
cv2.waitKey(0)
cv2.destroyAllWindows()
5.2 图像的翻转与旋转
5.2.1 图像的翻转
- cv2.flip(src, flipCode[, dst]):图像翻转
– flipCode = 0:上下翻转
– flipCode > 0:左右翻转
– flipCode < 0:上下左右翻转
#翻转
import cv2
import numpy as np
#导入图片
dog = cv2.imread('./dog.jpeg')
new_dog = cv2.flip(dog, -1)
cv2.imshow('dog', new_dog)
cv2.waitKey(0)
cv2.destroyAllWindows()
5.2.2 图像的旋转
- cv2.rotate(src, rotateCode[, dst]):图像旋转
– rotateCode:
– 1.ROTATE_90_CLOCKWISE:90°顺时针旋转
– 2.ROTATE_180:180°旋转
– 3.ROTATE_90_COUNTERCLOCKWISE:90°逆时针旋转
#旋转
import cv2
import numpy as np
dog = cv2.imread('./dog.jpeg')
new_dog = cv2.rotate(dog, retateCode=cv2.ROTATE_90_COUNTERCLOCKWISE)
cv2.imshow('dog', new_dog)
cv2.waitKey(0)
cv2.destroyAllWindows()
5.3 图像的仿射变换
- 仿射变换是图像旋转、缩放、平移的总称。具体的做法是通过一个矩阵和原图片坐标进行计算,得到新的坐标,完成变换。关键就是这个变换矩阵。
- cv2.warpAffine(src, M, dsize[, dst[, flags[, borderMode[, borderValue]]]])
5.3.1 仿射变换之平移
import cv2
import numpy as np
dog = cv2.imread('./dog.jpeg')
h, w, ch = dog.shape
#变换矩阵,最少是float32位的
M = np.float32([[1, 0, 100], [0, 1, 0]])
#注意OpenCV中先宽度后高度, 原图,变换矩阵,输出图片的大小,插值算法,边界外推法标志,填充边界值
new = cv2.warpAffine(dog, M, (w, h))
cv2.imshow('new', new)
cv2.waitKey(0)
cv2.destroyAllWindows()
5.3.2 获取变换矩阵
仿射变换的关键就是计算变换矩阵,我们不可能每次都自己手算,OpenCV提供了计算变换矩阵的API。
- cv2.getRotationMatrix2D(center, angle, scale)
– center:图片以该点作为旋转的中心点
– angle:旋转的角度(逆时针方向)
– scale:缩放比例;想法图片进行什么样的缩放
import cv2
import numpy as np
dog = cv2.imread('./dog.jpeg')
h, w, ch = dog.shape
M = cv2.getRotationMatrix2D((w/2, h/2), 15, 1.0)
new = cv2.warpAffine(dog, M, (w, h))
cv2.imshow('new', new)
cv2.waitKey(0)
cv2.destroyAllWindows()
- cv2.getAffineTransform(src, dst):通过三点可以确定变换后的位置,相当于解方程,3个点对应三个方程,能解出偏移的参数和旋转的角度。
– src:原目标的三个点
– dst:对应变换后的三个点
import cv2
import numpy as np
dog = cv2.imread('./dog.jpeg')
h, w, ch = dog.shape
#一般是横向和纵向的点,所以一定会有2个点横坐标相同,2个点纵坐标相同
src = np.float32([[200, 100], [300, 100], [200, 300]])
dst = np.float32([[100, 150], [360, 200], [200, 120]])
M = cv2.getAffineTransform(src, dst)
new = cv2.warpAffine(dog, M, (w, h))
cv2.imshow('new', new)
cv2.waitKey(0)
cv2.destroyAllWindows()
5.4 透视变换
透视变换就是将一种坐标系变换成另一种坐标系。简单来说可以把一张“斜”的图变“正”。
- cv2.warpPerspective(src, M, dsize[, dst[, flags[, borderMode[, borderValue]]]])
- M是一个3 * 3的矩阵
- cv2.getPerspectiveTransform(src, dst):获取透视变换的变换矩阵,需要4个点,即图片的四个角
import cv2
import numpy as np
img = cv2.imread('./123.png')
print(img.shape)
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('img', img)
cv2.imshow('new', new)
cv2.waitKey(0)
cv2.destroyAllWindows()