로 이미지를 열면 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