Computer Vision

[Keypoint Detector] MSER

Xin chào, trong bài viết này chúng ta sẽ tìm hiểu về Keypoint Detector MSER (Maximally Stable Extremal Regions).


TÌM HIỂU VỀ MSER KEYPOINT DETECTOR

MSER detector được sử dụng để phát hiện các vùng “blob” có trong bức ảnh. Các vùng này phải thỏa mãn các điều kiện sau: (1) gồm các thành phần được kết nối với nhau, (2) có cường độ điểm ảnh tương đồng và (3) có sự tương phản với background.

MSER detector áp dụng một loạt giá trị threshold trong khoảng [0, 255] để nhị phân hóa bức ảnh grayscale. Mỗi bức ảnh nhị phân sẽ tương ứng với một giá trị threshold T_i. MSER sẽ theo dõi sự thay đổi của các bức ảnh này và xác định các vùng ảnh có hình dạng không thay đổi qua một loại các giá trị threshold.

Các bước mà MSER detector thực hiện như sau:

  • Bước 1: Tìm các Connected-component có trong từng bức ảnh nhị phân;
  • Bước 2: Tính diện tích của các connected-component đó;
  • Bước 3: Theo dõi giá trị diện tích của các connected-component qua hàng loạt giá trị threshold. Nếu diện tích gần như là hằng số thì có thể coi vùng này là một “blob”.

mser_multi_threshold-865x543

Hình 1 – Nhị phân hóa bức ảnh với nhiều giá trị threshold

Cần chú ý rằng MSER không hoạt động tốt nếu bức ảnh input bị mờ, vì nó làm cho quá trình nhị phân hóa và phân tích connected-component không hiệu quả. Ngoài ra, MSER quá chậm để áp dụng cho các ứng dụng real-time.


ÁP DỤNG MSER KEYPOINT DETECTOR

OpenCV 3 cung cấp các function sau để áp dụng MSER detector:

+ Tạo instance MSER detector:

detector = cv2.MSER_create()

+ Xác định các vùng “blob”:

kps = detector.detect(inputImage[, mask=None])

Trong đó:

  • inputImage – bức ảnh input ở grayscale;
  • kps – một List chứa KeyPoint.

Example:

Input: chessboard.jpg

chessboard

Source code: MSER.py

import numpy as np
import cv2

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

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

print("# of keypoints: {}".format(len(kps)))

for kp in kps:
    r = int(0.5*kp.size)
    (x,y) = np.int0(kp.pt)
    cv2.circle(image, (x,y), r, (0,255,255), 1)

cv2.imshow("images", image)
cv2.waitKey(0)

Output:
Capture


SUMMARY

Như vậy chúng ta đã tìm hiểu về MSER Keypoint Detector. Cảm ơn các bạn đã theo dõi bài viết.

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

Reference:
[1] OpenCV – MSER Class Reference.

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