Computer Vision

[Image Descriptor] Haralick Texture Features

Xin chào, trong bài viết này chúng ta sẽ tìm hiểu về Haralick Texture Features và các ứng dụng của nó.


HARALICK TEXTURE FEATURES LÀ GÌ?

Haralick Texture Features được dùng để mô tả “texture” (kết cấu) và “pattern” (hoa văn) của một bức ảnh/đối tượng, bao gồm vẻ bề ngoài (appearance), sự nhất quán (consistency) và cảm giác về bề mặt (“feeling of surface”) có trong bức ảnh.


HIỂU VỀ HARALICK TEXTURE FEATURES

Haralick Texture Features được tính toán bằng cách sử dụng Gray-Level Co-occurrence Matrix (GLCM) [1]. Ma trận này đặc trưng cho kết cấu của bức ảnh bằng cách ghi lại tần suất xuất hiện trong bức ảnh của các cặp điểm ảnh liền kề với các giá trị cụ thể.

haralick_glcm_example

Có 4 ma trận GLCM được sử dụng để tính toán, từ mỗi ma trận sẽ cho ra 13 giá trị của Haralick Texture Featues (tức là feature shape = (4, 13)), sau đó tìm ra 13 giá trị trung bình từ list này. Các giá trị này sẽ được dùng để mô tả sự tương phản (contrast), tương quan (correlation), sự khác biệt (dissimilarity), entropy, tính đồng nhất (homogeneity) và các đặc tính thống kê khác.


HARALICK TEXTURE FEATURES IMPLEMENTATION

Vì OpenCV chưa hỗ trợ function để tính toán Haralick Texture Features nên chúng ta sẽ sử dụng gói thư viện xử lý hình ảnh Mahotas với method mahotas.features.haralick().

Install:

pip3 install mahotas

Function:

features = mahotas.features.haralick(grayscaleImage)

Trong đó:

  • grayscaleImage – bức ảnh nhị phân cần mô tả kết cấu;
  • features – feature vector nhận được sau khi tính toán Haralick Texture Features.

Để tăng sự linh hoạt, chúng ta sẽ tính giá trị trung bình của các features bằng function numpy.mean():

features = mahotas.features.haralick(grayscaleImage).mean(axis=0)


PHÂN LOẠI KẾT CẤU VỚI HARALICK TEXTURE FEATURES

Trong phần này, bằng cách áp dụng Haralick Texture Features và Machine Learning, chúng ta sẽ phân loại các bức ảnh chứa các bề mặt đá, cát và gạch.

Đầu tiên chúng ta cần chuẩn bị data set, data set sẽ bao gồm training set (dùng để “dạy” cho máy) và testing set (dùng để kiểm tra kết quả). Training set và testing set cần phải hoàn toàn khác biệt nhau để cho ra kết quả khách quan nhất.

Để áp dụng Supervised Learning, training set cần đi kèm với các label (categories) tương ứng. Vì vậy, đối với các bức ảnh trong training set, chúng ta sẽ đặt tên theo cú pháp sau:

textureTypenumeber.ext

Trong đó:

  • textureType – label/category của texture, ở đây là brick, sand hoặc rock;
  • number – số thứ tự;
  • ext – phần mở rộng của bức ảnh, .jpg hoặc .png;

Ví dụ: brick-1.jpg, brick-2.jpg, sand-3.jpg, rock-4.jpg.

Folder training chứa training set của chúng ta sẽ gồm các bức ảnh sau:

Figure 1 – Training set

Đối với Testing set, chúng ta có thể đặt tên tùy ý cho các bức ảnh và đặt chúng vào folder testing.

Figure 2 – Testing set

Source code: haralickTexture.py

from sklearn.svm import LinearSVC
import argparse
import mahotas
import glob
import cv2

ap = argparse.ArgumentParser()
ap.add_argument("-d", "--training", required=True)
ap.add_argument("-t", "--test", required=True)

args = vars(ap.parse_args())

print("[INFO] extracting features...")
data = []
labels = []

for imagePath in glob.glob(args["training"] + "/*.jpg"):
	image = cv2.imread(imagePath)
	image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
	texture = imagePath[imagePath.rfind("/") + 1:].split("-")[0]

	features = mahotas.features.haralick(image).mean(axis=0)

	data.append(features)
	labels.append(texture)

print("[INFO] traning model...")
model = LinearSVC()
model.fit(data, labels)
print("[INFO] classifying...")

for imagePath in glob.glob(args["test"] + "/*.jpg"):
	image = cv2.imread(imagePath)
	gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
	features = mahotas.features.haralick(gray).mean(axis=0)

	pred = model.predict(features.reshape(1,-1))[0]
	cv2.putText(image, pred, (20,30), cv2.FONT_HERSHEY_SIMPLEX, 1.0, (0,255,0), 3)

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

Giải thích:
– Dòng 1-5: import các package cần thiết;
– Dòng 17-25: đối với từng bức ảnh trong Training set, chúng ta tách label từ tên của chúng và tính toán Haralick Texture Features;
– Dòng 28,29: khởi tạo đối tượng Linear Support Vector Classification và “dạy” cho máy biết cách phân biệt từng category với method fit();
– Dòng 32-41: đối với từng bức ảnh trong Testing set, chúng ta tính toán Haralick Texture Features của chúng, sau đó đưa các giá trị này vào method predict() để máy dự đoán ra category tương ứng;
– Dòng 38: method model.predict() yêu cầu input phải là một mảng 2 chiều có kích thước n_samples x n_features, vì chúng ta chỉ có một sample nên cần chuyển features về dạng mảng 2 chiều có kích thước 1 x n_features.

Execution:
$ python haralickTexture.py -d training -t testing

Output:

Figure 3 – Classified images

Như vậy là tất cả các bức ảnh của Testing set đều được phân loại chính xác. Tuy nhiên Haralick Texture Features quá đơn giản và không đủ mạnh mẽ khi số lượng category tăng lên, sau này chúng ta sẽ tìm hiểu các features mạnh mẽ hơn như Local Binary Patterns Histogram of Oriented Gradients.


SUGGESTIONS

Trong ví dụ ở trên, chúng ta đã trích xuất Haralick Texture Features của toàn bộ bức ảnh, tuy nhiên nếu cần, chúng ta cũng có thể áp dụng cho từng vùng ảnh (Range Of Image) riêng biệt.

Ưu điểm của Haralick Texture Features:

  • tính toán nhanh;
  • kích thước nhỏ;
  • không có tham số.

Nhược điểm:

  • không đủ mạnh mẽ để xử lý khi có thay đổi về góc xoay;
  • rất nhạy cảm với nhiễu;
  • tương tự với Hu Moments, Haralick Texture Features được tính toán dự trên các phép thống kê, do đó thường không đủ để phân biệt nhiều loại texture (kết cấu) khác nhau.

SUMMARY

Qua bài viết này chúng ta đã tìm hiểu về Haralick Texture Features và cách áp dụng trong thực tế. Cảm ơn các bạn đã theo dõi bài viết.

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

Reference:
[1] Co-occurrence matrix.
[2] sklearn.svm.LinearSVC

One thought on “[Image Descriptor] Haralick Texture Features

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