แม้ว่า Python Imaging Library (PIL) จะมีคำสั่งในการประมวลผลภาพหลากหลาย แต่ในบางครั้งเราอาจจะต้องการที่จะประมวลผลแต่ละพิกเซลเอง ก็จะจำเป็นที่จะต้องทราบการอ่านและแก้ไขพิกเซลนั้น
การอ่านพิกเซล จะทำได้โดย
1. อ่านพิกเซลของรูปทั้งหมด แล้วนำไปเก็บไว้ในโครงสร้างข้อมูลที่เรียกว่า pixel access object ที่มีลักษณะคล้ายกับตัวแปรชุดสองมิติ (2D array) โดยใช้คำสั่ง load ดังนี้
pix = im.load()
2. สามารถอ่านค่าของแต่ละพิกเซล โดยใช้คำสั่ง
pix[x,y]
เมื่อ x และ y เป็นพิกัด เริ่มต้นที่มุมซ้ายบน (0,0)
การแก้ไขค่าพิกเซล หลังจากอ่านค่าพิกเซลทั้งหมดแล้ว ทำได้โดย
pix[x,y] = value
ถ้าเป็นรูป grayscale ค่า value จะเป็นเลขโดดๆ ตั้งแต่ 0 ถึง 255
ถ้าเป็นรูป RGB ค่า value จะเป็นเลขชุด เช่น (100,100,100)
ลองดูการเพิ่มเมนูเพื่อทำการกลับสีรูป (inverse) เพื่อให้ได้ผลลัพธ์ดังนี้
โค้ดเฉพาะส่วนของฟังก์ชันนี้ คือ
def imgInverse(self):
#load an image reference to a special structure like a list
pix = self.im.load()
#print pix[0,0]
#get image size
w,h = self.im.size
#if grayscale image
if self.im.mode=="L":
#loop for each row and column
for r in range(h):
for c in range(w):
pix[c,r] = 255 - pix[c,r]
#Note that we can use getpixel(x,y) and putpixel(x,y)
#but this method is faster
elif self.im.mode=="RGB":
#loop for each row and column
for r in range(h):
for c in range(w):
p = pix[c,r]
pix[c,r] = (255-p[0],255-p[1],255-p[2])
self.showImage()
ลองเอาไปเชื่อมต่อกับโค้ดก่อนหน้านี้ได้ครับ
อ้างอิง
http://effbot.org/zone/pil-pixel-access.htm