智能硬件与机器视觉:基于树莓派、Python和OpenCV
上QQ阅读APP看书,第一时间看更新

4.2.4 调整图像大小

由于多方面原因,调整图像大小也很有必要。你可能希望调大图像,以更好地适应屏幕,或者调小图像,已实现更快的处理速度(因为要处理的像素少一些)。同时,在进行深度学习时,也经常要调整图像的大小,忽略纵横比,以得到适合深度学习网络的方阵和特定维度的图像的尺寸。

把原始图像调整为200×200的大小,代码如下:


 # 将图像大小调整为200x200px,忽略纵横比   #28
resized = cv2.resize(image, (200, 200)) #29
cv2.imshow("Fixed Resizing", resized)   #30
cv2.waitKey(0)  #31

在第29行,调整图像但忽略了纵横比。通过图4-3可以看到图像已经调整了大小。但是由于没有考虑纵横比,所以图像也已失真。

下面介绍如何在调整图像的大小同时保留原始图像的纵横比,使其不会被压扁和扭曲的代码:


 # 固定调整大小和扭曲纵横比  #33
# 将宽度调整为300px,但根据纵横比计算新的高度  #34
r = 300.0 / w   #35
dim = (300, int(h * r)) #36
resized = cv2.resize(image, dim)    #37
cv2.imshow("Aspect Ratio Resize", resized)  #38
cv2.waitKey(0)  #39

图4-3 使用OpenCV和Python可以用cv2.resize调整图像大小,但不会自动保留纵横比

回去看一下上面脚本的第9行,我们提取了图像的宽度和高度。如果想把768像素宽的图像调整为300像素宽,同时保持纵横比。那么,在第35行,先要计算新宽度与旧宽度的比率。然后,要指定新图像的尺寸dim。想要一个300像素宽的图像,那就必须计算高度,使用原始高度乘以比例h*r(h、r分别为原来的高度和纵横比)就可以了。将dim(想要的尺寸)输入cv2.resize函数,会获得一个名为resized的新图像,且没有失真(第37行)。

为了检查是否成功完成操作,使用第38行的代码显示图像,如图4-4所示。

图4-4 保留纵横比地调整图像大小

使用OpenCV保留纵横比地调整图像大小需要经过3个步骤:①提取图像尺寸,②计算纵横比,③沿一个维度调整(cv2.resize)图像的大小,另一个维度尺寸则乘以纵横比。

有没有更简单的可以在调整大小时保留纵横比的方法呢?

答案是有的,每次想要调整图像大小时,都要计算一下纵横比,这有点烦琐,所以可以考虑把代码封装在imutils包的函数中。

接下来展示如何使用imutils.resize:


 # 手动计算纵横可能很麻烦,#41
# 所以使用imutils库代替 #42
resized = imutils.resize(image, width=300) #43
cv2.imshow("Imutils Resize", resized) #44
cv2.waitKey(0) #45

仅仅通过一行代码,就成功保留了纵横比并调整了图像大小。你只需要提供目标width或height作为关键字参数(第43行),结果如图4-5所示。

图4-5 使用封装函数调整图像大小