Computer Vision

[Image Descriptor] Zernike Moments

Xin chào, trong bài viết hôm nay chúng ta sẽ tìm hiểu về Zernike Moments. Zernike Moments cũng tương tự như Hu Moments, được dùng để mô tả hình dạng của các đối tượng có trong bức ảnh, tuy nhiên nó mạnh mẽ và chính xác hơn Hu Moments khá nhiều.


ZERNIKE MOMENTS LÀ GÌ?

Zernike Moments là một Image Descriptor được dùng để mô tả hình dạng của các đối tượng có trong bức ảnh nhị phân hoặc edged-image. Trong đa số trường hợp, việc sử dụng ảnh nhị phân (segmented binary) sẽ cho ra kết quả tốt hơn vì ít bị ảnh hưởng bởi nhiễu.


ZERNIKE MOMENTS IMPLEMENTATION

Vì OpenCV chưa hỗ trợ function để tính toán Zernike Moments nên chúng ta sẽ sử dụng function zernike_moments của gói thư viện xử lý hình ảnh Mahotas.

Install:

pip3 install mahotas

Function:

features = mahotas.features.zernike_moments(roi, radius, degree)

Trong đó:

  • roi – vùng hình ảnh chứa đối tượng;
  • radius – bán kính của đường tròn có thể bao quanh đối tượng, càng khớp với đối tượng càng tốt;
  • degree – bậc của đa thức tính toán, mặc định là 8;
  • features – feature vector 25-d nhận được sau khi tính toán Zernike Moments.

Trong ví dụ dưới đây chúng ta sẽ sử dụng Zernike Moments để nhận dạng một đối tượng cho trước. Input của chúng ta sẽ là (1) Reference Image (chứa đối tượng cần nhận dạng) và (2) Distractor Image (chứa nhiều đối tượng khác nhau, bao gồm cả đối tượng cần nhận dạng).

Example:

Input:

object

Figure 1 – Reference Image [Source: PyImageSearch.com]

objects

Figure 2 – Distractor Image [Source: PyImageSearch.com]

Chúng ta có thể thấy rằng đối tượng trong Reference Image bị xoay trái 90° so với đối tượng cần nhận dạng trong Distractor Image, liệu Zernike Moments có thể giúp chúng ta nhận dạng ra nó không?!

Source code:

from scipy.spatial import distance as dist
import numpy as np
import mahotas
import cv2

def describe_shapes(image):
	shapeFeatures = []

	gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
	blurred = cv2.GaussianBlur(gray, (13,13), 0)
	thresh = cv2.threshold(blurred, 50, 255, cv2.THRESH_BINARY)[1]

	thresh = cv2.dilate(thresh, None, iterations=4)
	thresh = cv2.erode(thresh, None, iterations=2)

	cnts = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[1]

	for c in cnts:
		mask = np.zeros(image.shape[:2], dtype="uint8")
		cv2.drawContours(mask, [c], -1, 255, -1)

		(x,y,w,h) = cv2.boundingRect(c)
		roi = mask[y:y+h, x:x+w]

		features = mahotas.features.zernike_moments(roi, cv2.minEnclosingCircle(c)[1], degree=8)
		shapeFeatures.append(features)

	return (cnts, shapeFeatures)

refImage = cv2.imread("object.jpg")
gameFeatures = describe_shapes(refImage)[1]

shapeImage = cv2.imread("objects.jpg")
(cnts, shapeFeatures) = describe_shapes(shapeImage)

D = dist.cdist(gameFeatures, shapeFeatures)
i = np.argmin(D)

for (j, c) in enumerate(cnts):
	if i != j:
		box  = cv2.minAreaRect(c)
		box = cv2.boxPoints(box).astype("int0")
		cv2.drawContours(shapeImage, [box], -1, (0,0,255), 2)

box = cv2.minAreaRect(cnts[i])
box = cv2.boxPoints(box).astype("int0")
cv2.drawContours(shapeImage, [box], -1, (0,255,0), 2)
(x,y,w,h) = cv2.boundingRect(cnts[i])
cv2.putText(shapeImage, "FOUND!", (x,y-10), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0,255,0), 3)

cv2.imshow("Input Image", refImage)
cv2.imshow("Detected Shapes", shapeImage)
cv2.waitKey(0)

Giải thích:
– Ở dòng 1: chúng ta import gói thư viện mahotas;
– Function describe_shapes() được dùng để tính toán Zernike Moments cho các đối tượng có trong bức ảnh. Trước tiên chúng ta cần xử lý hình ảnh để loại bỏ nhiễu và áp dụng cv2.findContours() để xác định Contour của từng đối tượng. Để phân tách từng đối tượng chúng ta cần vẽ Contour của nó lên một ma trận zero và tìm ra vị trí của nó với function cv2.boundingRect(). Như đã biết, function mahotas.features.zernike_moments() có 3 tham số là ROI, Radius và Degree, trong đó Radius được tính toán tự động bởi function cv2.minEnclosingCircle() nhằm phù hợp với từng đối tượng;
– Ở dòng 36, 37: function cdist() được dùng để tính toán distance giữa từng cặp Feature Vector (tương đương với function pairwise_distances() ở bài Hu Moments). Hai đối tượng càng giống nhau thì distance giữa hai Feature Vector càng nhỏ;

Output:

output


SUGGESTIONS

Tương tự như đối với Hu Moments, nếu có nhiều đối tượng trong bức ảnh, chúng ta phải tách và áp dụng Zernike Moments cho từng đối tượng riêng biệt.

Tham số Radius khi tính toán Zernike Moments là rất quan trọng. Cần đảm bảo rằng Radius đủ lớn để có thể bao phủ toàn bộ đối tượng trước khi áp dụng Zernike Moments.

Tham số Degree ảnh hưởng đến kích thước của Feature Vector nhận được sau khi áp dụng Zernike Moments. Giá trị của Degree càng lớn thì kích thước của Feature Vector càng lớn và thời gian tính toán càng cao.

Ưu điểm của Zernike Moments:

  • Thời gian tính toán nhanh;
  • Kích thước nhỏ;
  • Mô tả tốt các hình dạng đơn giản;
  • Chỉ có 2 tham số Radius và Degree.

Nhược điểm:

  • Yêu cầu nhị phân hóa đối tượng một cách chính xác, điều này thường rất khó trong điều kiện thực tế.
  • Thường chỉ được áp dụng cho các hình 2D đơn giản.
  • Zernike Moments are calculated based on the initial centroid computation — if the initial centroid cannot be repeated for similar shapes, then Zernike Moments will not obtain good matching accuracy.

SUMMARY

Qua bài viết này chúng ta đã tìm hiểu thêm một Image Descriptor nữa là Zernike Moments. Cảm ơn các bạn đã theo dõi bài viết.

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

Reference:
[1] Zernike polynomials.
[1] mahotas zernike_moments function.

One thought on “[Image Descriptor] Zernike Moments

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