如何在Python中读取给定像素的RGB值?

2024-04-26 05:07:54 发布

您现在位置:Python中文网/ 问答频道 /正文

如果我用open("image.jpg")打开一个图像,如果我有一个像素的坐标,我如何得到一个像素的RGB值?

那么,我该怎么做呢?从一个空白图形开始,“写”一个具有特定RGB值的像素?

如果我不需要下载任何额外的库,我会更愿意。


Tags: 图像image图形rgb像素open空白jpg
3条回答

使用Pillow(与Python 3.X和Python 2.7+一起使用),可以执行以下操作:

from PIL import Image
im = Image.open('image.jpg', 'r')
width, height = im.size
pixel_values = list(im.getdata())

现在你有了所有的像素值。如果是RGB,则im.mode可以读取另一个模式。然后您可以通过以下方法获得像素(x, y)

pixel_values[width*y+x]

或者,您可以使用Numpy并重塑阵列:

>>> pixel_values = numpy.array(pixel_values).reshape((width, height, 3))
>>> x, y = 0, 1
>>> pixel_values[x][y]
[ 18  18  12]

一个完整、简单易用的解决方案是

def get_image(image_path):
    """Get a numpy array of an image so that one can access values[x][y]."""
    image = Image.open(image_path, 'r')
    width, height = image.size
    pixel_values = list(image.getdata())
    if image.mode == 'RGB':
        channels = 3
    elif image.mode == 'L':
        channels = 1
    else:
        print("Unknown mode: %s" % image.mode)
        return None
    pixel_values = numpy.array(pixel_values).reshape((width, height, channels))
    return pixel_values

最好使用Python Image Library来完成这项工作,恐怕这是一个单独的下载。

最简单的方法是通过load() method on the Image object返回一个像素访问对象,您可以像数组一样对其进行操作:

from PIL import Image

im = Image.open('dead_parrot.jpg') # Can be many different formats.
pix = im.load()
print im.size  # Get the width and hight of the image for iterating over
print pix[x,y]  # Get the RGBA Value of the a pixel of an image
pix[x,y] = value  # Set the RGBA Value of the image (tuple)
im.save('alive_parrot.png')  # Save the modified pixels as .png

或者,看看ImageDraw,它为创建图像提供了更丰富的API。

PyPNG-轻量级PNG解码器/编码器

虽然这个问题暗示了JPG,但我希望我的回答对一些人有用。

下面是如何使用PyPNG module读取和写入PNG像素:

import png, array

point = (2, 10) # coordinates of pixel to be painted red

reader = png.Reader(filename='image.png')
w, h, pixels, metadata = reader.read_flat()
pixel_byte_width = 4 if metadata['alpha'] else 3
pixel_position = point[0] + point[1] * w
new_pixel_value = (255, 0, 0, 0) if metadata['alpha'] else (255, 0, 0)
pixels[
  pixel_position * pixel_byte_width :
  (pixel_position + 1) * pixel_byte_width] = array.array('B', new_pixel_value)

output = open('image-with-red-dot.png', 'wb')
writer = png.Writer(w, h, **metadata)
writer.write_array(output, pixels)
output.close()

PyPNG是一个不到4000行的纯Python模块,包括测试和注释。

PIL是一个更全面的图像库,但它也明显更重。

相关问题 更多 >

    热门问题