การ convolution image คือการทำอะไรสักอย่างกับทุกส่วนของ image ในปกติที่ผ่านมา เราะจะใช้ convolution kernel ซึ่งก็คือ อะเรย์ขนาดคงที่ที่มีค่าสัมประสิทธิ์อยู่ และมีจุด anchor point (ปกติจะอยู่ตรงกลาง) ขนาดของ array เราจะเรียกว่า support ของ kernel แน่นอนว่า เราไม่จำเป็นต้องวนลูปจัดการทุก pixel ในภาพ OpenCV ได้เตรียมฟังก์ชันไว้ให้แล้ว
void cvFilter2D(
const CvArr* src,
CvArr* dst,
const CvMat* kernel,
CvPoint anchor = cvPoint(-1,-1)
);
ค่าทุกอย่างดูตรงไปตรงมาดี ในกรณีของ anchor point ค่า default จะหมายถึงตรงกลาง ของ kernel
ในกรณีที่เราต้องการ convolute เอง เราอาจจำเป็นที่ต้องจัดการเรื่องขอบของภาพเอง โดยใช้คำสั่ง
cvCopyMakeBorder ซึ่งจะขอข้ามไปในรายละเอียด
Sobel
การ convolute ที่กล่าวถึงอันแรกคือ sobel derivative
cvSobel(
const CvArr* src,
CvArr* dst,
int xorder, //0,1,2
int yorder, //0,1,2
int aperture_size = 3 //1,3,5,7
);
คื่อการคำนวณอนุพันธ์อันดับ xorder ในแกน x และ yorder ในแกน y
แต่ในความเป็นจริงแล้ว OpenCV ไม่ได้ทำการหาอนุพันธ์แต่ใช้วิธีการประมาณค่าอนุพันธ์เอา ดังนั้นบล็อก kernel ที่ใหญ่กว่าจะให้ค่าที่ถูกต้องมากกว่า (ไม่ความเสี่ยงต่อ noise น้อยกว่า) ใน OpenCV สามารถใช้ filter พิเศษที่เรียกว่า scharr filter โดยกำหนด ค่า CV_SCHARR ให้กับ aperture_size ใน cvSobel
Laplace
OpenCV implement Laplace operator ไว้เป็นอนุพันธ์ลำดับสองของทั้งแกน x และ y ดูเผินๆ คล้ายๆ กับ sobel ที่ xorder=yorder=2 ซึ่งจริงๆ แล้ว ที่พารามิเตอร์นั้น OpenCV ใช้ Laplace Operator ในการคำนวณ
ลองดูฟังก์ชันจะเห็นว่าคล้ายกับ sobel มาก
void cvLaplace(
const CvArr* src,
CvArr* dst,
int apertureSize = 3
);
ความสำคัญของการใช้ Laplace มา detect edge คือ จากการใช้อนุพันธ์อันดับสอง(ตามนิยาม) จุดที่ได้ค่าเท่ากับศูนย์ เป็นไปได้สามแบบคือ local maximum, local minimum, และเส้นโค้งที่มีความเว้าน้อยมากๆ (เรียกว่าอะไรนะ) ของอนุพันธ์อันดับหนึ่ง (ตัดกรณีหลังทิ้งไป)
แนวคิดคือภาพน่าจะมีการเปลี่ยนแปลงไม่มากนักแต่จะเริ่มเปลี่ยนแปลงมากขึ้นเมื่อเข้าใกล้ขอบ (ดังนั้นข่วยนี้อนุพันธ์อันดับหนึ่งจะลดลงหรือเพิ่มขึ้น) จนถึงขอบและหลังจากนั้นการเปลี่ยนแปลงจะลดลงเมื่อออกจากขอบ (อนุพันธ์จะเพิ่มขึ้นหรือลดลงเข้าใกล้ศูนย์) ดังนั้นช่วงสูดสุดหรือต่ำสุดน่าจะหมายถึงขอบของภาพ ซึ่งสามารถตรวจสอบได้โดยใช้อนุพันธ์ลำดับสองมาช่วย (ก็ Laplace ไง) ลองดูตัวอย่างในหนังสือ Learning OpenCV ของ OReilly ดู
จากรูปข่วยเส้นสีเทาจะเป็นช่วงที่ อนุพันธ์อันดับสองเป็นศูนย์ที่น่าจะหมายถึงขอบ ซึ่งสัมพันธ์กับ อนุพันธ์ลำดับหนึ่งที่มีค่าสุดสุดหรือต่ำสุด และในช่วงที่อนุพันธ์อันดับหนึ่งมากกว่า threshold ที่กำหนดไว้ จะหมายถึงค่า strong edge คือมีการเปลี่ยนแปลงถึงขนาดที่เรากำหนด เนื่องจากการเปลี่ยนแปลงเล็กๆ น้อยๆ ก็อาจจะทำให้เกิด local max, local min ได้ จะต้องกำจัดส่วนนี้ไปด้วย
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment