一、图像的缩放
OpenCv API:
cv2.resize(src, dsize, fx, fy, interpolation)
参数:
- src:输入的图像
- dsize:绝对尺寸,直接将图像调整为指定大小
- fx, fy:相对尺寸,将dsize设置为None时,直接设置fx, fy为比例因子即可
- interpolation:插值方法
插值 | 含义 |
---|---|
cv2.INTER_LINEAR | 双线性插值法 |
cv2.INTER_NEAREST | 最近邻插值 |
cv2.INTER_AREA | 像素区域重采样(默认) |
cv2.INTER_CUBIC | 双三次插值 |
代码编写
import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
src = cv.imread("E:\\qi.png")
img = src.copy()
# 绝对尺寸
rows, cols = img.shape[:2]
res = cv.resize(img, (cols * 2, rows * 2))
# 相对尺寸
res1 = cv.resize(img, None, fx=0.5, fy=0.5)
# 显示图像
fig, axes = plt.subplots(nrows=1, ncols=3, figsize=(10, 8), dpi=100)
axes[0].imshow(img[:, :, ::-1])
axes[0].set_title("原图")
axes[1].imshow(res[:, :, ::-1])
axes[1].set_title("绝对尺寸")
axes[2].imshow(res1[:, :, ::-1])
axes[2].set_title("相对尺寸")
plt.show()
二、图像的平移
OpenCv API:
cv2.warpAffine(src, M, dsize)
参数:
- src:输入的图像
- M:2*3的移动矩阵,格式为
M = [ 1 0 t x 0 1 t y ] \begin{gathered} M= \begin{bmatrix} 1 & 0 & tx \\ 0 & 1 & ty \end{bmatrix} \quad \end{gathered} M=[1001txty]表示x方向移动tx,y方向移动ty
注意: M应设置为np.float32类型的Numpy数组 - dsize:输出图像的大小
注意: 输出图像的大小,应该是(宽度,高度)的形式,width=列数,height=行数
代码编写
例如:将图像移动(50,100)的距离
import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
src = cv.imread("E:\\qi.png")
img = src.copy()
# 平移图像
rows, cols = img.shape[:2]
M = np.float32([[1, 0, 100], [0, 1, 50]])
dst = cv.warpAffine(img, M, (cols, rows))
dst2 = cv.warpAffine(img, M, (cols*2, rows*2))
# 显示图像
fig, axes = plt.subplots(nrows=1, ncols=3, figsize=(10, 8), dpi=100)
axes[0].imshow(img[:, :, ::-1])
axes[0].set_title("原图")
axes[1].imshow(dst[:, :, ::-1])
axes[1].set_title("平移(50,100)")
axes[2].imshow(dst2[:, :, ::-1])
axes[2].set_title("平移(50,100),画布扩大2倍")
plt.show()
三、图像旋转
OpenCv API:
M = cv2.getRotationMatrix2D(center, angle, scale)
dst = cv2.warpAffine(src, M, dsize)
参数:
- center:旋转中心
- angle:旋转角度
- scale:缩放比例
- M:旋转矩阵
代码编写
import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
src = cv.imread("E:\\qi.png")
img = src.copy()
# 旋转图像
M = cv.getRotationMatrix2D((cols/2, rows/2), 90, 1)
dst_rotate = cv.warpAffine(img, M, (cols, rows))
M = cv.getRotationMatrix2D((cols/2, rows/2), 45, 0.5)
dst_rotate2 = cv.warpAffine(img, M, (cols, rows))
# 显示图像
fig, axes = plt.subplots(nrows=1, ncols=3, figsize=(10, 8), dpi=100)
axes[0].imshow(img[:, :, ::-1])
axes[0].set_title("原图")
axes[1].imshow(dst_rotate[:, :, ::-1])
axes[1].set_title("以中心旋转90度")
axes[2].imshow(dst_rotate2[:, :, ::-1])
axes[2].set_title("以中心旋转45度,并缩小1/2")
plt.show()
四、仿射变换
OpenCv API:
M = cv2.getAffineTransform(src, dst)
img = cv2.warpAffine(src, M, dsize)
代码编写
import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
src = cv.imread("E:\\qi.png")
img = src.copy()
# 仿射变换
pts1 = np.float32([[50, 50], [200, 50], [50, 200]])
pts2 = np.float32([[100, 100], [200, 50], [100, 250]])
M = cv.getAffineTransform(pts1, pts2)
dst_affine = cv.warpAffine(img, M, (cols, rows))
# 显示图像
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_affine[:, :, ::-1])
axes[1].set_title("仿射变换")
plt.show()
五、透射变换
OpenCv API:
M = cv2.getPerspectiveTransform(src, dst)
img = cv2.warpPerspective(src, M, dsize)
代码编写
import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
src = cv.imread("E:\\qi.png")
img = src.copy()
# 透射变换
pts1 = np.float32([[56, 65], [368, 52], [28, 387], [389, 390]])
pts2 = np.float32([[100, 145], [300, 100], [80, 290], [310, 300]])
M = cv.getPerspectiveTransform(pts1, pts2)
dst_perspective = cv.warpPerspective(img, M, (cols, rows))
# 显示图像
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_perspective[:, :, ::-1])
axes[1].set_title("透射变换")
plt.show()
六、图像金字塔
图像金字塔是图像多尺度表达的一种,是一种以多分辨率来解释图像的有效但概念简单的结构。一幅图像的金字塔是一系列以金字塔形状排列的分辨率逐步降低,且来源于同一张原始图的图像集合。其通过梯次向下采样获得,直到达到某个终止条件才停止采样。我们将一层一层的图像比喻成金字塔,层级越高,则图像越小,分辨率越低。
OpenCv API:
cv2.pyrUp(src) # 上采样操作
cv2.pyrDown(src) # 下采样操作
代码编写
import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
src = cv.imread("E:\\qi.png")
img = src.copy()
# 图像金字塔
up_img = cv.pyrUp(img)
down_img = cv.pyrDown(img)
# 显示图像
cv.imshow("source", img)
cv.imshow("up_img", up_img)
cv.imshow("down_img", down_img)
cv.waitKey(0)
cv.destroyAllWindows()