Canny Edge Detection

จาก Morange Wiki

Canny Edge Detection

วัตถุประสงค์

  • ใบบทนี้จะเรียนรู้เกี่ยวกับ
    • แนวคิดของ Canny Edge Detection
    • ใน OpenCV จะมีฟังก์ชั่นชื่อว่า : cv2.Canny()

ทฤษฏี

  • Canny Edge Detection คือ อัลกอริทึมสำหรับตรวจจับมุมของภาพ คิดค้นโดย John F. Canny ที่คิดค้นนั้นคือ
  • เป็นเพียง อัลกอริทึม หนึ่ง ที่จะข้ามไปทีละ สเตจ เพื่อทำงานร่วมกับสเตจอื่นๆ

Noise Reduction

    • เป็นการลดภาพแตกหรือภาพรบกวน (Noises) โดยก่อนหน้านี้จะได้รู้คคร่าวๆแล้ว

Finding Intensity Gradient of the Image

    • รูปภาพที่มีความ Smooth นั้น จะต้อง กรองภาพด้วยฟัง์ชั่นต่างๆแต่ใน Sobel kernel จะทำอยู่ในรูปแบบของแนวจั้งและแนวนอน จากจุดหนึ่งไปยังอีกจุด โดยการหาจุด ในแนวนอน (Gx) และในแนวตั้ง (Gy) จากทั้งสองนั้นเราจะสามารถหาค่าของทิศทางได้แต่ละ Pixel สูตรต่อไปนี้

สูตรทางคณิตศาสตร์


ทิศทางการไล่โทนสีจะยังอยู่เสมอโดยตั้งฉากกับขอบ มันจะถูกปัดเศษให้เป็นหนึ่งในสี่มุมคิดเป็นแนวตั้งแนวนอนและสองทิศทางในแนวทแยง

Non-maximum Suppression

    • หลังจากที่ไล่ระดับสีและขนาดและทิศทางแล้ว คือขั้นตอนที่จะสแกนแบบเต็มรูปแบบโดยลบและล้างสิ่งที่ไม่ต้องการในแต่ละ Pixel ในหลักการนี้จะเป็นการค้นหาทุกๆ Pixel ตรวจสอบว่า เพื่อหาทิศทางของการไล่ระดับ
      • ดูรูปต่างอย่างด้านล่าง

มีข้อผิดพลาดในการสร้างรูปย่อ: ไฟล์สูญหาย
ภาพตัวอย่าง


จุด A อยู่บน ขอบ (ในทิศทางแนวตั้ง) ทิศทางการไล่โทนสีเป็นเรื่องปกติไปที่ขอบ จุด B และ C อยู่ในทิศทางการไล่ระดับสี ดังนั้นจุด A มีการตรวจสอบที่มีจุด B และ C เพื่อดูว่ารูปแบบสูงสุด ถ้าเป็นเช่นนั้นก็ถือว่าสำหรับขั้นตอนต่อไปมิฉะนั้นจะถูกระงับ (นำไปศูนย์)

ในระยะสั้นผลที่คุณได้รับเป็นภาพไบนารีด้วย "put to zero"

ในระยะสั้นนี้ ผลลัพธ์ ที่จะได้จะเป็นรูปภาพแบบ ไบนารี (Thin edges)


Hysteresis Thresholding

  • ขั้นตอนนี้ตัดสินใจที่ Edge ทั้งหมดของขอบ สำหรับเรื่องนี้ จจำเป็นต้องมีค่าสองค่าคือเกณฑ์ minVal และ maxVal โดยทุกๆขอบ ที่มีความคมชัดเข้มมากกว่าการไล่ระดับสี แบบ maxVal โดยจะแน่ใจว่าจะเป็นขอบด้านล่าง แน่ใจว่าจะเป็นขอบที่ไม่ใช่เพื่อทิ้ง หากจะเชื่อมต่อกับ "sure-edge" พิกเซล, พวกเขาจะถือว่าเป็นส่วนหนึ่งของขอบ มิฉะนั้นจะถูกลบ ดูภาพด้านล่าง:

มีข้อผิดพลาดในการสร้างรูปย่อ: ไฟล์สูญหาย
ภาพตัวอย่าง


Canny Edge Detection ใน OpenCV

  • ใน OpenCV จะมีการนำทุกๆ แนวคิด ทุกทฤษฏีของ Canny มาไว้ในฟังก์ชั่นเดียว โดยคำสั่งคือ cv2.Canny() ดูตัวอย่างโค๊ดข้างล่าง:

ตัวอย่าง Code Canny Edge

import cv2
import numpy as np
from matplotlib import pyplot as plt
 
img = cv2.imread('messi5.jpg',0)
edges = cv2.Canny(img,100,200)
 
plt.subplot(121),plt.imshow(img,cmap = 'gray')
plt.title('Original Image'), plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(edges,cmap = 'gray')
plt.title('Edge Image'), plt.xticks([]), plt.yticks([])
 
plt.show()


ผลลัพธ์


มีข้อผิดพลาดในการสร้างรูปย่อ: ไฟล์สูญหาย
ภาพตัวอย่าง