详解Python PIL Image.getdata()

  • Post category:Python

当我们需要对图像进行一些处理时,Python PIL库是不错的选择。其中,Image.getdata()是获取图像数据的一个方法,在很多场景下会被用到。

1. Image.getdata()方法的作用

Image.getdata()方法用于获取Image对象中所有像素点信息,返回一个顺序访问每个像素点的序列,具体而言,其返回值为一个序列对象,其中每个元素表示一个像素点信息,一般为RGBA四元组数据。

常用方式如下:

im = Image.open('image.jpg')
data = im.getdata()

得到data之后,我们就可以遍历data并对每个像素进行操作。比如以下代码可以将一张图片所有像素点变为黑白色:

from PIL import Image

# 图片路径
img_path = 'image.jpg'

# 打开图片
img = Image.open(img_path)

# 获取图片宽度、高度
width, height = img.size

# 将 RGB 模式的图像转换为黑白模式
gray_img = img.convert('L')

# 获取像素点信息
pixels = gray_img.getdata()

# 遍历每一个像素并进行操作
for i in range(height):
    for j in range(width):
        # 获取当前像素点的坐标
        w, h = j, i
        # 获取像素值
        r, g, b, a = pixels[i*width+j]
        # 计算灰度值
        gray = int(r*0.299 + g*0.587 + b*0.114)
        # 将像素点置为黑白
        if gray > 128:
            gray = 255
        else:
            gray = 0
        # 设置像素点
        gray_img.putpixel((w, h), gray)

# 显示图片
gray_img.show()

上述代码中,我们通过Image.open()方法打开了一张图像,并将其转换为黑白图像。然后,我们使用getdata()方法获取了所有像素点的信息,接着我们遍历每个像素点,计算其灰度值,并将其置为黑白之后设置回去。最后我们使用show()方法展示处理之后的图像。

上述代码演示了如何对图像进行简单的操作,实现黑白化处理。接下来,我们再看一个实际应用的示例。

假设我们需要将一张图片中的所有白色区域(RGB为(255,255,255))变为透明颜色,我们该如何实现呢?

from PIL import Image

# 图片路径
img_path = 'image.jpg'

# 打开图片
img = Image.open(img_path)

# 获取图片宽度、高度
width, height = img.size

# 将 RGB 模式的图像转换为 RGBA 模式
transparent_img = img.convert('RGBA')

# 获取像素点信息
pixels = transparent_img.getdata()

# 遍历每一个像素并进行操作
for i in range(height):
    for j in range(width):
        # 获取当前像素点的坐标
        w, h = j, i
        # 获取像素值
        r, g, b, a = pixels[i*width+j]
        # 将白色像素点置为透明
        if (r, g, b) == (255, 255, 255):
            a = 0
        # 设置像素点
        transparent_img.putpixel((w, h), (r, g, b, a))

# 显示图片
transparent_img.show()

上述代码中,我们通过Image.open()方法打开了一张图像,并将其转换为RGBA模式。然后,我们使用getdata()方法获取了所有像素点的信息,接着我们遍历每个像素点,将白色区域设置为透明,并将其设置回去。最后我们使用show()方法展示处理之后的图像。

2. Image.getdata()方法的注意事项

注意事项如下:

  1. Image.getdata() 返回的数据类型是序列(Sequence),不是列表(List)。

  2. 获取像素点信息后,不建议直接修改像素点数据,而是通过 Image.putpixel() 方法修改像素点数据。

  3. 当 Image 对象的模式为 L(灰度)时,getdata()方法返回的是一个灰度值的数组。

总结

本文从 Image.getdata() 方法的作用出发,介绍了其用法和注意事项,并通过两个实际的示例说明了其应用场景,希望对你有所帮助。