SURF descriptors, được giới thiệu bởi Bay et al. trong bài báo ECCV năm 2006, SURF: Speeded Up Robust Feature, thuật toán này rất giống với SIFT descriptor - nhưng mang hai ưu điểm chính.
- Ưu điểm đầu tiên là SURF tính toán nhanh hơn SIFT, khiến nó phù hợp hơn cho các ứng dụng real-time.
- Ưu điểm thứ hai của SURF là nó chỉ bằng một nửa kích thước của SIFT. Hãy nhớ lại bài viết trước rằng SIFT trả về một feature vector là 128-dim - trong khi đó SURF trả về một feature vector là 64-dim.
Cách hoạt động của SURF?
Giống như trong SIFT, bước đầu tiên trong SURF là chọn vùng hình chữ nhật của hình ảnh xung quanh keypoint. Kích thước chính xác của vùng được xác định trong giai đoạn phát hiện keypoint, thường là phương pháp Fast Hessian:
Trong giai đoạn thứ hai của SURF, chúng ta lặp lại từng keypoint được phát hiện và chia vùng keypoint thành 4 x 4 khu vực con, một lần nữa, giống như SIFT:
Tuy nhiên, đây là nơi SIFT và SURF bắt đầu khác nhau. Đối với mỗi khu vực phụ 4 x 4 này, Haar-wavelet được trích xuất tại window có size 5x5.
Đối với mỗi window, Haar-wavelet được tính theo cả hai hướng x và y. Chúng ta sẽ gọi các response này lần lượt là dx và dy:
Bây giờ chúng ta đã có dx và dy, chúng ta cân chúng Gaussian-kernel, như trong SIFT. Các điểm ở xa keypoint sẽ đóng góp ít hơn vào feature vector cuối cùng, trong khi các điểm gần trung tâm keypoint sẽ đóng góp nhiều hơn vào feature vector cuối cùng.
Bước cuối cùng trong SURF là tính toán feature vector.
Đối với mỗi tiểu khu vực 4 x 4, chúng ta tính toán:
Ở 2 phần tử đầu tiên trong feature vector, và
, là abstractions của Haar-wavelet. Ở 2 phần tử tiếp theo,
và
, chúng ta lấy giá trị tuyệt đối để mang lại thông tin liên quan đến các dấu hiệu thay đổi cường độ.
Do đó, chúng ta có 4 x 4 = 16 khu vực con, mỗi khu vực trả về một vectơ 4 chiều. Các feature vector với 4-dim sau đó được ghép lại. Do đó, feature vector cuối cùng có chiều 16 x 4 = 64-dim c
Cuối cùng, feature vector 64-dim sẽ được chuẩn hóa bằng L2.
Một lần nữa, feature SURF vừa nhanh hơn so với SIFT, vừa giảm một nửa kích thước của SIFT, do đó làm cho nó phù hợp hơn cho cả các ứng dụng bị hạn chế tài nguyên và thời gian thực.
SURF trong Python
Giống như SIFT và đối với OpenCV 2.4, chúng ta có thể sử dụng hàm cv2.DescriptorExtractor_create
để khởi tạo SURF.
Nếu chúng ta sử dụng OpenCV 3+, thì chúng ta chỉ cần sử dụng mô-đun xfeatures2d
và gọi SURF_create
:
# import the necessary packages
from __future__ import print_function
import argparse
import cv2
import imutils
# construct the argument parser and parse the arguments
ap = argparse.ArgumentParser()
ap.add_argument("-i", "--image", required=True, help="Path to the image")
args = vars(ap.parse_args())
# load the input image, convert it to grayscale
image = cv2.imread(args["image"])
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# handle if we are using OpenCV 2.4
if imutils.is_cv2():
# initialize the keypoint detector and local invariant descriptor
detector = cv2.FeatureDetector_create("SURF")
extractor = cv2.DescriptorExtractor_create("SURF")
# detect keypoints, and then extract local invariant descriptors
kps = detector.detect(gray)
(kps, descs) = extractor.compute(gray, kps)
# otherwise, we are using OpenCV 3+
else:
# initialize the keypoint detector and local invariant descriptor
detector = cv2.xfeatures2d.SURF_create()
# detect keypoints and extract local invariant descriptors
(kps, descs) = detector.detectAndCompute(gray, None)
# show the shape of the keypoints and local invariant descriptors array
print("[INFO] # of keypoints detected: {}".format(len(kps)))
print("[INFO] feature vector shape: {}".format(descs.shape))
Mời bạn có thể tham gia cộng đồng robotic để đặt câu hỏi cũng như tìm hiểu về robot.
Chúc bạn thành đạt trong công việc và hạnh phúc trong cuộc sống !
Hotline / Zalo: 0903 666 014
Website: https://uniduc.com/vi
-------------////--------------------------------------------////------------
HUMANOID ROBOT CỦA CÔNG TY UNIDUC SẢN XUẤT PHÁT TRIỂN.