09 สิงหาคม 2553

ทำ Image Wraping

ทำ Image Wraping
เริ่มต้นอ่าน Android ของพี่หนึ่ง ที่ Android
และได้อ่าน Paper ของ Paul Heckbert ในหนังสือ Fundamental of Texture Mapping and Image Wraping โหลดได้ ที่นี่
จึงค้นพบวิธี Wrap อีกวิธีหนึ่งซึ่งเร็วกว่าซึ่งจะมาดูว่าเร็วกว่าอย่างไร

การ Wrap จาก Quadrilateral to Quadrilateral แบ่งเป็น 2 แบบ
1. การแปลงแบบ Case 3 คือ แปลงจาก Quadrilateral to Quadrilateral โดยตรง
จะใช้ สมการ 8 สมการ เพื่อหา Unknown 8 ตัว a-h

สำหรับ map จุด (u,v) ใน Quadrilateral ต้นทางไปยัง จุด(x,y) ใน Quadrilateral ปลายทาง
โค๊ดตัวอย่างใน matlab

2. ทำ Case 2 แล้วตามด้วยการทำ Case 1
ซึ่งสูตรได้มาจากการแก้สมการเพื่อหา Case 1 ซึ่งเป็น Unit Square to Quadrilateral  โดยเริ่มหามาจาก
สมการในรูปทั่วไป Quadrilateral to Quadrilateral แบบ 8x8 symtem


นำมาแทนค่าในสมการด้วยค่าดังนี้

จะได้ 8 สมการดังนี้



จากใน Paper เค้าบอกว่า สามารถคำนวณเป็น Close Form ได้เลย
หากแทนเพิ่ม พจน์

จะได้ Close Form ดังนี้
ซึ่งทำให้คำนวน a-h พารามิเตอร์ของ case 1 ได้ วิธีนี้มีข้อดีที่ใช้เวลาในการคำนวนน้อยกว่าแบบแรกมาก
โค๊ดตัวอย่าง case 1 ใน matlab
ต่อจากนั้นคำนวนหา case 2 โดย คำนวนหา Unit Square to Quadrilateral (ทิศทางจะตรงข้ามกับลูกศรในภาพ)
เมื่อได้ a-h พารามิเตอร์แล้วค่อยนำมาทำ Inverse หา A-H แทน
ด้วยสมการ (สมการนี้ใช้อักษร s t เป็นจุดใน Unit Square แทน u v ตามลำดับ)

 
ดังนั้นหากเราต้องการหาว่า (x,y) ใน Quadrilateral to Quadrilateral สามารถใช้งานได้ดังนี้

จะได้ (s,t) ที่อยู่ใน Unit Square
โค๊ดตัวอย่าง case 2 ใน matlab

x' = (as + bt +c)/(gs + ht + i)
y' = (ds + et +f)/(gs + ht + i)
จะได้ (x',y') ที่อยู่ใน Quadrilateral ปลายทางที่เราต้องการ Wrap ไป
โค๊ดตัวอย่างการ warp Quadrilateral to Quadrilateralโดยใช้ Go Wrap Matlab

ทดสอบความคลาดเคลื่อนการ warp แบบ Case 3 เทียบ กับ Case 1 + Case 2
โดยใช้จุดมุมของสีเหลี่ยมต้นทางไปยังสีเหลี่ยมปลายทาง
แล้ววัดค่าความคาดเคลื่อนจากจุดมุมที่แท้จริงของสีเหลี่ยมปลายทาง
ได้ผลออกมาดังนี้
Go Wrap Matlab Library

หมายเหตุระยะทางหน่วยเป็น Pixel

จะสังเกตุได้ว่าค่าที่คลาดเคลื่อนเกิดขึ้นในแนวแกน x เท่านั้น และคลาดเคลื่อนอยู่ในระดับที่ยอมรับได้

ดาวน์โหลด Go Wrap Matlab Library










ไม่มีความคิดเห็น: