Как прочитать значение RGB данного пикселя в Python?

Если я открою изображение с помощью open("image.jpg"), как я могу получить значения RGB пикселя, если у меня есть координаты пикселя?

Тогда как я могу сделать обратное? Начиная с пустой графики, "написать" пиксель с определенным значением RGB?

Я бы предпочел, чтобы мне не нужно было загружать дополнительные библиотеки.

Ответ 1

Вероятно, для этого лучше всего использовать библиотеку изображений Python, которая, боюсь, является отдельной загрузкой.

Самый простой способ сделать то, что вы хотите, это использовать метод load() объекта Image, который возвращает объект доступа к пикселям, которым вы можете манипулировать как массивом:

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 для создания изображений.

Ответ 2

PyPNG - легкий PNG-декодер/кодировщик

Хотя вопрос подсказывает в JPG, я надеюсь, что мой ответ будет полезен некоторым людям.

Здесь, как читать и писать пиксели PNG, используя модуль PyPNG:

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 - это единственный чистый модуль Python длиной менее 4000 строк, включая тесты и комментарии.

PIL - это более полная библиотека изображений, но она также значительно тяжелее.

Ответ 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

Ответ 4

Как сказал Дейв Уэбб:

Вот мой рабочий фрагмент кода, печатающий цвета пикселей из изображения:

import os, sys
import Image

im = Image.open("image.jpg")
x = 3
y = 4

pix = im.load()
print pix[x,y]

Ответ 5

photo = Image.open('IN.jpg') #your image
photo = photo.convert('RGB')

width = photo.size[0] #define W and H
height = photo.size[1]

for y in range(0, height): #each pixel has coordinates
    row = ""
    for x in range(0, width):

        RGB = photo.getpixel((x,y))
        R,G,B = RGB  #now you can use the RGB value

Ответ 6

Там действительно хорошая статья на wiki.wxpython.org под названием Работа с изображениями. В статье упоминается о возможности использования wxWidgets (wxImage), PIL или PythonMagick. Лично я использовал PIL и wxWidgets, и оба делали манипуляции с изображениями довольно легко.

Ответ 7

Вы можете использовать pygame модуль surfarray. Этот модуль имеет метод возврата трехмерного пикселя, называемый pix3d (поверхность). Я показал использование ниже:

from pygame import surfarray, image, display
import pygame
import numpy #important to import

pygame.init()
image = image.load("myimagefile.jpg") #surface to render
resolution = (image.get_width(),image.get_height())
screen = display.set_mode(resolution) #create space for display
screen.blit(image, (0,0)) #superpose image on screen
display.flip()
surfarray.use_arraytype("numpy") #important!
screenpix = surfarray.pixels3d(image) #pixels in 3d array:
#[x][y][rgb]
for y in range(resolution[1]):
    for x in range(resolution[0]):
        for color in range(3):
            screenpix[x][y][color] += 128
            #reverting colors
screen.blit(surfarray.make_surface(screenpix), (0,0)) #superpose on screen
display.flip() #update display
while 1:
    print finished

Я надеюсь, что это будет полезно. Последнее слово: экран заблокирован для жизни экрана.

Ответ 8

Манипуляция изображения - сложная тема, и лучше всего использовать библиотеку. Я могу порекомендовать gdmodule, который обеспечивает легкий доступ ко многим различным форматам изображений из Python.

Ответ 9

установите PIL, используя команду "sudo apt-get install python-imaging" и запустите следующую программу. Он будет печатать значения RGB изображения. Если изображение сильно перенаправляет вывод в файл с помощью " > ", позже откройте файл, чтобы увидеть значения RGB

import PIL
import Image
FILENAME='fn.gif' #image can be in gif jpeg or png format 
im=Image.open(FILENAME).convert('RGB')
pix=im.load()
w=im.size[0]
h=im.size[1]
for i in range(w):
  for j in range(h):
    print pix[i,j]

Ответ 10

Вы можете использовать модуль Tkinter, который является стандартным интерфейсом Python для инструментария TK GUI, и вам не нужна дополнительная загрузка. См. https://docs.python.org/2/library/tkinter.html.

(для Python 3 Tkinter переименовывается в tkinter)

Вот как установить значения RGB:

#from http://tkinter.unpythonic.net/wiki/PhotoImage
from Tkinter import *

root = Tk()

def pixel(image, pos, color):
    """Place pixel at pos=(x,y) on image, with color=(r,g,b)."""
    r,g,b = color
    x,y = pos
    image.put("#%02x%02x%02x" % (r,g,b), (y, x))

photo = PhotoImage(width=32, height=32)

pixel(photo, (16,16), (255,0,0))  # One lone pixel in the middle...

label = Label(root, image=photo)
label.grid()
root.mainloop()

И получите RGB:

#from http://www.kosbie.net/cmu/spring-14/15-112/handouts/steganographyEncoder.py
def getRGB(image, x, y):
    value = image.get(x, y)
    return tuple(map(int, value.split(" ")))

Ответ 11

import matplotlib.pyplot as plt
import matplotlib.image as mpimg

img=mpimg.imread('Cricket_ACT_official_logo.png')
imgplot = plt.imshow(img)

Ответ 12

from PIL import Image
def rgb_of_pixel(img_path, x, y):
    im = Image.open(img_path).convert('RGB')
    r, g, b = im.getpixel((x, y))
    a = (r, g, b)
    return a

Ответ 13

Если вы хотите иметь три цифры в виде цветового кода RGB, следующий код должен сделать именно это.

i = Image.open(path)
pixels = i.load() # this is not a list, nor is it list()'able
width, height = i.size

all_pixels = []
for x in range(width):
    for y in range(height):
        cpixel = pixels[x, y]
        all_pixels.append(cpixel)

Это может работать для вас.

Ответ 14

Чтобы получить пиксельные интенсивности изображения при отображении изображения с помощью cv2.imshow, используйте пакет imagetoolbox, откройте командную строку и напишите

pip install imagetoolbox, затем напишите код, введите описание изображения здесь