Phát hiện cạnh là thuật ngữ xác định ranh giới của đối tượng trong hình ảnh. Chúng ta sẽ tìm hiểu về cách phát hiện cạnh bằng cách sử dụng kỹ thuật phát hiện cạnh canny.
Giới thiệu về nhận diện cạnh
Nhận diện cạnh là một quá trình quan trọng trong xử lý ảnh và phân tích hình ảnh. Nó nhằm xác định và phân loại các đường viền và ranh giới giữa các vùng trong một hình ảnh. Nhận diện cạnh được sử dụng rộng rãi trong nhiều ứng dụng như nhận dạng đối tượng, phát hiện vật thể, phân tích biên giới, xử lý hình ảnh y tế và nhiều lĩnh vực khác.
Xem thêm Các kỹ thuật Computer Vision trong OpenCV
Quá trình nhận diện cạnh thông thường bao gồm các bước chính sau:
- Làm mờ ảnh: Sử dụng các kỹ thuật làm mờ để giảm nhiễu và làm mượt hình ảnh, nhằm loại bỏ các chi tiết không cần thiết và tăng cường độ tương phản của các cạnh.
- Tính toán đạo hàm và hướng cạnh: Sử dụng các phương pháp tính toán đạo hàm (như Sobel, Prewitt) để xác định độ dốc của mỗi điểm ảnh và hướng cạnh tại điểm đó.
- Lọc cạnh: Áp dụng các bộ lọc (như bộ lọc Laplacian) để phát hiện và tìm kiếm cạnh dựa trên đạo hàm của ảnh.
- Phân ngưỡng: Áp dụng các ngưỡng để xác định cạnh dựa trên giá trị độ dốc hoặc các thông số khác.
Trong quá trình nhận diện cạnh, thuật toán Canny là một thuật toán phổ biến được sử dụng. Nó kết hợp các bước trên để tìm ra các cạnh có độ tương phản cao và định rõ trong ảnh. Thuật toán Canny cung cấp các kết quả chính xác và được sử dụng rộng rãi trong xử lý ảnh.
Việc nhận diện cạnh trong OpenCV, một thư viện xử lý ảnh phổ biến trong Python, cung cấp các công cụ và phương pháp để thực hiện quá trình này. Bằng cách sử dụng các hàm và phương thức có sẵn trong OpenCV, bạn có thể áp dụng thuật toán Canny và các phương pháp nhận diện cạnh khác để tìm và xử lý cạnh trong ảnh một cách hiệu quả.
Thông số:
- / path / to / img: đường dẫn tệp của hình ảnh (bắt buộc)
- minVal: Gradient cường độ tối thiểu (bắt buộc)
- maxVal: Độ dốc cường độ tối đa (bắt buộc)
- aperture (khẩu độ): Đây là đối số tùy chọn.
- L2gradient: Giá trị mặc định của nó là false, nếu giá trị là true, Canny () sử dụng một phương trình tính toán đắt tiền hơn để phát hiện các cạnh, cung cấp độ chính xác hơn với chi phí tài nguyên.
Ví dụ 1
Đầu ra
Ví dụ về Real time Edge detection
# import libraries of python OpenCV import cv2 # import Numpy by alias name np import numpy as np # capture frames from a camera cap = cv2.VideoCapture(0) # loop runs if capturing has been initialized while (1): # reads frames from a camera ret, frame = cap.read() # converting BGR to HSV hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV) # define range of red color in HSV lower_red = np.array([30, 150, 50]) upper_red = np.array([255, 255, 180]) # create a red HSV colour boundary and # threshold HSV image mask = cv2.inRange(hsv, lower_red, upper_red) # Bitwise-AND mask and original image res = cv2.bitwise_and(frame, frame, mask=mask) # Display an original image cv2.imshow('Original', frame) # discovers edges in the input image image and # marks them in the output map edges edges = cv2.Canny(frame, 100, 200) # Display edges in a frame cv2.imshow('Edges', edges) # Wait for Esc key to stop k = cv2.waitKey(5) & 0xFF if k == 27: break # Close the window cap.release() # De-allocate any associated memory usage cv2.destroyAllWindows()
Đầu ra:
Xem thêm OpenCV là gì? tìm hiểu OpenCV
Cách hoạt động của thuật toán Canny
Thuật toán Canny là một thuật toán phổ biến để nhận diện cạnh trong xử lý ảnh. Nó được phát triển bởi John F. Canny vào năm 1986 và đã trở thành một trong những phương pháp phổ biến và hiệu quả nhất cho việc nhận diện cạnh. Các bước chính của thuật toán Canny bao gồm:
- Làm mờ ảnh: Trước khi nhận diện cạnh, ảnh đầu vào được làm mờ bằng một bộ lọc Gaussian. Điều này giúp giảm nhiễu và loại bỏ các chi tiết không cần thiết trong ảnh.
- Tính toán độ dốc và hướng cạnh: Sử dụng các bộ lọc đạo hàm như Sobel, thuật toán tính toán độ dốc và hướng cạnh tại mỗi điểm ảnh. Độ dốc cho biết độ lớn của cạnh tại điểm ảnh và hướng cạnh cho biết hướng của cạnh (ngang, dọc hoặc chéo).
- Lọc cạnh: Sau đó, thuật toán thực hiện quá trình lọc cạnh bằng cách tìm các điểm cực đại trên độ dốc. Những điểm này đại diện cho các điểm cạnh tiềm năng trong ảnh.
- Phân ngưỡng hai ngưỡng: Trong bước này, ngưỡng được áp dụng để lựa chọn các cạnh có độ lớn đủ lớn. Thuật toán sử dụng hai ngưỡng: ngưỡng dưới (lower threshold) và ngưỡng trên (upper threshold). Các điểm cạnh có độ lớn vượt qua ngưỡng trên sẽ được coi là cạnh chắc chắn, các điểm cạnh có độ lớn nằm giữa ngưỡng trên và ngưỡng dưới sẽ được coi là cạnh yếu và có thể bị loại bỏ hoặc được xem là cạnh nếu chúng kề cạnh chắc chắn.
- Hồi tiếp (Hysteresis): Trong bước cuối cùng, thuật toán thực hiện quá trình hồi tiếp để loại bỏ các cạnh yếu không quan trọng. Các điểm cạnh yếu chỉ được chấp nhận nếu chúng kề cạnh chắc chắn. Quá trình này giúp giữ lại các cạnh chắc chắn và loại bỏ các cạnh yếu không đáng tin cậy.
Kết quả cuối cùng của thuật toán Canny là tập hợp các điểm cạnh chắc chắn và đáng tin cậy trong ảnh. Đây là các điểm biên giới giữa các vùng trong ảnh và có thể được sử dụng cho các mục đích như phân tích hình ảnh, nhận dạng đối tượng và xử lý ảnh khác trong lĩnh vực thị giác máy tính.
Xem thêm OpenCV image Threshold
Thực hiện nhận diện cạnh Canny trong OpenCV
Để thực hiện nhận diện cạnh Canny trong OpenCV, bạn có thể sử dụng các hàm và phương thức có sẵn trong thư viện. Dưới đây là một ví dụ về cách thực hiện nhận diện cạnh Canny trong OpenCV bằng Python:
import cv2 # Đọc ảnh đầu vào image = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE) # Áp dụng thuật toán Canny edges = cv2.Canny(image, threshold1, threshold2) # Hiển thị ảnh gốc và ảnh đã nhận diện cạnh cv2.imshow('Original Image', image) cv2.imshow('Canny Edges', edges) cv2.waitKey(0) cv2.destroyAllWindows()
Trong đoạn mã trên:
- Đầu tiên, chúng ta sử dụng hàm
cv2.imread()
để đọc ảnh đầu vào. Chúng ta sử dụng cờcv2.IMREAD_GRAYSCALE
để đọc ảnh dưới dạng ảnh xám. - Tiếp theo, chúng ta sử dụng hàm
cv2.Canny()
để áp dụng thuật toán Canny vào ảnh xám. Hai tham sốthreshold1
vàthreshold2
là ngưỡng dưới và ngưỡng trên, quyết định mức độ nhạy của quá trình phát hiện cạnh. - Sau đó, chúng ta hiển thị ảnh gốc và ảnh đã nhận diện cạnh bằng cách sử dụng hàm
cv2.imshow()
. Chúng ta sử dụngcv2.waitKey(0)
để chờ người dùng nhấn một phím bất kỳ trước khi đóng cửa sổ hiển thị. - Cuối cùng, chúng ta dùng
cv2.destroyAllWindows()
để đóng tất cả các cửa sổ hiển thị.
Lưu ý rằng bạn cần phải cài đặt và nhập khẩu thư viện OpenCV trước khi chạy mã này.
Xem thêm Giới thiệu về giao diện Adobe Illustrator
Ứng dụng và ví dụ sử dụng nhận diện cạnh Canny
Nhận diện cạnh Canny có nhiều ứng dụng trong xử lý ảnh và thị giác máy tính. Dưới đây là một số ví dụ về cách sử dụng nhận diện cạnh Canny trong thực tế:
- Phát hiện biên giới và đường viền: Nhận diện cạnh Canny có thể được sử dụng để phát hiện biên giới và đường viền của các đối tượng trong ảnh. Ví dụ: trong công nghệ tự động lái xe, nhận diện cạnh Canny được sử dụng để phát hiện biên giới của các vật thể trên đường.
- Phát hiện và nhận dạng đối tượng: Nhận diện cạnh Canny có thể được sử dụng để phát hiện và nhận dạng các đối tượng trong ảnh. Ví dụ: trong hệ thống giám sát an ninh, nhận diện cạnh Canny được sử dụng để phát hiện và nhận dạng người hoặc vật thể nghi ngờ.
- Xử lý hình ảnh y tế: Nhận diện cạnh Canny có thể được sử dụng để phân tích và xử lý hình ảnh y tế. Ví dụ: trong chẩn đoán hình ảnh, nhận diện cạnh Canny được sử dụng để phát hiện các cạnh của các cấu trúc trong hình ảnh y tế, như mạch máu, tế bào hoặc cấu trúc bên trong cơ thể.
- Phân tích hình ảnh và phát hiện vật thể: Nhận diện cạnh Canny có thể được sử dụng trong phân tích hình ảnh và phát hiện vật thể. Ví dụ: trong nhận dạng khuôn mặt, nhận diện cạnh Canny được sử dụng để phát hiện và xác định các cạnh của khuôn mặt.
Ví dụ sử dụng nhận diện cạnh Canny trong OpenCV:
import cv2 # Đọc ảnh đầu vào image = cv2.imread('object.jpg', cv2.IMREAD_GRAYSCALE) # Áp dụng thuật toán Canny edges = cv2.Canny(image, 100, 200) # Hiển thị ảnh gốc và ảnh đã nhận diện cạnh cv2.imshow('Original Image', image) cv2.imshow('Canny Edges', edges) cv2.waitKey(0) cv2.destroyAllWindows()
Trong ví dụ trên, chúng ta sử dụng ảnh đầu vào ‘object.jpg’. Áp dụng thuật toán Canny với ngưỡng dưới là 100 và ngưỡng trên là 200 để tìm cạnh trong ảnh. Kết quả sẽ hiển thị ảnh gốc và ảnh đã nhận diện cạnh.
Xem thêm Cài đặt OpenCV: Hướng dẫn chi tiết