Computer >> Máy Tính >  >> Lập trình >> Python

Chương trình Python để phát hiện các cạnh của hình ảnh bằng OpenCV

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 -

Chương trình Python để phát hiện các cạnh của hình ảnh bằng OpenCV

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

Chương trình Python để phát hiện các cạnh của hình ảnh bằng OpenCV

Đạ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

Chương trình Python để phát hiện các cạnh của hình ảnh bằng OpenCV

Đạ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

Đầu ra

Chương trình Python để phát hiện các cạnh của hình ảnh bằng OpenCV