Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Python

Chương trình Python phát hiện cạnh ảnh sử dụng OpenCV

Trong bài toán này, chúng ta sẽ xem cách Python có thể phát hiện cạnh của một tệp ả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. Đây là miễn phí sử dụng dưới giấy phép BSD mã nguồn mở.

Để sử dụng chức năng OpenCV, chúng ta cần tải chúng xuống sử dụng pip. OpenCV sẽ tải xuống module Numpy. Đó cũng sẽ được cần.

sudo pip3 install opencv-python

Là đầu vào, trong trường hợp này, chúng ta đã sử dụng một tệp video. Chúng ta 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 ta đang sử dụng một tệp video. Hình ảnh thực tế (khung của video) trông như sau:

Chương trình Python phát hiện cạnh ảnh sử dụng OpenCV

Phát hiện cạnh hoạt động như thế nào?

Để phát hiện cạnh, có một số quan sát toán học để kiểm tra xem độ sáng của pixel có đang thay đổi rõ rệt hay không.

Chúng ta cần tìm gradient cho phiên bản grayscale của ảnh của chúng ta. Trong thị giác máy tính, khi pixel chuyển từ đen sang trắng, nó được ghi nhận là độ dốc dương. Đối với chuyển từ trắng sang đen, nó là độ dốc âm.

Phát hiện cạnh sử dụng Đạo hàm của Ảnh

Một ảnh được lưu trữ như một ma trận, nơi mỗi phần tử của ma trận đó giữ thông tin về tất cả pixel. Để tìm đạo hàm chúng ta cần toán tử Laplacian. Vì vậy để lấy Laplacian, trước tiên chúng ta cần các đạo hàm Sobel. Các đạo hàm Sobel này được dùng để lấy biến thể gradient của một ảnh.

Đạo hàm Sobel Ngăn (Sobel X)

Đạo hàm Sobel này được thu được thông qua tích chập của ảnh thực tế và một ma trận khác (gọi là kernel). Kernel là ma trận 3x3 cho trường hợp đơn giản.

Có một hàm gọi là sobel(). Sử dụng hàm này, chúng ta có thể tìm các đạo hàm Sobel. Khi chúng ta cố gắng lấy Sobel x, thì phần y nên là 0.

Mã ví dụ

import cv2
import numpy as np

capture = cv2.VideoCapture('sample_video.mp4')  # Capture frames từ tệp video.
while(capture.isOpened()):
    # Chạy vòng lặp cho đến khi video kết thúc
    ret, frame = capture.read()  # Lấy khung hình từ video
    # Chuyển đổi màu BGR sang chế độ HSV (Hue Saturation Value)
    hsv_col = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
    # Phương thức Sobelx
    sobelx = cv2.Sobel(frame, cv2.CV_64F, 1, 0, ksize=5)
    cv2.imshow('SobelX', sobelx)
    k = cv2.waitKey(5) & 0xFF
    if k == 27:  # 27 là ASCII cho phím ESC. Khi ESC được nhấn, nó sẽ dừng
        break
capture.release()
cv2.destroyAllWindows()  # Dọn dẹp bộ nhớ sau khi xóa cửa sổ

Đầu ra

Chương trình Python phát hiện cạnh ảnh sử dụng OpenCV

Đạo hàm Sobel Dọc (Sobel Y)

Tương tự chúng ta có thể tìm đạo hàm Sobel dọc sử dụng hàm sobel(). Trong trường hợp này phần x sẽ là 0.

Mã ví dụ

import cv2
import numpy as np

capture = cv2.VideoCapture('sample_video.mp4')
while(capture.isOpened()):
    ret, frame = capture.read()
    hsv_col = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
    # Phương thức Sobely
    sobely = cv2.Sobel(frame, cv2.CV_64F, 0, 1, ksize=5)
    cv2.imshow('SobelY', sobely)
    k = cv2.waitKey(5) & 0xFF
    if k == 27:
        break
capture.release()
cv2.destroyAllWindows()

Đầu ra

Chương trình Python phát hiện cạnh ảnh sử dụng OpenCV

Đạo hàm Laplacian

Cuối cùng chúng ta sẽ xem Đạo hàm Laplacian của ảnh. Có một hàm gọi là Laplacian(). Nó được dùng để lấy đạo hàm.

Mã ví dụ

import cv2
import numpy as np

capture = cv2.VideoCapture('sample_video.mp4')
while(capture.isOpened()):
    ret, frame = capture.read()
    hsv_col = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
    # Phương thức Laplacian
    laplacian = cv2.Laplacian(frame, cv2.CV_64F)
    cv2.imshow('Laplacian', laplacian)
    k = cv2.waitKey(5) & 0xFF
    if k == 27:
        break
capture.release()
cv2.destroyAllWindows()

Đầu ra

Chương trình Python phát hiện cạnh ảnh sử dụng OpenCV