Edge Detection
การศึกษาการทำ Edge Detection ใน Image processing
การศึกษาการทำ Edge Detection ใน Image processing
Modified Sobel เป็นการปรับปรุงให้ sobel operator ทำงานได้ทั้ง8ทิศทาง ภายในภาพ โดยการหมุนคู่ของค่าคงที่ใน operator matrix ของ sobel operator ไปทีละ45องศา จะทำให้เกิดรูปที่ผ่าน sobel operator ทั้งหมด 8 รูป จาก 8ทิศทาง แล้วจึงหาภาพที่เหมาะสมที่สุดหลังผ่านการใช้ modified sobel operator
ในการทำ edge detection โดยวิธีการอื่นๆจะมีข้อเสียคือ สามารถตรวจจับขอบภาพได้ดีในแนวของ Vertical และ Horizontal ดังนั้นหาภาพที่ต้องการหานั้นมีขอบตามแนวแทยงก็จะย่อมตรวจจับได้ลำบาก ดังนั้นวิธีการ Modified Sobel Operator ถูกพัฒนาขึ้นมาเพื่อช่วยให้ง่ายในการตรวจจับขอบภาพทั้งในแนว Vertical, Horizontal และ Diagonal โดยใช้ Opertaor matrix จาก Sobel Operator ซึ่งจะแตกต่างกันที่ Sobel Opertor จะหาขอบใน 4 ทิศทางทุกๆ 90 องศา หรือตามแนวแกน x และแนวแกน y แต่วิธีนี้จะเป็นการหาขอบในทุกๆ 45 องศา โดยจะมี Operator mask ทั้งหมด 8 อัน คือ
$$ \begin{split} H_0^S &= \begin{bmatrix}-1 &0 &1 \\ -2 &0 &1 \\ -1 &0 &1 \end{bmatrix} \\ H_1^S &= \begin{bmatrix}-2 &-1 &0 \\ -1 &0 &1 \\ 0 &1 &2 \end{bmatrix} \\ H_2^S &= \begin{bmatrix}-1 &-2 &-1 \\ 0 &0 &0 \\ 1 &2 &1 \end{bmatrix} \\ H_3^S &= \begin{bmatrix}0 &-1 &-2 \\ 1 &0 &-1 \\ 2 &1 &0 \end{bmatrix} \\ H_4^S &= \begin{bmatrix}1 &0 &-1 \\ 2 &0 &-2 \\ 1 &0 &-1 \end{bmatrix} \\ H_5^S &= \begin{bmatrix}2 &1 &0 \\ 1 &0 &-1 \\ 0 &-1 &-2 \end{bmatrix} \\ H_6^S &= \begin{bmatrix}1 &2 &1 \\ 0 &0 &0 \\ -1 &-2 &-1 \end{bmatrix} \\ H_7^S &= \begin{bmatrix}0 &1 &2 \\ -1 &0 &1 \\ -2 &-1 &0 \end{bmatrix} \end{split}$$
โดยในการคำนวณจริงเราจะใช้เพียง 4 ค่าจากทั้งหมด 8 ค่ามา Convolution กับภาพ เช่น \(H_4^S = -H_0^S\) จะเชียนเป็นสมการ Convolution ได้ว่า \(I*H_4^S = I*-H_0^S\) โดยเมื่อดู Opertor ทั้งแปดของ Modified Sobel จะได้ความสัมพันธ์ดังนี้
$$ \begin{split} I*H_4^S &= -(I*H_0^S) \\ I*H_5^S &= -(I*H_1^S) \\ I*H_6^S &= -(I*H_2^S) \\ I*H_7^S &= -(I*H_3^S) \end{split} $$
และเมื่อหาค่าทั้ง 4 แล้วจะทำการหา Magnitude ของภาพได้โดยนำค่าทั้ง 4 มาหาค่าที่มากที่สุด ซึ่งหมายถึงว่าค่านั้นจะเป็นขอบของภาพ
การทำ Canny filter เป็นการทำ Edge detection แบบหนึ่ง โดยจะใช้ multi-stage algorithm ในการตรวจจับขอบภาพ โดยวิธีการนี้จะได้ผลลัพท์ที่ค่อนข้างมีประสิทธิภาพสูง
การทำ Canny Filter จะมี 4 ขั้นตอนการทำงาน คือ
ใช้ Filter แบบ Gaussian blur เพื่อลบรอยและ Noise ในภาพ โดยหลักการของการทำ Gaussian blur จะอ้างอิงจากกราฟโดย Gaussian ซึ่งมีลักษณะเป็นรูประฆังคว่ำ เพื่อสร้างความ Smooth ให้กับรูปภาพ แต่สามารถอาจเลือกใช้การ Reduce Noise วิธีอื่นได้ด้วยเช่นกัน
เพื่อให้เกิด Gradients Intensity และ Direction ใช้สำหรับต้องการหาขอบของภาพโดยใช้ Sobel operation มาช่วยในการหาขอบซึ่งในวิธีการนี้สามารถใช้ operation อื่นมาใช้ในการหาขอบได้อีกเช่นกันจะเห็นได้ว่าวิธีการ canny เปิดกว้างในการการทำ edge detection
เพื่อสร้าง Edge ที่แท้จริง เมื่อค่า Pixel นั้นๆ มีความเหมาะสมกับการเป็นขอบมากกว่า Pixel ข้างเคียง หรือสามารถใช้ Modified Sobel ในการหาค่า Max ได้เช่นกัน โดยเลือกจุดภาพที่มีขนาดสูงสุดและมีทิศทางเดียวกับเกรเดียนเท่านั้น
วิธีการทำงานคือปรับ Gradient Direction/Orientation ให้ไปยังทิศที่ใกล้กับทิศหลักที่ต้องการเช่น 0 45 90 และ 135 องศา จากนั้นทำการตรวจสอบ Gradient Magnitude ของบริเวณรอบๆในแนวที่ไม่ตรงกับ Gradient Direction ดังตัวอย่างดังนี้
เพื่อหาจุดเริ่มต้น และจุดสุดท้ายของขอบภาพ โดยการลบเส้นที่ไม่เชื่อมกันออก (อันที่ไม่ใช่เส้นที่แท้จริง) โดยการพิจารณา connected component หรือ neighborhood บริเวณรอบ หากไม่มี neighborhood ที่เป็น edge เลย (มีค่าไม่เป็น 1) pixel นั้นจะถูก suppress ไว้ วิธีการทำจะตั้ง threshold สองค่าคือ Low และ High หาก pixel นั้นต่ำกว่า Low ค่าจะเป็น 0 ถ้ามากกว่า High จะเป็น 1 หรืออยู่ระหว่างนั้นจะพิจารณาให้เป็น 1 เมื่อมี neighbor เป็น edge (พิจารณาตามแต่ connected component ที่ตั้งค่าไว้)
Laplace Filter เป็นวิธีการทำให้ขอบของภาพมีความคมชัดมากขึ้นโดยการ localizing การเปลี่ยนแปลงอย่างกระทันหันของค่า intensity โดยใช้ second derivatives ของ image function
โดยใช้ สมการ second derivative คือ $$ (\bigtriangledown ^2f)(x,y) = \frac{\partial^2 f}{\partial^2 x}(x,y) + \frac{\partial^2 f}{\partial^2 y}(x,y) \\ เมื่อ \frac{\partial^2 f}{\partial^2 x}(x,y) \equiv H_x^L = \begin{bmatrix}1 &-2 &1 \end{bmatrix} \\ และ \frac{\partial^2 f}{\partial^2 y}(x,y) \equiv H_x^L = \begin{bmatrix}1\\ -2\\ 1\end{bmatrix} \\ หรือ H^L = H_x^L + H_y^L = \begin{bmatrix}0 &1 &0 \\ 1&-4 &1 \\ 0& 1 &0 \end{bmatrix} $$ โดยนำ Operator mask ของ \(H^L\) ไป convolution กับภาพ และนำไปหักลบกับภาพต้นแบบ จากนั้นนำกลับไปบวกกับภาพต้นแบบอีกที ก็จะได้ ภาพที่คมชัดมากขั้น โดยเป็นไปตามสมการ \( New Image = Original Pic + (Original Pic - L_{xy}) ; L_{xy} \) คือ ภาพที่ได้จากการ convolution ด้วย Lapace Operator
Video แสดงผลการประมวลผลภาพจาก AVI file แสดงผลการทำ Modified Sobel Operation
Video แสดงผลการประมวลผลภาพจาก Webcam แสดงผลการทำ Modified Sobel Operation
Video แสดงผลการประมวลผลภาพจาก AVI file แสดงผลการทำ Canny filter
Video แสดงผลการประมวลผลภาพจาก Webcam แสดงผลการทำ Canny filter
Video แสดงผลการประมวลผลภาพจาก Webcam แสดงผลการทำ Canny filter
Video แสดงผลการประมวลผลภาพจาก AVI file แสดงผลการทำ Edge sharpening แบบ Laplace Filter
จากการศึกษาการหา Edge detection ทั้งสามแบบคือ Modified Sobel, Laplace sharpening และ Canny จากผลที่ได้จะเห็นว่าการใช้ Modified Sobel จะทำให้ได้ภาพที่มีขอบทั้งแนวตั้ง แนวนอน และแนวแทยงมุม ส่วนการใช้ Lapace Sharpening จะช่วยให้ได้ภาพที่ขอบคมชัดเจนนเื่องจากได้การทำ Edge detection โดยใช้ Lapace operator เข้ามาช่วย จึงทำให้ขอบดูคมชัด และการใช้ Canny Opertor จะช่วยให้ได้ Edge detection ที่ได้ขอบจริงๆขอบภาพซึ่งแตกต่างจากวิธีอื่นเนื่องจากมีการกำหนด Threshold สองค่าเพื่อแยกแยะรายละเอียดต่างๆของภาพ และมีกระบวนการทำหรือวิธีที่ซับซ้อนกว่า
ในการใช้ Modified Sobel จะเห็นว่าค่อนข้างจะได้ Edge detection ที่ดีกว่าวิธีการก่อนๆคือ Sobel และ Prewitt เพราะมีการหาขอบของภาพในทุกๆ 45 องศา แต่ก็มีการทำที่ซับซ้อนกว่า และการทำ Sharpening โดยใช้ Lapace นั้นเป็นการใช้ second derivative มาช่วยหา edge ของภาพและนำกลับไปบวกเข้ากับภาพจริงจึงทำให้ได้ภาพที่ได้ขอบคมชัดมากขึ้น แต่ก็มีการคำนวณหลายขึ้นตอนจึงอาจจะต้องมีการพัฒนาให้สะดวกในการใช้แบบ real-time ส่วนวิธีการของ Canny นั้นช่วยให้ได้ขอบที่มีความถูกต้องมากกว่าวิธีที่กล่าวมาแต่ว่ามีขั้นตอนการคำนวณที่ซับซ้อนและยุ่งยากมากที่สุด ดังนั้นในการทำ Edge detection ก็ควรเลือกวิธีการให้เหมาะสมกับรูปภาพ
ข้อดีคือ
ข้อเสียคือ ใช้เวลาในการคำนวณนานเนื่องจากการคำนวณที่ซับซ้อน
ข้อดีคือ
ข้อเสียคือ
Source code is available on Github