Edge Detection
การศึกษาการทำ Edge Detection ใน Image processing
การศึกษาการทำ Edge Detection ใน Image processing
หลักการทำ Edge detection คือ การดูค่า Intensity ของภาพที่จะมีการเปลี่ยนแปลงไป ที่ตรงนั้นก็คือ Edge ของภาพ โดยทำการนำภาพมาทำ first derivative ตามสูตร f'(x) = \frac{df}{dx}(x) หรือก็คือ \frac{df}{du}(x)\approx \frac{f(u+1)-f(u-1)}{(u+1)-(u-1)} = \frac{f(u+1)-f(u-1)}{2} เนื่อจากหากว่าภาพถ่ายที่ได้มีความต่างระหว่างตัวรูปและขอบภาพด้านข้าง เมื่อทำการ derivative จะเห็นค่าความแตกต่างเมื่อค่า Intensity เกิดความต่าง ดังภาพข้างล่าง
โดยการทำ Edge detection มีวิธีการหาหลายแบบ เช่น Derivative, Perwitt และ Sobel
เป็นการหา Derivative ในแนวแกน x และแนวแกน y ซึ่งก็คือการหา \frac{df}{du}(x) หรืออาจจะทำการสร้าง metrix ขึ้นมา คือ H^D_x = \begin{bmatrix}-0.5&0 &0.5 \end{bmatrix} และ H^D_y = \begin{bmatrix}-0.5\\ 0\\ 0.5\\\end{bmatrix} จากนั้นทำการ convolution กับภาพ
จะมีวิธีการทำที่เหมือนกับ Derivative แต่จะเปลี่ยน Metrix ที่จะใช้ convolution เป็น H^P_x = \begin{bmatrix}-1 &0 &1 \\ -1 &0 &1 \\ -1 &0 &1 \end{bmatrix} และ H^P_y = \begin{bmatrix}-1 &-1 &-1 \\ 0 &0 &0 \\ 1 &1 &1 \end{bmatrix}
มีวิธีการเหมือนกับทั้ง Derivative และ Prewitt โดยจะเปลี่ยน Metrix เป็น H^S_x = \begin{bmatrix}-1 &0 &1 \\ -2 &0 &2 \\ -1 &0 &1 \end{bmatrix} และ H^S_y = \begin{bmatrix}-1 &-2 &-1 \\ 0 &0 &0 \\ 1 &2 &1 \end{bmatrix}
หลังจากที่ทำ first derivative แล้วก็สามารถหาค่า Magnitude และ Direction ของภาพได้ จากขั้นตอนต่อไป
เป็นการหาขนาดโดยใช้ค่า D_x และ D_y
E(u,v) = \sqrt{(D_x(u,v))^2 + (D_y(u,v))^2}
\Phi (u,v) = arctan(\frac{D_y(u,v)}{D_x(u,v)})
ตัวอย่างการคำนวณ เช่น หากกำหนดให้ภาพขนาด 3x3 มีค่า Intensity ดังนี้
\begin{vmatrix}5&1&7\\4&3&2\\1&4&6\end{vmatrix} จากนั้นทำการ zero padding จะได้เป็น \begin{vmatrix}0&0&0&0&0\\0&5&1&7&0\\0&4&3&2&0\\0&1&4&6&0\\0&0&0&0&0\end{vmatrix}
การหา Gradient derivative จะเริ่มจากการหา D_x และ D_y ก่อน เช่นจุด (2,2) ในภาพที่เติม zero แล้วจะมีค่า D_x=\frac{f(u+1)-f(u-1)}{(u+1)-(u-1)}=\frac{1-0}{3-1}=0.5 และ D_y=\frac{f(u+1)-f(u-1)}{(u+1)-(u-1)}=\frac{4-0}{3-1}=2 เมื่อทำการหาค่าของทุกจุดในภาพจะได้ D_x=\begin{bmatrix} 0.5&1 &-0.5 \\ 1.5&-1 &-1.5 \\ 2&2.5 &-2 \end{bmatrix} และ D_y=\begin{bmatrix} 2&1.5 &1 \\ -2&1.5 &-0.5 \\ -2&-1.5 &-1 \end{bmatrix} ขั้นตอนต่อไปทำการหา Magnitude ของแต่ละจุด เช่นจุด (1,1) ของ D_x และ D_y ที่ได้ จะคำนวณจากสูตรข้างต้น คือ E(u,v) = E(1,1) = \sqrt{0.5^2 + 2^2} = 2.0616 เมื่อทำการคำนวณค่าของทั้งภาพก็จะได้เป็น E = \begin{bmatrix}2.0616 &1.8028 &1.1180 \\ 2.5 &1.8028 &1.5811 \\ 2.8284 &2.9155 &2.2361 \end{bmatrix} สุดท้ายทำการหา Local Edge Orientation ของภาพ เช่น จุด (1,1) ของ D_x, D_y จะคำนวณได้ว่า \Phi (1,1) = arctan(\frac{2}{0.5}) = 1.3258 เมื่อคำนวณที่จุดอื่นจะได้ค่าใหม่ทั้งหมดเป็น \Phi = \begin{bmatrix}1.3258 &0.9828 &2.0344 \\ -0.9273&2.1588 &-2.8198 \\ 0.7854 &-0.5404 &-2.6779 \end{bmatrix}
การหา Gradient ด้วย Prewitt operator โดยใช้ภาพเดิมและทำ zero padding เข้าไป เริ่มจากการหา Px และ Py เช่น ที่จุด (3, 3) จะได้ P_x(3,3) = \begin{bmatrix}5 &1 &7 \\ 4 &3 &2 \\ 1 &4 &6 \end{bmatrix}\cdot \begin{bmatrix}-1 &0 &1 \\ -1 &0 &1 \\ -1 &0 &1 \end{bmatrix} = 5 ส่วน P_y(3,3) จะได้เป็น P_y = \begin{bmatrix}5 &1 &7 \\ 4 &3 &2 \\ 1 &4 &6 \end{bmatrix}\cdot \begin{bmatrix}-1 &-1 &-1 \\ 0 &0 &0 \\ 1 &1 &1 \end{bmatrix} = -2 เมื่อทำการคำนวณภาพจะได้เป็น P_x = \begin{bmatrix}4 &0 &-4 \\ 8 &5 &-8 \\ 7 &3 &-7 \end{bmatrix} และ P_y = \begin{bmatrix}7 &9 &5 \\ -1 &-2 &2 \\ -7 &-9 &-5 \end{bmatrix} จากนั้นทำการคำนวณค่า Magnitude เช่น ที่จุด (1,1) จะได้ว่า E(1,1) = \sqrt{(-4)^2+(-7)^2} = 8.0623 เมื่อคำนวณทั้งภาพก็จะได้ E = \begin{bmatrix}8.0623 &9 &6.4031 \\ 8.0623 &5.3852 &8.2462 \\ 9.8995 &9.4868 &8.6023 \end{bmatrix} จากนั้นจะทำการหา หา Local Edge Orientation ของภาพ เช่น จุด (1,1) จะคำนวณได้ว่า \Phi (1,1) = arctan(\frac{7}{4}) = 1.0517 เมื่อคำนวณที่จุดอื่นจะได้ค่าใหม่ทั้งหมดเป็น \Phi (1,1) = begin{bmatrix}1.0517 &1.5708 &2.2455 \\ -0.1244&-0.3805 &2.8966 \\ -0.7854 &-1.2490 &-2.5213 \end{bmatrix}
การหา Gradient ด้วย Sobel จะคล้ายกับ Prewitt แต่จะใช้ Metrix ในการ convolution ต่างกัน เช่นการคำนวณหาค่าที่จุด (3,3) จะได้ S_x = \begin{bmatrix}5 &1 &7 \\ 4 &3 &2 \\ 1 &4 &6 \end{bmatrix}\cdot \begin{bmatrix}-1 &0 &1 \\ -2 &0 &2 \\ -1 &0 &1 \end{bmatrix} = 3 และ S_y = \begin{bmatrix}5 &1 &7 \\ 4 &3 &2 \\ 1 &4 &6 \end{bmatrix}\cdot \begin{bmatrix}-1 &-2 &-1 \\ 0 &0 &0 \\ 1 &2 &1 \end{bmatrix} = 1 และสุดท้ายจะได้ออกมาเป็น S_x = \begin{bmatrix}5 &2 &-5 \\ 11 &3 &-11 \\ 11 &8 &-11 \end{bmatrix} และ S_y = \begin{bmatrix}11 &12 &7 \\ -5 &1 &1 \\ -11 &-12 &-7 \end{bmatrix} จากนั้นลองทำการหา Magnitude ที่จุด (1,1)จะได้เป็น E(1,1) = \sqrt{5^2+11^2} = 12.083 เมื่อคำนวณทั้งภาพจะได้ E = \begin{bmatrix}12.083 &12.1655 &8.6023 \\ 12.083 &3.1623 &11.0454 \\ 15.5563 &14.4222 &13.0384 \end{bmatrix} จากนั้นคำนวณหา Local Edge Orientation ของภาพ เช่น จุด (1,1) จะคำนวณได้ว่า \Phi (1,1) = arctan(\frac{11}{5}) = 1.1442 เมื่อคำนวณที่จุดอื่นจะได้ค่าใหม่ทั้งหมดเป็น \Phi = \begin{bmatrix}1.1442 &1.4056 &2.1910 \\ -0.4266 &0.3218 &3.0509 \\ -0.7854 &-0.9828 &-2.5749 \end{bmatrix}
หลักการทำงานของ code ของ Derivative filter, Perwitt operator และ Sobel operator จะเริ่มจากการนำภาพมาทำ zero padding และเริ่มทำการหา Hx, Hy, Magnitude และ Local edge orientation โดยใช้ฟังก์ชั่นที่เขียนขึ้นมา myEdgeDetection() โดยใส่ input function สำหรับเลือกชนิดของ operator เป็น “g” (Derivative filter), “p” (Perwitt operator) หรือ “s”(Sobel operator) จากนั้นนำภาพที่ได้มาเปรียบเทียบกับ imgradient() และ imgradientxy() ของ MATLAB
Video แสดงผลการประมวลผลภาพจาก AVI file แสดงผลการทำ Gradient Magnitude
Video แสดงผลการประมวลผลภาพจาก AVI file แสดงผลการทำ Perwitt operator
Video แสดงผลการประมวลผลภาพจาก AVI file แสดงผลการทำ Sobel operator
Video แสดงผลการประมวลผลภาพจากกล้อง webcam แสดงผลการทำ Gradient Magnitude
Video แสดงผลการประมวลผลภาพจากกล้อง webcam แสดงผลการทำ Perwitt operator
Video แสดงผลการประมวลผลภาพจากกล้อง webcam แสดงผลการทำ Sobel operator
ผลที่ได้รับจากการทำEdge Detection สามารถทำให้แยกแยะบริเวณที่เป็นขอบผิวของวัตถุใดๆได้ เพียงแต่จะมีข้อจำกัดในเรื่องที่ถ้าบริเวณข้างๆกันนั้น ค่าของpixelใกล้เคียงกัน จะทำให้ผลสุดท้ายของกระบวนการไม่สามารถแยกขอบได้ชัดเจน จึงเป็นข้อจำกัดที่จะใช้ในภาพที่มีวัตถุโทนสีใกล้เคียงกันมากๆ หรือจะเห็นได้ชัดในภาพ.lsm ที่ผลสุดท้ายของกระบวนการได้เพียงขอบจางๆ
การใช้ Prewitt และ Sobel จะมีความต่างกันตั้งแต่ค่า matrix ที่นำมาใช้และผลที่ได้ โดยภาพที่ได้จากการใช้ Sobel จะมีความต่างในการเน้นขอบมากกว่าแบบ Prewitt เนื่องจากมีการ weight ที่จุดแต่ละจุดต่างกัน
การทำ Edge Detectionในรายงานจะมีอยู่ 3 วิธี คือ Derivative filter, Prewitt operator และ Sobel operator ซึ่งแตกต่างกันโดยการเลือกใช้ค่า mask โดยผลลัพท์จากการหาของขอบจะทำให้ใช้ในการแยกแยะหรือการตรวจหาวัตถุ เพราะจะสามารถแยกบริเวณที่มีค่าpixelต่างกันมากๆ
การหา Edge Detection คือ การระบุตำแหน่งขอบของวัตถุในรูปภาพ โดยเปรียบเทียบจากค่า Intensity ของวัตถุแลพื้นด้านหลัง ซึ่งการระบุตำแหน่งของขอบภาพนั้นสามารถนำมาประยุกต์ใช้ในการคำนวณพื้นที่ หรือขนาด ของวัตถุบนรูปภาพ ดังนั้น จึงมักนำเทคนิคนี้มาประยุกต์ใช้ในงานวิศวกรรมชีวการแพทย์ ด้านการวิเคราะห์ภาพถ่ายทางการแพทย์ เช่น ภาพถ่ายจากรังสีเทคนิค เพื่อระบุพื้นที่ของภาพถ่ายตัดอวัยวะผู้ป่วยแล้วนำมาคำนวณหาปริมาตรเพื่อวินิจฉัยโรค
การหา Edge Detection จะทำได้ยากเมื่อภาพต้นฉบับที่มีคุณภาพต่ำ ดังนั้นจึงมีการพัฒนาวิธีการปรับปรุงคุณภาพของภาพ และการคำนวณหาค่าตำแหน่งขอบ โดย Edge Detection ต่อไป
Source code is available on Github