Edge Detection

การศึกษาการทำ Edge Detection ใน Image processing

Objective

  1. เพื่อศึกษาการทำ Edge detection
  2. ศึกษาการประยุกต์ใช้ Edge detection
  3. ศึกษาการทำ Function ของ Edge detection บน MATLAB
  4. เพื่อศึกษาความแตกต่างของแต่ละรูปแบบในการใช้ Edge detection
  5. เปรียบเทียบประสิทธิภาพระหว่าง Function กับ Function ใน MATLAB Toolbox

Medthods

  1. Edge detection

    หลักการทำ 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 เกิดความต่าง ดังภาพข้างล่าง

    ภาพที่ 1 : แสดงกราฟอนุพันธ์อันดับหนึ่งในมิติที่หนึ่ง

    โดยการทำ Edge detection มีวิธีการหาหลายแบบ เช่น Derivative, Perwitt และ Sobel

    1. Derivative filter

      เป็นการหา 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 กับภาพ

    2. Prewitt operator

      จะมีวิธีการทำที่เหมือนกับ 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}

    3. Sobel operator

      มีวิธีการเหมือนกับทั้ง 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 ของภาพได้ จากขั้นตอนต่อไป

  2. Magnitude

    เป็นการหาขนาดโดยใช้ค่า D_x และ D_y

    E(u,v) = \sqrt{(D_x(u,v))^2 + (D_y(u,v))^2}

  3. Local Edge Orientation

    \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

Results

  1. JPEG Image

  2. Gradient Magnitude

    ภาพที่ 2 : แสดงผลของภาพที่ผ่านขั้นตอนต่างๆของวิธี Gradient Magnitude

  3. Perwitt operator

    ภาพที่ 3 : แสดงผลของภาพที่ผ่านขั้นตอนต่างๆของวิธี Perwitt operator

  4. Sobel operator

    ภาพที่ 4 : แสดงผลของภาพที่ผ่านขั้นตอนต่างๆของวิธี Sobel operator

  5. DICOM

  6. Gradient Magnitude

    ภาพที่ 5 : แสดงผลของภาพที่ผ่านขั้นตอนต่างๆของวิธี Gradient Magnitude

  7. Perwitt operator

    ภาพที่ 6 : แสดงผลของภาพที่ผ่านขั้นตอนต่างๆของวิธี Perwitt operator

  8. Sobel operator

    ภาพที่ 7 : แสดงผลของภาพที่ผ่านขั้นตอนต่างๆของวิธี Sobel operator

  9. LSM

  10. Gradient Magnitude

    ภาพที่ 8 : แสดงผลของภาพที่ผ่านขั้นตอนต่างๆของวิธี Perwitt operator

  11. Perwitt operator

    ภาพที่ 9 : แสดงผลของภาพที่ผ่านขั้นตอนต่างๆของวิธี Gradient Magnitude

  12. Sobel operator

    ภาพที่ 10 : แสดงผลของภาพที่ผ่านขั้นตอนต่างๆของวิธี Sobel operator

  13. AVI Video

    1. Gradient Magnitude

      Video แสดงผลการประมวลผลภาพจาก AVI file แสดงผลการทำ Gradient Magnitude

    2. Perwitt operator

      Video แสดงผลการประมวลผลภาพจาก AVI file แสดงผลการทำ Perwitt operator

    3. Sobel operator

      Video แสดงผลการประมวลผลภาพจาก AVI file แสดงผลการทำ Sobel operator

  14. Webcam

    1. Gradient Magnitude

      Video แสดงผลการประมวลผลภาพจากกล้อง webcam แสดงผลการทำ Gradient Magnitude

    2. Perwitt operator

      Video แสดงผลการประมวลผลภาพจากกล้อง webcam แสดงผลการทำ Perwitt operator

    3. Sobel operator

      Video แสดงผลการประมวลผลภาพจากกล้อง webcam แสดงผลการทำ Sobel operator


Discussion

