Saturday, December 1, 2012

การเข้าถึงพิกเซลของรูป

แม้ว่า 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

No comments:

Post a Comment