[python] 파이썬에서 주어진 픽셀의 RGB 값을 읽는 방법은 무엇입니까?

로 이미지를 열면 open("image.jpg")픽셀의 좌표가 있다고 가정하면 픽셀의 RGB 값을 어떻게 얻을 수 있습니까?

그런 다음 어떻게 반대로 할 수 있습니까? 빈 그래픽으로 시작하여 특정 RGB 값으로 픽셀을 ‘쓰기’하시겠습니까?

추가 라이브러리를 다운로드 할 필요가없는 경우 선호합니다.



답변

파이썬 이미지 라이브러리 를 사용 하여이 작업을 수행 하는 것이 가장 좋습니다 . 별도의 다운로드입니다.

원하는 것을 수행하는 가장 쉬운 방법 은 배열과 같이 조작 할 수있는 픽셀 액세스 객체를 반환하는 Image 객체load () 메서드를 사용 하는 것입니다.

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

또는 이미지 생성을위한 훨씬 풍부한 API를 제공하는 ImageDraw 를 보십시오 .


답변

사용 베개 (2.7 이상 파이썬뿐만 아니라 파이썬 3.X와 함께 작동), 다음을 수행 할 수 있습니다 :

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]

완전하고 사용하기 쉬운 솔루션은

# Third party modules
import numpy
from PIL import Image


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


image = get_image("gradient.png")

print(image[0])
print(image.shape)

코드 연기 테스트

너비 / 높이 / 채널 순서가 확실하지 않을 수 있습니다. 이런 이유로 나는이 그라디언트를 만들었습니다 :

여기에 이미지 설명을 입력하십시오

이미지의 너비는 100px, 높이는 26px입니다. #ffaa00(노란색)에서 #ffffff(흰색) 까지 색상 그라데이션이 있습니다 . 출력은 다음과 같습니다.

[[255 172   5]
 [255 172   5]
 [255 172   5]
 [255 171   5]
 [255 172   5]
 [255 172   5]
 [255 171   5]
 [255 171   5]
 [255 171   5]
 [255 172   5]
 [255 172   5]
 [255 171   5]
 [255 171   5]
 [255 172   5]
 [255 172   5]
 [255 172   5]
 [255 171   5]
 [255 172   5]
 [255 172   5]
 [255 171   5]
 [255 171   5]
 [255 172   4]
 [255 172   5]
 [255 171   5]
 [255 171   5]
 [255 172   5]]
(100, 26, 3)

참고 사항 :

  • 모양은 (너비, 높이, 채널)
  • image[0], 따라서 첫 번째 행은 동일한 색상을 가지고 26 루타

답변

PyPNG-경량 PNG 디코더 / 인코더

질문은 JPG에 암시되지만 내 답변이 일부 사람들에게 도움이되기를 바랍니다.

PyPNG 모듈을 사용하여 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 은보다 포괄적 인 이미징 라이브러리이지만 훨씬 더 무겁습니다.


답변

Dave Webb가 말했듯이 :

다음은 이미지에서 픽셀 색상을 인쇄하는 작업 코드 스 니펫입니다.

import os, sys
import Image

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

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

답변

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


답변

이미지 조작은 복잡한 주제이며, 당신이 경우 가장있어 않는 라이브러리를 사용합니다. 파이썬에서 다양한 이미지 형식에 쉽게 액세스 할 수있는 gdmodule 을 추천 할 수 있습니다 .


답변

wiki.wxpython.org 에는 이미지 작업 이라는 제목의 기사가 있습니다. 이 기사에서는 wxWidgets (wxImage), PIL 또는 PythonMagick의 사용 가능성에 대해 언급합니다. 개인적으로 PIL과 wxWidgets를 사용했으며 이미지 조작이 상당히 쉬워졌습니다.