📜  如何使用 Numpy 模块裁剪图像?

📅  最后修改于: 2022-05-13 01:55:38.577000             🧑  作者: Mango

如何使用 Numpy 模块裁剪图像?

在本文中,我们将学习在不使用任何附加模块的情况下裁剪图像的最简单有效的方法。

numpy模块是一个Python库,用于处理数组和大型数据集。与其他高级语言(如 C、C++、 Java等)相比, Python没有任何对数组的本机支持,后者为本机提供了数组的实现。 Python反而有链表,它确实解决了静态分配(大部分)的问题,并允许存储异构数据,但不允许连续存储数据。 Numpy通过在语言中引入数组来弥补这个缺点,数组是同构的数据结构并存储在连续的内存位置。

由于图像内的数据(不包括标题信息)是同质的,并且通常按顺序访问或通过直接访问(通过添加偏移量)访问,因此使用数组存储图像像素数据可以更快地对图像进行操作。在本文中,我们将看看使用Numpy数组(包含像素信息)裁剪图像。

许多模块中有各种方法来裁剪图像,裁剪图像最简单有效的方法是使用numpy数组的索引。

使用索引裁剪图像

由于Numpy本身不支持图像裁剪方法(因为它不是图像处理库),我们可以使用索引方法来实现我们的目的。对于演示,我们将使用以下图像:-

下图为 4K(3840×2160)尺寸。

我们将裁剪上面的图像,使中间的标志占据图像的很大一部分。

由于裁剪图像*通常是手动操作,因此我们必须事先获得感兴趣区域的坐标。裁剪需要 4 个坐标(或一对大小为 2 的元组)。第一组坐标指定 ROI(或 Bbox)的左上角,接下来的两个坐标表示 ROI 的右下角坐标。对于我们的案例,ROI 的坐标将为(1413, 653)(2361, 1385) (假设使用行主索引)。为了显示和读取图像,我们将借助Pillow库,它是Python中的一个图像处理库。

下面是裁剪给定图像的程序:

Python3
# Import required modules
from PIL import Image
import numpy as np
  
# Load image
image = Image.open('W3.jpg')
  
# Convert image to array
image_arr = numpy.array(image)
  
# Crop image
image_arr = image_arr[700:1400, 1450:2361]
  
# Convert array to image
image = Image.fromarray(image_arr)
  
# Display image
image.show()


输出:

解释:

  • 首先我们导入了PIL (或枕头)库的 Image 模块。然后我们在别名np (通用约定)下导入了Numpy库。之后,我们创建了一个我们想要的图像( W3.jpg )的 Image 对象,并将该对象存储在变量image中。因此,图像变量的类型为PIL.JpegImagePlugin.JpegImageFile。
  • 为了从这个对象中创建Numpy数组,我们通过np.array () 方法传递它,该方法从图像中提取所有 Pixel 数据并将其存储在变量image_arr中。这导致我们有一个形状为(2160, 3840, 3)Numpy数组。
  • 然后我们从每个维度对数组进行切片。在语句image_arr[700:1400, 1450:2361]中, 700表示起始行, 1400表示结束行。其中, 1450表示起始列, 2316表示结束列。所有这些值都描述了该位置的像素,因此裁剪的左上角坐标为(1450, 700)和左下角坐标为(2361, 1400)
  • 最后,我们使用Image.fromarray()Numpy数组转换回图像。最后,我们使用show()函数显示了图像。