使用 OpenCV 缩放图片

16/11/2022 python 743 words in 2 minutes -

本文原始链接:Image Resizing with OpenCV (opens new window)

在 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

我们的调整大小操作按预期进行。 根据我们定义的新高度和宽度,图像放大或缩小。 但需要注意的是,通过指定宽高来调整大小会使生成的图像失真。 也就是说,图像的纵横比不会保持不变。

# 使用缩放比例因子来缩放图片

# 图片放大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

# 不同的插值方式

  • 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 (速度快一些但结果仍然不错)。

# learnopencv # python