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