Thursday, April 15, 2010

Learning OpenCV: Threshold

เรื่องสำคัญในการทำ CV อีกเรื่องคือ threshold คงไม่ต้องอธิบายมากับความหมาย เรามาดูวิธีการใช้ดีกว่า
เริ่มต้นที่ definition เช่นเคย

double cvThreshold(
    CvArr* src,
    CvArr* dst,
    double threshold,
    double max_value,
    int threshold_type
);

src คือต้นฉบับ
dst คือผลลัพธ์
double คือ threshold ที่ตั้งไว้
max_value คือค่าคงที่ใช้ในการตั้งค่าผลลัพธ์
threshold_type คือวิธีการคำนวณ threshold ใชัหลักดังนี้ (ให้ M=max_value)

  • CV_THRESHOLD_BINARY              dst = (src>T)?M:0
  • CV_THRESHOLD_BINARY_INV     dst = (src>T)?0:M
  • CV_THRESHOLD_TRUNC               dst = (src>T)?M:src
  • CV_THRESHOLD_TOZERO_INV    dst = (src>T)?0:src
  • CV_THRESHOLD_TOZERO             dst = (src>T)?src:0
และยังมี adaptive threshold ที่ค่า threshold จะเปลี่ยนค่าเองไปได้เรื่อย ซึ่งจะมีประโยชน์ในกรณีที่ภาพต้นแบบนั้นเจอแสดงแบบ gradient ทำให้ค่าต่างกันมากตาม gradient ของภาพ การเรียกใช้ก็จะคล้ายๆ กัน

void cvAdaptiveThreshold(
    CvArr* src,
    CvArr* dst,
    double max_val,
    int adaptive_method = CV_ADAPTIVE_THRESH_MEAN_C
    int threshold_type = CV_THRESH_BINARY,
    int block_size = 3,
    double param1 = 5
);

ในฟังก์ชันนี้ค่า threshold ที่จุด x,y ใดๆ จะคำนวณมาจาก ค่าเฉลี่ยของ pixel ในสี่เหลี่ยมจัตตุรัสที่มีขนาดกำหนดไว้ใน block_size แล้วลบด้วยค่า param1 โดยการเฉลี่ย pixel นั้นมีสองวิธีกำหนดไว้ใน adaptive_method คือ CV_ADAPTIVE_THRESH_MEAN_C จะถ่วงน้ำหนักเท่ากันทุก pixel ในขณะที่ถ้ากำหนดเป็น CV_ADAPTIVE_THRESH_GAUSSIAN_C จะถ่วงน้ำหนัก pixel โดย ใช้ gaussian function จากระยะห่าง 




No comments:

Post a Comment