Friday, April 16, 2010

Learning OpenCV: Comparing Two Histograms

เรื่องสำคัญใน CV เรื่องหนึ่งคือการเปรียบเทียบ histogram ซึ่ง OpenCV มีฟังก์ชัน


double cvCompareHist(
    const CvHistogram* hist1,
    const CvHistogram* hist2,
    int method
);

method หมายถึง algorithm ที่ใช้ในการคำนวณเปรียบเทียบความแตกต่างของ histogram มีสี่วิธีคือ

  1. Correlation (method = CV_COMP_CORREL)
  2. Chi-square (method = CV_COMP_CHISQR)
  3. Intersection (method = CV_COMP_INTERSECT)
  4. Bhattacharyya distance (method = CV_COMP_BHATTACHARYYA)
histogram ต้อง normalized ก่อนจะมาเปรีบบเทียบ

ผลที่ได้ขึ่นอยู่กับ method ที่ใช้ในฟังก์ชัน เช่น exact match CV_COMP_CORREL, CV_COMP_INTERSECT จะได้ค่า 1, CV_COMP_CHISQR, CV_COMP_BATTACHARYYA ได้ค่า 0

ลองดูผลการคำนวณ เปรีบยเทียบ สี่วิธีกับ EMD (Earth Mover's Distance)


ปัญหาที่เกิดขึ้นคือจาก model ต้นแบบ(แถวแรก) กับ model ทดสอบที่สาม (total mis-match) ในแง่ของ CV จริงๆ แล้วอาจจะสื่อถึงสิ่งเดียวกันก็ได้ เช่น ภาพถ่ายมือ ในที่ๆ แสดงไม่เท่ากัน จึงการเลื่อนของ histogram   ถ้าเลื่อน histogram ทดสอบอันที่สามมาทางซ้าย จะได้ผล exact match  ซึ่ง EMD จะให้ค่าของจำนวน bins ที่ต้อง shift ให้ histogram เพื่อให้เกิด exact match ในกรณีตารางตัวอย่างนี้ จะเห็นได้ว่า EMD สามารถ ทายค่าของ Total mis-match ได้ถูกต้อง ในแง่ของความคล้ายระหว่างสอง histogram ในขณะที่ อีกสี่วิธีบอกไม่ได้ การคำนวณหา EMD มีฟังก์ขันแบบง่ายดังนี้ (ในหนังสือไม่ได้อธิบายพารามิเตอร์ของแบบยากไว้ และคิดว่าไม่น่าจำเป็น)

float cvCalcEMD2(
    const CvArr* signature1,
    const CvArr* signature2,
    int distance_type
);

distance_type ในที่นี้มีสองประเภทคือ Manhattan distance (CV_DIST_L1) หรือ Euclidean distance (CV_DIST_L2)
signature1, signature2 คือ CvArr ที่จะเปรียบเทียบหา EMD โดย เป็น Array ที่ประกอบด้วยค่าตามด้วยพิกัด
เช่นในกรณีที่มีมิติเดียว(ตังตัวอย่าง)  ตัว model จะได้ signature เป็น [1,0:0,1] ([ค่าหนึ่ง, ในตำแหน่งที่ศูนย์ และ : ค่าศูนย์, ในตำแหน่งที่หนึ่ง]) half match จะได้ signature เป็น  [0.5,0:0.5,1] ([ค่า 0.5, ในตำแหน่งที่ศูนย์ และ : ค่า 0.5, ในตำแหน่งที่หนึ่ง])  ในกรณีของ 3 มิติ จะได้ signature เป็น [value, x : y,z]


ลองดูตัวอย่าง 7-3 ในหนังสือ Learning OpenCV ซึ่งจะแสดงขันตอน การเปรียบเทียบ histogram โดยใช้ EMD เริ่มตั้งแต่การสร้าง signature และคำนวณค่า EMD





No comments:

Post a Comment