ในปัญหานี้ เราจะมาดูกันว่า Python สามารถตรวจจับขอบของไฟล์รูปภาพหรือวิดีโอได้อย่างไร เพื่อให้บรรลุสิ่งนี้ เราจำเป็นต้องมีไลบรารี OpenCV ไลบรารี OpenCV ได้รับการออกแบบมาสำหรับการมองเห็นด้วยคอมพิวเตอร์เป็นหลัก เป็นโอเพ่นซอร์ส เดิมทีได้รับการออกแบบโดย Intel ใช้งานได้ฟรีภายใต้ใบอนุญาต BSD แบบโอเพนซอร์ส
ในการใช้ฟังก์ชัน OpenCV เราจำเป็นต้องดาวน์โหลดโดยใช้ pip. OpenCV จะดาวน์โหลดโมดูล Numpy นั่นก็จำเป็นเช่นกัน
sudo pip3 install opencv-python
ตามที่ป้อน ในกรณีนี้ เราได้ใช้ไฟล์วิดีโอหนึ่งไฟล์ เรายังใช้เว็บแคมเพื่อดูเอฟเฟกต์แบบเรียลไทม์ของขั้นตอนการตรวจจับขอบนี้ได้
ที่นี่เราใช้ไฟล์วิดีโอ ภาพจริง (เฟรมของวิดีโอ) เป็นแบบนี้ −
การตรวจจับขอบทำงานอย่างไร
ในการตรวจจับขอบ มีการสังเกตทางคณิตศาสตร์เพื่อตรวจสอบว่าความสว่างของพิกเซลเปลี่ยนแปลงอย่างชัดเจนหรือไม่
เราจำเป็นต้องค้นหาการไล่ระดับสีสำหรับภาพเวอร์ชันสีเทา ในการมองเห็นด้วยคอมพิวเตอร์ เมื่อพิกเซลเปลี่ยนจากสีดำเป็นสีขาว จะถือว่ามีความชันเป็นบวก สำหรับการเปลี่ยนจากสีขาวเป็นสีดำ จะเป็นความชันเชิงลบ
การตรวจจับขอบโดยใช้อนุพันธ์ของรูปภาพ
รูปภาพถูกจัดเก็บเป็นเมทริกซ์ โดยที่แต่ละองค์ประกอบของเมทริกซ์นั้นเก็บข้อมูลเกี่ยวกับพิกเซลทั้งหมด ในการหาต้นตอ เราต้องการโอเปอเรเตอร์ Laplacian เพื่อให้ได้ลาปลาเซียน อันดับแรก เราต้องอนุพันธ์โซเบล อนุพันธ์ของ Sobel เหล่านี้ใช้เพื่อให้ได้รูปแบบการไล่ระดับสีของรูปภาพ
อนุพันธ์โซเบลแนวนอน (Sobel X)
อนุพันธ์ของ Sobel นี้ได้มาจากการบิดภาพจริงและเมทริกซ์อื่น (เรียกว่าเคอร์เนล) เคอร์เนลคือเมทริกซ์ 3x3 สำหรับตัวพิมพ์ธรรมดา
มีฟังก์ชันที่เรียกว่า sobel() . การใช้ฟังก์ชันนี้ เราสามารถหาอนุพันธ์ของโซเบลได้ เมื่อเราพยายามหา Sobel x ส่วน y ควรจะเป็น 0
โค้ดตัวอย่าง
import cv2 import numpy as np capture = cv2.VideoCapture('sample_video.mp4') #Capture frames from video file. while(capture.isOpened()): # Run the loop until the video ends ret, frame = capture.read() #Fetch the frames from video # Convert BGR color to (Hue Saturation Value) mode hsv_col = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV) # The Sobelx Method sobelx = cv2.Sobel(frame,cv2.CV_64F,1,0,ksize=5) cv2.imshow('SobelX',sobelx) k = cv2.waitKey(5) & 0xFF if k == 27: #27 is the ASCII for ESC key. When ESC is pressed, it will stop break capture.release() cv2.destroyAllWindows() #Clean memory after removing the windows
ผลลัพธ์
อนุพันธ์ Sobel แนวตั้ง (Sobel Y)
ในทำนองเดียวกัน เราสามารถหาอนุพันธ์ของ Vertical Sobel ได้โดยใช้ฟังก์ชัน sobel() ในกรณีนี้ ส่วน x จะเป็น 0
โค้ดตัวอย่าง
import cv2 import numpy as np capture = cv2.VideoCapture('sample_video.mp4') #Capture frames from video file. while(capture.isOpened()): # Run the loop until the video ends ret, frame = capture.read() #Fetch the frames from video # Convert BGR color to (Hue Saturation Value) mode hsv_col = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV) # The Sobely Method sobely = cv2.Sobel(frame,cv2.CV_64F,0,1,ksize=5) cv2.imshow('SobelY',sobely) k = cv2.waitKey(5) & 0xFF if k == 27: #27 is the ASCII for ESC key. When ESC is pressed, it will stop break capture.release() cv2.destroyAllWindows() #Clean memory after removing the windows
ผลลัพธ์
อนุพันธ์ของ Laplacian
สุดท้ายเราจะเห็น Laplacian Derivative ของภาพ มีฟังก์ชันที่เรียกว่า Laplacian() ใช้เพื่อหาอนุพันธ์
โค้ดตัวอย่าง
import cv2 import numpy as np capture = cv2.VideoCapture('sample_video.mp4') #Capture frames from video file. while(capture.isOpened()): # Run the loop until the video ends ret, frame = capture.read() #Fetch the frames from video # Convert BGR color to (Hue Saturation Value) mode hsv_col = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV) # The Laplacian Method laplacian = cv2.Laplacian(frame,cv2.CV_64F) cv2.imshow('Laplacian',laplacian) k = cv2.waitKey(5) & 0xFF if k == 27: #27 is the ASCII for ESC key. When ESC is pressed, it will stop break capture.release() cv2.destroyAllWindows() #Clean memory after removing the windows