การใช้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]
โซลูชันที่สมบูรณ์และใช้งานง่ายคือ
# 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 อเนกประสงค์ที่มีสีเดียวกัน