图像旋转是指图像按照某个位置转动一定角度的过程,旋转中图像仍保持这原始尺寸。图像旋转后图像的水平对称轴、垂直对称轴及中心坐标原点都可能会发生变换,因此需要对图像旋转中的坐标进行相应转换。
假设图像逆时针旋转θ,则根据坐标转换可得旋转转换为:
x′=rcos(α−θ)
y′=rsin(α−θ)
也可以写成:
x′=xcosθ+ysinθ
y′=−xsinθ+ycosθ
在OpenCV中图像旋转首先根据旋转角度和旋转中心获取旋转矩阵,然后根据旋转矩阵进行变换,即可实现任意角度和任意中心的旋转效果。
API:
cv2.getRotationMatrix2D(center, angle, scale)
参数:
返回:
示例
import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
# 1读取图像
img=cv. imread("./images/a1.jpg")
# 2图像旋转
rows, cols = img. shape[:2]
# 2.1生成旋转矩阵
M = cv.getRotationMatrix2D((cols/2, rows/2), 90, 1)
# 2.2进行旋转变换
dst = cv. warpAffine(img, M, (cols, rows))
# 3图像展示
fig, axes = plt. subplots(nrows=1, ncols=2, figsize=(10, 8), dpi=100)
axes[0].imshow(img[:, :, ::-1])
axes[0].set_title("原图")
axes[1].imshow(dst[:, :, ::-1])
axes[1].set_title("旋转后结果")
plt.show()
图像的仿射变换涉及到图像的形状位置角度的变化,是深度学习预处理中常到的功能,仿射变换主要是对图像的缩放,旋转,翻转和平移等操作的组合。
示例:
import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
# 1读取图像
img=cv.imread("./images/a1.jpg")
# 2仿射变换
rows, cols = img.shape[:2]
# 2.1创建变换矩阵
pts1 = np.float32([[50, 50], [200, 50], [50, 200]])
pts2 = np.float32([[100, 100], [200, 50], [100, 250]])
M=cv.getAffineTransform(pts1, pts2)
# 2.2完成仿射变换
dst=cv.warpAffine(img, M, (cols, rows))
# 3图像显示
fig,axes=plt. subplots(nrows=1, ncols=2, figsize=(10, 8), dpi=100)
axes[0].imshow(img[:, :, ::-1])
axes[0].set_title("原图")
axes[1].imshow(dst[:, :, ::-1])
axes[1].set_title("仿射后结果")
plt.show()
透射变换是视角变化的结果,是指利用透视中心、像点、目标点三点共线的条件,按透视旋转定律使承影面(透视面)绕迹线(透视轴)旋转某一角度,破坏原有的投影光线束,仍能保持承影面上投影几何图形不变的变换。
示例:
import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
# 1读取图像
img=cv.imread("./images/a1.jpg")
# 2透射变换
rows, cols = img.shape[:2]
# 2.1创建变换矩阵
pts1 = np.float32([[56, 65], [368, 52], [28, 387], [389, 390]])
pts2 = np.float32([[100, 145], [300, 100], [80, 290], [310, 300]])
T = cv.getPerspectiveTransform(pts1, pts2)
# 2.2进行变换
dst = cv.warpPerspective(img, T, (cols, rows))
# 3图像显示
fig, axes=plt.subplots(nrows=1, ncols=2, figsize=(10, 8), dpi=100)
axes[0].imshow(img[:, :, ::-1])
axes[0].set_title("原图")
axes[1].imshow(dst[:, :, ::-1])
axes[1].set_title("透射变换结果")
plt.show()
图像金字塔是图像多尺度表达的一种,最主要用于图像的分割,是一种以多分辨率来解释图像的有效但概念简单的结构。
图像金字塔用于机器视觉和图像压缩,一幅图像的金字塔是一系列以金字塔形状排列的分辨率逐步降低,且来源于同一张原始图的图像集合。其通过梯次向下采样获得,直到达到某个终止条件才停止采样。
金字塔的底部是待处理图像的高分辨率表示,而顶部是低分辨率的近似,层级越高,图像越小,分辨率越低。
API
cv.pyrUp(img)#对图像进行上采样
cv.pyrDown(img)#对图像进行下采样
示例:
import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
# 1读取图像
img=cv.imread("./images/a1.jpg")
# 2进行图像采样
up_img = cv.pyrUp(img)#上采样操作
img_1 = cv.pyrDown(img)#下采样操作
# 3图像显示
cv.imshow('enlarge', up_img)
cv.imshow('original', img)
cv.imshow('shrink', img_1)
cv.waitKey(0)
cv.destroyAllWindows()