Computer Vision

[Local Feature Descriptor] SURF

Xin chào, trong bài viết này chúng ta sẽ tìm hiểu về SURF (Speeded Up Robust Features) descriptor [1]. So sánh với SIFT, SURF nhanh hơn và yêu cầu ít bộ nhớ hơn, do đó phù hợp với các ứng dụng real-time.


TÌM HIỂU VỀ SURF DESCRIPTOR

Sau khi xác định được các keypoint có trong bức ảnh, vùng ảnh 20×20 pixel xung quanh mỗi keypoint sẽ được khảo sát. Vùng ảnh 20×20 pixel này lại được chia thành 16 vùng nhỏ hơn, xem hình 1.

4x4
Hình 1 – 16 vùng 5×5 pixel

Đối với từng vùng, Haar Wavelet Transform (HWT) [2] sẽ được thực hiện theo cột (dy) và hàng (dx). Từ các giá trị dx, dy tính toán được, chúng ta sẽ có được Feature Vector cho từng vùng v = [\sum{d_x}, \sum{d_y}, \sum{|d_x|}, \sum{|d_y|}].

local_invariant_descriptors_surf_haar_wavelets
Hình 2 – Haar Wavelet Transform

Ghép tất cả Feature Vector của 16 vùng 5×5 pixel, Local Feature Vector của keypoint sẽ là 16×4 = 64-d. Cuối cùng chúng ta thực hiện L2-normalizing cho Feature Vector vừa nhận được.

Cũng nói thêm, HWT là một phép biến đổi tín hiệu số, được sử dụng như một giải pháp nhằm khắc phục các khuyết điểm của Fast Fourier Transform. Trong phạm vi bài viết này chúng ta sẽ không tìm hiểu sâu về HWT. Sau đây là ví dụ về biến đổi HWT trên 2-D image theo hàng và cột.

input
Hình 3 – Ảnh gốc
row
Hình 4 – Biến đổi HWT theo hàng
col
Hình 5 – Biến đổi HWT theo cột

ÁP DỤNG SURF DESCRIPTOR

Các function để áp dụng SURF Descriptor được cung cấp bởi OpenCV 3.

Function:

+ Tạo instance của SURF Descriptor:

extractor cv2.xfeatures2d.SURF_create()

+ Trích xuất đặc trưng của các keypoints:

keypoints, descriptors = extractor.compute(image, keypoints)

Trong đó:

  • image – bức ảnh input ở grayscale;
  • keypoints – một List chứa các keypoint đã phát hiện được trong image;
  • descriptors – một ndarray có kích thước M x N chứa các vector đặc trưng trích xuất được từ các Image Patch, trong đó: M là số lượng keypoint, N là kích thước của vector đặc trưng.

Example:
Source code: SURF.py

import numpy as np
import cv2

image = cv2.imread("chessboard.jpg")
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

detector = cv2.FastFeatureDetector_create()
kps = detector.detect(gray)

extractor = cv2.xfeatures2d.SURF_create()
kps, descs = detector.compute(gray, kps)

print("[INFO] # of keypoints: {}".format(len(kps)))
print("[INFO] Feature Vector shape: {}".format(descs.shape))

Input: chessboard.jpg
chessboard

Output:
[INFO] # of keypoints: 308
[INFO] Feature Vector shape: (308, 64)


SUMMARY

Qua bài viết này chúng ta đã tìm hiểu về SURF descriptor. Cảm ơn các bạn đã theo dõi bài viết.

Thân ái và quyết thắng.

Reference:
[1] Introduction to SURF (Speeded-Up Robust Features)
[2] Haar Wavelet Transformation

2 thoughts on “[Local Feature Descriptor] SURF

    1. Chào bạn, lỗi này là do bạn chưa cài đặt module opencv_contrib.
      + Nếu bạn đã cài đặt OpenCV cho Python với pip thì chỉ cần cài thêm opencv_contrib với lệnh sau:
      $ python -m pip install opencv-contrib-python==3.4.5.20
      + Nếu bạn download OpenCV for Windows từ trang chủ của OpenCV thì ko thể thay đổi được, chỉ còn cách xóa bản OpenCV hiện tại rồi compile từ sourecode (khó và lâu) hoặc cài lại với pip (dễ và nhanh):
      $ python -m pip install opencv-python==3.4.5.20
      $ python -m pip install opencv-contrib-python==3.4.5.20

      Thân ái.

      Like

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s