
湖海一书生
人总要仰望点什么,向着高远,支撑起生命和灵魂。
使用 OpenCV 缩放图片
在 OpenCV 中,我们使用 resize()
方法来缩放图片。
dst = resize(src, dsize[, dst[, fx[, fy[, interpolation]]]])
1
# 参数列表
参数 | 是否必需 | 具体含义 |
---|---|---|
src | 是 | 原图像,可以是图片路径或者图片对象 |
dsize | 是 | 缩放后的图像大小 |
dst | 否 | 目标图像,但是在 Python 里面没有任何意义。一般不传参或者设成 None |
fx,fy | 否 | x 和 y 方向上的缩放比例 |
interpolation | 否 | 插值方式,本质是一个 int 数值,一般用内置的枚举来提高代码可读性。 |
# 使用指定的宽高来缩放图片
import cv2
import numpy as np
# 读取图片
image= cv2.imread('image.jpg')
# 获取源图尺寸
h,w,c = image.shape
print("Original Height and Width:", h,"x", w)
# 使用新的宽高缩小图片
down_width = 300
down_height = 200
down_points = (down_width, down_height)
resize_down = cv2.resize(image, down_points, interpolation= cv2.INTER_LINEAR)
# 使用新的宽高放大图片
up_width = 600
up_height = 400
up_points = (up_width, up_height)
resized_up = cv2.resize(image, up_points, interpolation = cv2.INTER_LINEAR)
# 显示图片
cv2.imshow('Resized Down by defining height and width', resized_down)
cv2.imshow('Resized Up image by defining height and width', resized_up)
cv2.waitKey()
cv2.destroyAllWindows()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
我们的调整大小操作按预期进行。 根据我们定义的新高度和宽度,图像放大或缩小。 但需要注意的是,通过指定宽高来调整大小会使生成的图像失真。 也就是说,图像的纵横比不会保持不变。
# 使用缩放比例因子来缩放图片
# 图片放大1.2倍,同时使用两个比例参数
scale_up_x = 1.2
scale_up_y = 1.2
# 图片缩小0.6倍,使用单个比例参数
scale_down = 0.6
# 执行缩放操作
scaled_down = cv2.resize(image, None, fx= scale_down, fy= scale_down, interpolation= cv2.INTER_LINEAR)
scaled_up = cv2.resize(image, None, fx= scale_up_x, fy= scale_up_y, interpolation= cv2.INTER_LINEAR)
# 显示图片
cv2.imshow('Resized Down by defining scaling factor', scaled_down)
cv2.imshow('Resized Up image by defining scaling factor', scaled_up)
cv2.waitKey(0)
cv2.destroyAllWindows()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 不同的插值方式
- INTER_AREA:INTER_AREA 使用像素面积关系进行重采样。 这最适合减小图像的尺寸(缩小)。 当用于放大图像时,它使用 INTER_NEAREST 方法。
- INTER_CUBIC:这使用双三次插值来调整图像大小。 在调整和插值新像素的同时,该方法作用于图像的 4×4 相邻像素。 然后它采用 16 个像素的权重平均值来创建新的插值像素。
- INTER_LINEAR:这种方法有点类似于INTER_CUBIC插值。 但与 INTER_CUBIC 不同的是,它使用 2×2 相邻像素来获取插值像素的加权平均值。
- INTER_NEAREST:INTER_NEAREST 方法使用最近邻概念进行插值。 这是最简单的方法之一,仅使用图像中的一个相邻像素进行插值。
虽然这些参数非常庞杂,但他们的插值效果却差不多,一般情况下,默认的线性插值就够用。如果非要给点建议的话,我翻译一下官网方文档的原话:
缩小图片,一般来说最好的插值方法是 INTER_AREA
,而要放大一张图片的话,一般来说效果最好的是 INTER_CUBIC
(速度慢)或者 INTER_LINEAR
(速度快一些但结果仍然不错)。