Sunday, April 4, 2010

Image Negative

ในบทความก่อนหน้านี้ เราพูดถึงการหาค่า negative ของภาพแบบ grayscale ไปแล้ว ในบทความนี้ จะกล่าวถึงการหาคำนวณ image negative ของภาพใดๆรวมถึงภาพสี โดยการประมวลผลทีละพิกเซล

ก่อนที่จะทำการคำนวณ เราจะต้องพิจารณาถึงลักษณะการเก็บค่าพิกเซลในหน่วยความจำเสียก่อน ซึ่งโดยทั่วไปแล้ว ภาพจะประกอบด้วยเฟรมสามเฟรมซ้อนกัน นั่นคือเฟรมของสีแดง เขียว และน้ำเงิน เราอาจเรียกเฟรมดังกล่าวว่า channel (ใน OpenCV จะมีการเรียง channel เป็นแบบ น้ำเงิน เขียว แดง หรือ BGR)

ในอีกมุมมองหนึ่ง รูปภาพก็อาจจะมองได้ว่าเป็นอาร์เรยสามมิติ ที่ประกอบไปด้วยความสูง (แถว) ความกว้าง (คอลัมน์) และความลึก (channel) นั่นเอง


OpenCV มีการเก็บข้อมูลรูปในลักษณะที่ไม่ใช่อาร์เรย์สามมิติ แต่เป็นลักษณะเป็นแถวเรียงกันไป (อาจคิดได้ว่าเป็นเวกเตอร์) ดังนี้

นั่นคือ มีการเก็บพิกเซลของแต่ละสี (channel) เรียงต่อกันไป จากซ้ายไปขวาและจากบนลงล่าง

ดังนั้น หากต้องการเข้าถึงแต่ละพิกเซล จะได้ว่าตำแหน่งของพิกเซลใดๆ (x) จะมีค่าเป็น
x = (r*widthStep) + (c*nchannel) + k;
เมื่อ r และ c คือตำแหน่งของแถวและคอลัมน์ของภาพ nchannel คือ จำนวนของ channel ทั้งหมด (ในที่นี้เป็น 3) และ k คือค่าของ channel ที่กำลังสนใจ (มีค่า 0-2)

หลักการนี้สามารถนำไปใช้ในการคำนวณ image negative ได้ดังรหัสโปรแกรมต่อไปนี้



ให้สังเกตในส่วนของการประมวลผลว่ามีการใช้ถึงสามลูปซ้อนกัน นั่นคือ แถว คอลัมน์ และ channel

ผลลัพธ์

No comments:

Post a Comment