Trong vấn đề này, chúng ta sẽ xem cách Python có thể phát hiện các cạnh của tệp hình ảnh hoặc video. Để đạt được điều này, chúng ta cần thư viện OpenCV. Thư viện OpenCV chủ yếu được thiết kế cho thị giác máy tính. Nó là mã nguồn mở. Ban đầu nó được thiết kế bởi Intel. Điều này được sử dụng miễn phí theo giấy phép BSD nguồn mở.
Để sử dụng chức năng OpenCV, chúng tôi cần tải chúng xuống bằng cách sử dụng pip. OpenCV sẽ tải xuống mô-đun Numpy. Điều đó cũng sẽ cần thiết.
sudo pip3 install opencv-python
Như đầu vào, trong trường hợp này, chúng tôi đã sử dụng một tệp video. Chúng tôi cũng có thể sử dụng webcam của mình để xem hiệu ứng thời gian thực của quy trình phát hiện cạnh này.
Ở đây chúng tôi đang sử dụng một tệp video. Hình ảnh thực tế (khung của video) là như thế này -
Tính năng phát hiện cạnh hoạt động như thế nào?
Để phát hiện các cạnh, có một số quan sát toán học để kiểm tra xem liệu độ sáng của pixel có thay đổi rõ ràng hay không.
Chúng tôi cần tìm gradient cho phiên bản thang độ xám của hình ảnh của chúng tôi. Trong thị giác máy tính, khi các pixel chuyển từ đen sang trắng, nó được ghi nhận là một độ dốc dương. Đối với quá trình chuyển đổi màu trắng sang màu đen, đó là một độ dốc âm.
Phát hiện cạnh bằng cách sử dụng phái sinh của hình ảnh
Một hình ảnh được lưu trữ dưới dạng ma trận, trong đó mỗi phần tử của ma trận đó chứa thông tin về tất cả các pixel. Để tìm đạo hàm, chúng ta cần toán tử Laplacian. Vì vậy, để có được Laplacian, đầu tiên chúng ta cần các dẫn xuất Sobel. Các dẫn xuất Sobel này được sử dụng để lấy biến thể gradient của hình ảnh.
Đạo hàm sobel ngang (Sobel X)
Đạo hàm Sobel này thu được thông qua phép tích chập của ảnh thực và một ma trận khác (gọi là nhân). Kernel là ma trận 3x3 cho trường hợp đơn giản.
Có một hàm được gọi là sobel () . Sử dụng hàm này, chúng ta có thể tìm thấy các dẫn xuất sobel. Khi chúng ta cố gắng lấy Sobel x, thì phần y phải là 0.
Mã mẫu
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
Đầu ra
Đạo hàm Sobel dọc (Sobel Y)
Tương tự, chúng ta có thể tìm đạo hàm Vertical Sobel bằng cách sử dụng hàm sobel (). Trong trường hợp này, phần x sẽ là 0.
Mã mẫu
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
Đầu ra
Đạo hàm Laplacian
Cuối cùng, chúng ta sẽ thấy Đạo hàm Laplacian của hình ảnh. Có một hàm gọi là Laplacian (). Nó được sử dụng để lấy dẫn xuất.
Mã mẫu
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