1. 学习目标
- 学习图像的缩放矩阵;
- 学习 OpenCV 图像缩放函数 cv.resize 和 cv.warpAffine。
2. 图像的缩放矩阵
缩放是物体在 x 轴和 y 轴的缩放比例。
- fx 是图像在 x 轴的缩放比例,fy 是图像在 y 轴的缩放比例,公式:

3. 图像缩放函数
3.1 cv.warpAffine() 函数使用
cv.warpAffine(src, M, dsize[, dst[, flags[, borderMode[, borderValue]]]]) → dst
3.2 参数说明
| 参数 | 说明 |
|---|
| src | 表示输入图像。 |
| M | 表示变换矩阵,2行3列。 |
| dsize | 表示输出图像的大小,二元元组 (width, height)。 |
| dst | 表示变换操作的输出图像,可选项。 |
| flags | 表示插值方法,整型(int),可选项。 |
| borderMode | 表示边界像素方法,整型(int),可选项,默认值为 cv.BORDER_REFLECT。 |
| borderValue | 表示边界填充值,可选项,默认值为 0(黑色填充)。 |
3.3 flags 值说明
| 值 | 说明 |
|---|
| cv.INTER_LINEAR | 表示线性插值,默认选项。 |
| cv.INTER_NEAREST | 表示最近邻插值。 |
| cv.INTER_AREA | 表示区域插值。 |
| cv.INTER_CUBIC | 表示三次插值。 |
| cv.INTER_LANCZOS4 | 表示 Lanczos 插值。 |
4. cv.resize() 实现图像的缩放和大小变化
4.1 cv.resize() 函数使用
cv.resize(src, dsize[, dst[, fx[, fy[, interpolation]]]]) → dst
4.2 参数说明
| 参数 | 说明 |
|---|
| src | 表示输入图像。 |
| dsize | 表示输出图像的大小,二元元组 (width, height)。 |
| dst | 表示变换操作的输出图像,可选项。 |
| fx | 表示 x 轴上的缩放比例,实型,可选项。 |
| fy | 表示 y 轴上的缩放比例,实型,可选项。 |
| interpolation | 表示插值方法,整型,可选项。 |
4.3 interpolation 值说明
| 值 | 说明 |
|---|
| cv.INTER_LINEAR | 表示双线性插值(默认方法)。 |
| cv.INTER_AREA | 表示使用像素区域关系重采样,缩小图像时可以避免波纹出现。 |
| cv.INTER_NEAREST | 表示最近邻插值。 |
| cv.INTER_CUBIC | 表示 4x4 像素邻域的双三次插值。 |
| cv.INTER_LANCZOS4 | 表示 8x8 像素邻域的Lanczos插值。 |
5. cv.warpAffine 图像缩放实例
5.1 实例代码
import cv2 as cv
import numpy as np
def image_zoom(src, zx=1, zy=1):
h,w,c = src.shape
M = np.float32([[1*zx,0,0],[0,1*zy,0]])
img = cv.warpAffine(src,M,(int(w*zx),int(h*zy)))
return img
if __name__ == "__main__":
img = cv.imread("./images/lena.jpg")
cv.imshow("origin", img)
img_zoom_half = image_zoom(img, 0.5,0.5)
cv.imshow("zoom0.5", img_zoom_half)
img_zoom_10 = image_zoom(img, 1.1,1.1)
cv.imshow("zoom1.1", img_zoom_10)
cv.waitKey(0)
cv.destroyAllWindows()
5.2 效果

6. cv.resize 图像缩放实例
6.1 实例代码
import cv2 as cv
import numpy as np
# 图像缩放
def image_resize(src):
h,w,c = src.shape
zoom_size = cv.resize(src,(int(w*0.5),int(h*0.5)))
cv.imshow("zoom_size", zoom_size)
zoom_scale = cv.resize(src,None,fx=0.5,fy=0.5)
cv.imshow("zoom_scale", zoom_scale)
if __name__ == "__main__":
img = cv.imread("./images/lena.jpg")
cv.imshow("origin", img)
image_resize(img)
cv.waitKey(0)
cv.destroyAllWindows()
6.2 效果

7. 总结
- 变换缩放矩阵 M 是 np.float32 类型 ndarray 二维数组(2行*3列)。
- 变换矩阵 M = np.float32([[1 * zx,0,0],[0,1 * zy,0]]),zx 表示 x 轴的缩放比例,zy 表示 y 轴的缩放比例。
- dsize 输出图像的大小格式为元组 (width, height)。
- 图像缩放可以通过 dsize 直接设定输出图像的大小,也可以通过 dx, dy 设置图像缩放的比例(dsize 设为 None)。