Saturday, April 17, 2010

Learning OpenCV: Inpainting and Mean-shift segmentation

Inpainting

เป็นวิธีในการกู้ image ที่เกิด noise เช่น ฝุ่นในภาพถ่าย


void cvInpaint(
    const CvArr* src,
    const CvArr* mask,
    CvArr* dst,
    double inpaintRadius,
    int flags
);

src คือ image ต้นฉบับ
mask ระบุถึงตำแหน่งที่ damaged ใน image (ตำแหน่งที่ต้องการซ่อม)
dst คือ image ผลลัพธ์
inpaintRadiuse กำหนดความขนาดพื้นที่รอบๆ จุดที่ต้องการ inpaint (ถ้ากว้างมากจุดจะโดนเฉลี่ยมากทำให้เกิดการ blur ได้)
flags คือวิธีการใน inpanting เลือกได้ระหว่า

  • CV_INPAINT_NS(Navier-Stokes method)
  • CV_INPAINT_TELEA (A. Telea’s method)
Mean-Shift Segmentation

ในตอนก่อนๆ ได้อธิบายเรื่องการ segmentation โดยใช้ image pyramids (cvPyrSegmentation) วิธีนี้จะใช้ color merge เพื่อ segment image. วิธีนี้จะใช้การ minimizing energy ของ image (energy กำหนดโดย link strength ซึงกำหนดด้วย ความเหมือนของสี อีกที)  cvPyrMeanShiftFiltering ก็ใช้แนวคิดนี้ในการทำ color segmentation ภาพ


void cvPyrMeanShiftFiltering(
    const CvArr* src,
    CvArr* dst,
    double spatialRadius,
    double colorRadius,
    int max_level = 1,
    CvTermCriteria termcrit = cvTermCriteria(CV_TERMCRIT_ITER | CV_TERMCRIT_EPS,5,1)
);

src คือ image ต้นฉบับ
dst คือ image ผลลัพธ์
saptialRadius, colorRadius คือรัศมีสำหรับ spatial และ color ตามลำดับ
max_level คือ level ในการทำ pyramid scale
termcrit  เป็น iterative algorithm ที่กำหนดว่าการ iteration จะหยุดอย่างไรลองดูการประกาศ

cvTermCriteria(
    int type; // CV_TERMCRIT_ITER, CV_TERMCRIT_EPS,
    int max_iter,
    double epsilon
);

int คือเป็นตัวบอกว่า iteration จะหยุดใด
  • CV_TERMCRIT_ITER จะหยุดเมื่อ iteration จนครบจำนวนครั้ง ค่านี้กำหนดใน max_iter
  • CV_TERMCRIT_EPS จะหยุดเมื่อ convergence metrix มีค่าเล็กลงถึงขนาดหนึ่ง กำหนดค่านี้ใน epsilon 
ค่า CV_TERMCRIT_ITER กับ CV_TERMCRIT_EPS สามารถใช้ด้วยกันได้



กลับมาที่ cvPyrMeanShiftFiltering กันต่อ ในกรณีที่ข้อมูลเราอยู่ในระนาบ x,y และ r,g,b  mean-shift จะ  หา ก้อนของข้อมูล(segment) ที่รวมกันอยู่อย่างหนาแน่นโดยกา้ร scan ตัว window ไปทั่ว space แต่ range ของ spatial กับ range ของ color จะแตกต่างกัน  ดังนั้น mean-shift ต้องการรัศมีที่ต่างกันในการ scan ระหว่าง spatial space (กำหนดใน spatialRadius) และ color space (colorRadius) ตลอดทางที่ mean-shift window เคลื่อนที่ (scan) จุดที่ converge (โดยสี) ไปยัง peak จะถูกจัดอยู่ในกลุ่มเดียว (owned by) กับ peak นั้นๆ

จุด peak และส่วนที่ owned by peak นั้นๆ จะถูกนับเป็น segment เดียวกัน จริงๆ แล้วการทำ color clustering จะทำใน scale pyramids (จากคำสั่ง cvPyrUp, cvPyrDown) ดังนั้น max_level จะเป็นตัวกำหนดจำนวน level ในการทำ image pyramids 

No comments:

Post a Comment