ผลที่ได้รับจากการทำEdge Detection สามารถทำให้แยกแยะบริเวณที่เป็นขอบผิวของวัตถุใดๆได้ เพียงแต่จะมีข้อจำกัดในเรื่องที่ถ้าบริเวณข้างๆกันนั้น ค่าของpixelใกล้เคียงกัน จะทำให้ผลสุดท้ายของกระบวนการไม่สามารถแยกขอบได้ชัดเจน จึงเป็นข้อจำกัดที่จะใช้ในภาพที่มีวัตถุโทนสีใกล้เคียงกันมากๆ หรือจะเห็นได้ชัดในภาพ.lsm ที่ผลสุดท้ายของกระบวนการได้เพียงขอบจางๆ

การใช้ Prewitt และ Sobel จะมีความต่างกันตั้งแต่ค่า matrix ที่นำมาใช้และผลที่ได้ โดยภาพที่ได้จากการใช้ Sobel จะมีความต่างในการเน้นขอบมากกว่าแบบ Prewitt เนื่องจากมีการ weight ที่จุดแต่ละจุดต่างกัน


Conclusion

การทำ Edge Detectionในรายงานจะมีอยู่ 3 วิธี คือ Derivative filter, Prewitt operator และ Sobel operator ซึ่งแตกต่างกันโดยการเลือกใช้ค่า mask โดยผลลัพท์จากการหาของขอบจะทำให้ใช้ในการแยกแยะหรือการตรวจหาวัตถุ เพราะจะสามารถแยกบริเวณที่มีค่าpixelต่างกันมากๆ


Future Study

การหา Edge Detection คือ การระบุตำแหน่งขอบของวัตถุในรูปภาพ โดยเปรียบเทียบจากค่า Intensity ของวัตถุแลพื้นด้านหลัง ซึ่งการระบุตำแหน่งของขอบภาพนั้นสามารถนำมาประยุกต์ใช้ในการคำนวณพื้นที่ หรือขนาด ของวัตถุบนรูปภาพ ดังนั้น จึงมักนำเทคนิคนี้มาประยุกต์ใช้ในงานวิศวกรรมชีวการแพทย์ ด้านการวิเคราะห์ภาพถ่ายทางการแพทย์ เช่น ภาพถ่ายจากรังสีเทคนิค เพื่อระบุพื้นที่ของภาพถ่ายตัดอวัยวะผู้ป่วยแล้วนำมาคำนวณหาปริมาตรเพื่อวินิจฉัยโรค

การหา Edge Detection จะทำได้ยากเมื่อภาพต้นฉบับที่มีคุณภาพต่ำ ดังนั้นจึงมีการพัฒนาวิธีการปรับปรุงคุณภาพของภาพ และการคำนวณหาค่าตำแหน่งขอบ โดย Edge Detection ต่อไป

Q&A

Question 1:
จงบอกข้อแตกต่างระหว่าง Sobel Operator กับ Prewitt Operator
Answer:
coefficient ของ mask ใน sobel operator จะไม่ถูกจำกัด เราจึงสามารถปรับได้ตามต้องการโดยที่ไม่เป็นการทำลายคุณสมบัติของ derivative mask

Question 2:
Edge มีกี่ประเภท อะไรบ้าง
Answer:
3 ประเภท ได้แก่ Horizontal edges, Vertical Edges, Diagonal Edges

Question 3:
นอกเหนือจาก mask แบบ Sobel Operator กับ Prewitt Operator แล้ว ยังมี mask แบบใดอีกบ้าง จงยกตัวอย่างพร้อมอธิบาย
Answer:
  1. Robinson Compass Masks - เป็น direction mask โดนจะใช้เพียง 1 mask และหมุน 8 ทิศทางเพื่อคำนวณหาขอบของแต่ละทิศทาง
  2. Krisch Compass Masks - เป็น derivative mask โดยใช้สำหรับคำนวณหาขอบในทุกทิศทาง
  3. Laplacian Operator - เป็น derivative mask โดยใช้สำหรับคำนวณหาขอบโดยใช้ second order derivative mask

Source code is available on Github