Saturday, April 17, 2010

Learning OpenCV: Watershed Algorithm

ก่อนที่จะเข้าเรื่อง segmentation ที่เกี่ยวกับภาพเคลื่อนไหวมาเข้าเรื่องการ segmentation ที่ไม่ต้องใช้ภาพจากหลายๆ เวลากันก่อน


Watershed Algorithm
เป็นวิธี segmentation ที่ไม่ได้ใช้ concept ของการ remove background (เพราะในบางครั้งมันไม่มีหรือว่าสำคัญเท่ากันหมด)  คำอธิบายในหนังสืออ่านแล้วก็ไม่สื่อเท่าไร ลองไปค้นมาจาก wiki ก็ได้ความถึง กระบวนการของ watershed คือ เราสามารถมอง ภาพ intensity image(ก็ gray scale นั่นแหละ) ให้เปรียบเสมือนแผนที่ในโหมด topography (ไอ้โหมดที่สีเข้มแทนที่สูง สีน้ำเิงินแทนน้ำทะเล) เราก็จะเห็นภาพเปรียบเสมือนภูเขาและแอ่งน้ำได้ ทีนี้เราก็กำหนดจุด fill ซึ่งก็มีหลายวิธี ในหน้งสือจะอธิบายวิธี fill โดยใช้ flooding ง่ายๆ คือกำหนดจุดปล่อยน้ำให้น้ำไหลจากที่สูงไปที่ต่ำแล้วก็ขังเกิดเป็นลุ่มน้ำ (watershed) ซึ่งลุ่มน้ำนี้อาจจะถือได้ว่าเป็นการ segment ประเภทหนึ่ง (background)

 watershed ยังอนุญาติให้ ผู้ใช้คือ algorithm อื่นกำหนด background และ บอกว่า พื้นที่เหล่านี้เป็นพื้นที่ๆ เดียวกัน(ในกรณีที่มี noise แยกพื้นที่สองที่ๆ ควรจะเป็นที่เดียวกันออก)





ในภาพซ้ายเราเส้นสีขาวเป็นตัวบอกว่าพื้นที่ๆ ต่อกันด้วยเส้นเป็นพื้นที่เดียวกัน ผลลัพธ์ที่ได้ออกมาดังภาพขวา


void cvWatershed(
    const CvArr* image,

    CvArr* markers
);

image เป็นภาพที่ต้องการทำ watershed
markers มีขนาดเท่า image และมีค่าเป็น 0s ยกเว้นจะต้องการจะบอก cvWatershed ว่าพื้นที่ในส่วนต่างๆ เป็นพื้นที่เดียวกัน โดยกำหนดค่า ตัวเลขใดๆ ใน maskers ตัวเลขที่เท่ากันจะบอกถึงความเป็นพื้นที่เดียวกัน

No comments:

Post a Comment