CV2调整图片大小 - 初学者的完整指南

726 阅读4分钟

在这篇文章中,我们将学习OpenCV包,以及它的cv2 resize函数。我们还将看一些代码实例,以更好地了解如何在实际场景中使用这个函数。

Open CV - cv2 resize()

这个图像处理计算机库是由intel公司建立的,用于解决计算机中的实时视觉问题。cv2 resize()函数专门用于使用不同的插值技术来调整图像的大小。让我们来了解一下如何。

简单调整大小

import cv2
image = cv2.imread("img.png", 1)
bigger = cv2.resize(image, (2400, 1200))
cv2.imshow("Altered Image", bigger)
cv2.waitKey(0)
cv2.destroyAllWindows()

上面的代码演示了一个简单的调整大小的技术。这里我们没有使用任何插值技术或缩放因子,但我们得到了想要的输出。

我们也可以在我们的语法中加入缩放因子。缩放因子沿其轴线对图像进行缩放,而不会给最终的输出带来很大的差异。带有缩放因子的语法写法是这样的。

scaled = cv2.resize(image, (1200, 600), fx = 0.1, fy = 0.1
                 ,interpolation = cv2.INTER_CUBIC)

通过改变长宽比调整大小

改变图像的长宽比可以给我们一个缩小或放大的图像。在这个例子中,我们将研究如何做到这一点。

我们将看3个代码块,其中包括--包的导入和图像的加载,缩放加载的图像背后的逻辑,最后,使用插值法调整图像的大小。

导入和图像读取

import cv2

pic = cv2.imread('img.png', cv2.IMREAD_UNCHANGED)

上面的代码导入了Python的OpenCV库,然后在变量 "pic "中加载图像。你可能已经注意到了,我们使用了'cv2.IMREAD_UNCHANGED',它的基本功能是使用其alpha通道加载图像,这意味着图片的原始分辨率被保留下来。

改变长宽比的算法

pd_change = 60  # The percent change from the main aspect ratio
new_resolution = pd_change/100
pic_width = int(pic.shape[1] * new_resolution)
pic_height = int(pic.shape[0] * new_resolution)
new_dimension = (pic_width, pic_height)

让我们逐行理解上述代码:

  • 'pd_change'变量保存原始长宽比所需的百分比变化。
  • 'new_resolution'变量将该百分比转换为十进制并存储。
  • 变量'pic_width'和'pic_height'使用该十进制值保存新的高度和宽度。语法'pic.shape'是用来获取原始图片的长宽比的。[0]表示高度,[1]表示宽度。([2]用于通道,这不属于本文涉及的学习范围)
  • 变量 "new_dimension "用于存储新的分辨率。

调整图像大小

altered_size = cv2.resize(pic, new_dimension, interpolation=cv2.INTER_AREA)

cv2.imshow("Altered Image", altered_size)

变量'altered_size'使用cv2.resize()函数调整图像大小,这里使用的插值方法是'cv2.INTER_AREA',它基本上是用来收缩图像的。所以,最后,我们的图像被完美地缩放到了我们想要的百分比大小。

让我们看看完整的代码以了解全貌

import cv2

pic = cv2.imread('img.png', cv2.IMREAD_UNCHANGED)

print('Resolution of the original pic : ', pic.shape)

percent_dim_change = 60  # The percent change from the main size
pic_width = int(pic.shape[1] * percent_dim_change / 100)
pic_height = int(pic.shape[0] * percent_dim_change / 100)
dim = (pic_width, pic_height)

# resizing image
altered_size = cv2.resize(pic, dim, interpolation=cv2.INTER_AREA)

print('Changed Picture Dimensions : ', altered_size.shape)

cv2.imshow("Altered Image", altered_size)
cv2.waitKey(0)
cv2.destroyAllWindows()

纵横比变化

通过使用自定义值调整大小

我们可以用特定的宽度和高度值来调整图像的大小,而不考虑其原始尺寸。或者,我们可以改变一个参数,即高度,而保持另一个参数,即宽度,保留。让我们看一下代码,了解它是如何做到的。

import cv2

pic = cv2.imread('img.png', cv2.IMREAD_UNCHANGED)

print('Resolution of the original pic : ', pic.shape)

pic_width = pic.shape[1]  # keeping intact the original width
pic_height = 800
new_dimension = (pic_width, pic_height)

# resize image
altered_size = cv2.resize(pic, new_dimension, interpolation=cv2.INTER_CUBIC)

print('Changed Picture Dimensions : ', altered_size.shape)

cv2.imshow("Resized image", altered_size)
cv2.waitKey(0)
cv2.destroyAllWindows()

宽度不变的大小调整

在这里,我们使用了一种不同的插值方法,'INTER_CUBIC',它对2X2的相邻像素进行插值。改变插值方法并没有什么不同,在这个例子中,最终的结果几乎是一样的(作为练习,你可以在你的机器上尝试这个例子,改变插值方法,并观察最终结果的变化)。尽管如此,在最后的输出中,我们得到了一个高度改变了的新图像。

注意:在上面的代码中,我们改变了图片的高度,也保持了我们的宽度不变。如果我们想在保持高度不变的情况下改变宽度,我们将使用。

pic_width =  480
pic_height = pic.shape[0]     # keeping intact the original height
new_dimension = (pic_width, pic_height)

高度不变的调整

结语

我希望这篇文章能帮助你理解cv2.resize函数以及如何使用它来改变图片。我们研究了多种不同的方法,通过这些方法我们可以对图像进行操作。我们还研究了如何利用插值来获得我们的图像的理想结果。希望这篇文章能对你的学习有所帮助。