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)。