如何使用Numpy模块裁剪图片

如何使用Numpy模块裁剪图片

在这篇文章中,我们将学习最天真、最有效的方法来裁剪图片,而不使用任何额外的模块。

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

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

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

使用索引来裁剪图片

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

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

下面的图片是有4K(3840×2160)的尺寸。

我们将对上述图片进行裁剪,使中间的标志占据了图片的大部分。

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

以下是裁剪特定图像的程序:

# 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()

输出:

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

解释:

  • 首先,我们导入了PIL(或称 pillow)库的Image模块。然后我们以np的别名导入了Numpy库(通用惯例)。之后,我们创建了一个所需图像的Image对象(W3.jpg),并将该对象存储在变量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()函数来显示图像。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程

Numpy教程