Thursday, April 15, 2010

Learning OpenCV: Cartesian, Polar, and Log Polar

ตอนนี้จะเป็นการ convert ระนาบจาก Cartesian กับ Polar

void cvCartToPolar(
    const CvArr* x,
    const CvArr* y,
    CvArr* magnitude,
    CvArr* angle = NULL,
    int angle_in_degrees = 0
);
void cvPolarToCart(
    const CvArr* magnitude,
    const CvArr* angle,
    CvArr* x,
    CvArr* y,

    int angle_in_degrees = 0
);

x,y คือพิกัดในระนาบ xy
magnitude, angle คือพิกัดในระนาบ polar
angle_in_degree เซ็ตว่ามุกในระนาบ polar จะเป็น degree หรือ radius

ส่วนการแปลง Cartesian ไปเป็น log polar ใช้ฟังก์ชันดังนี้

void cvLogPolar(
    const CvArr* src,
    CvArr* dst,
    CvPoint2D32f center,
    double m,
    int flags = CV_INTER_LINEAR | CV_WARP_FILL_OUTLIERS
);
src คือจุดในระนาบ x,y
dst ตือผลลัพธ์ในระนาบ log polar
center กำหนดจุดกึ่งกลางของภาพ src
m เป็นการขยาย scale
flags คือวิธีการ interpolation (CV_INTER_NN, CV_INTER_LINEAR, CV_INTER_AREA, CV_INTER_CUBIC) รวมกับ(โดยใช้ bitwise or) flags CV_WARP_FILL_OUTLIERS หรือ CV_WARP_INVERSE_MAP

ลองมาดูข้อดีของระนาบแบบ log polar ที่เกี่ยวข้อกับ การ หมุน และการ scale

ในรูปจะเห็นภาพสี่เหลี่ยมเส้นทึบโดนหมุน(เส้นเทา)และขยาย(เส้นประ) ผลลัพธ์ที่ได้ในระนาบ log polar จะเป็นการเลื่อนกราฟไปในแนวตั้งและแนวนอน (จากคุณสมบัติของ logarithm  กับการ transform แบบ linear transform) ซึ่งจริงๆ จะดูจากภาพก็ได้ว่า สี่เหลี่ยมทีเทาเกิดจากการหมุน ระยะห่างเท่าเดิมแต่มุมเพิ่มขึ้น ดังนั้นการเลื่อนกราฟไปในแนวตั้งในระนาบ log polar ก็เป็นเรื่องปกติ เพราะจุดเปลี่ยนแค่มุม ส่วนการขยายภาพ ก็จะเห็นได้ว่ามุมแต่มุมยังอยู่เท่าเดิมแต่ระยะห่างจาก center เพิ่มขึ้น การ shift กราฟไปทางขวาก็สมเหตุผล


การประยุกต์ใช้จะเห็นได้ว่าการ scale ภาพและการหมุนภาพ ไม่ใช่ปัญหาในการวิเคราห์ภาพอีกต่อไปถ้าอยู่ในระนาบ log polar การ matching ระหว่าง กราฟสามเส้นทางด้านขวาว่าเป็นสี่เหลี่ยมเหมือนกันง่ายกว่าการ matching สี่เหลี่ยมสามรูปทางด้านซ้ายมาก

No comments:

Post a Comment