Computer Vision

[Image Descriptor] Color Channel Statistics and Color Histograms

Xin chào, trong bài viết này chúng ta sẽ tìm hiểu về 2 Image Descriptors là Color Channel Statistics và Color Histograms.


COLOR CHANNEL STATISTICS

Đây là Image Descriptor đơn giản và trực quan nhất. Bằng cách tính toán Mean (Số bình quân) và Standard Deviation (Độ lệch chuẩn) của từng channel của bức ảnh, chúng ta có thể định lượng và biểu diễn Color Distribution (Phân bố màu sắc) của bức ảnh. Vì vậy, nếu 2 bức ảnh có Mean và Standard Deviation tương đương nhau, chúng ta có thể nói rằng 2 chúng có Color Distribution tương tự nhau.

Cần chú ý rằng, hai bức ảnh có Color Distribution tương tự nhau không có nghĩa là chúng có nội dung tương đương. Tuy nhiên trong khuôn khổ bài viết, chúng ta sẽ giả định hai bức ảnh có Color Distribution thì sẽ tương tự về nội dung.

Các bước để thực hiện Color Channel Statistics gồm:

  1. Tách các channel của bức ảnh;
  2. Tính toán Mean và Standard Deviation của từng channel;
  3. Ghép các giá trị Mean và Standard Deviation của từng channel thành một list để tạo thành 6-d Feature Vector.

color_channel_descriptor_pipeline

Figure 1 – Color Channel Statistics [PyImageSearch.com]

Function:

Mean, StdDev = cv2.meanStdDev(image)

– tính toán giá trị Mean và Standard Deviation của từng channel của bức ảnh.

Trong đó:

  • Mean, StdDev –  giá trị Mean và Standard Deviation;
  • image – bức ảnh cần tính Mean và StdDev.

Example 1 – Color Channel Statistics

Source file: color_channel_stats.py

from scipy.spatial import distance as dist
from imutils import paths
import cv2
import numpy as np
import argparse

ap = argparse.ArgumentParser()
ap.add_argument("-d", "--dataset", required=True)

args = vars(ap.parse_args())

imagePaths = sorted(list(paths.list_images(args["dataset"])))

index = {}

for imagePath in imagePaths:
	image = cv2.imread(imagePath)
	filename = imagePath[imagePath.rfind("\\")+1:]

	mean, std = cv2.meanStdDev(image)
	features = np.concatenate([mean, std]).flatten()
	index[filename] = features

query = cv2.imread(imagePaths[0])
cv2.imshow("Query", query)
keys = sorted(index.keys())

for (i,k) in enumerate(keys):
	image = cv2.imread(imagePaths[i])
	d = dist.euclidean(index[keys[0]], index[k])

	cv2.putText(image, "{:.2f}".format(d), (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (0, 255, 0), 2)
	cv2.imshow(k, image)

cv2.waitKey(0)

Execution:

$ python color_channel_stats.py -d data

Trong đó, data là folder chứa các bức ảnh dữ liệu.

Output:

beach

Giải thích:
– Ở dòng 20, 21: chúng ta áp dụng function cv2.meanStdDev() để tính giá trị Mean và Standard Deviation cho bức ảnh rồi chuyển thành dạng 6-d Feature Vector;
– Ở dòng 30: chúng ta áp dụng function euclidean() của scipy để tính toán khoảng cách giữa 2 Feature Vector (tương tự như giải tích Vector chúng ta đã học ở cấp 3). Khoảng cách giữa 2 Feature Vector càng nhỏ thì Color Distribution của 2 bức ảnh càng tương tự nhau. Từ 4 bức ảnh output chúng ta có thể nhận thấy điều hãy.


COLOR HISTOGRAMS

Nếu các bạn cần hiểu rõ hơn về Histograms thì hãy đọc qua bài viết này nhé.

Color Histogram là một Image Descriptor mạnh mẽ và rất phổ biến trong các ứng dụng của Computer Vision. Khác với Color Channel Statistic, thay vì tính toán Mean và Standard Deviation, Color Histogram Descriptor thể hiện Color Distribution của bức ảnh.

Cần nhắc lại rằng, chúng ta đang giả định hai bức ảnh có Color Distribution thì sẽ tương tự về nội dung.

Thêm một điểm thú vị, đây chính là lần đầu tiên chúng ta áp dụng Machine Learning trong Computer Vision, cụ thể là K-means clustering để nhóm các bức ảnh vào các group riêng biệt dựa trên histogram của chúng.

Áp dụng K-means sẽ tạo ra k clusters riêng biệt từ N data point ban đầu. Các data points bên trong một cluster sẽ được coi là tương tự nhau hơn so với các data points nằm trong các clusters khác. Một điểm cần lưu ý là chúng ta phải cung cấp số lượng cluster muốn tạo.

Example 2: Color Histograms Descriptor

Input:

Capture

Source file: cluster_histograms.py

import cv2
import numpy as np
from sklearn.cluster import KMeans
import argparse
from imutils import paths

def describe(image, mask=None, bin=[8,8,8]):
	lab = cv2.cvtColor(image, cv2.COLOR_BGR2LAB)
	hist = cv2.calcHist([lab], [0,1,2], mask, bin, [0,256,0,256,0,256])

	hist = cv2.normalize(hist, hist).flatten()
	return hist

ap = argparse.ArgumentParser()
ap.add_argument("-d", "--dataset", required=True)
ap.add_argument("-k", "--clusters", type=int, default=2)

args = vars(ap.parse_args())

data = []

imagePaths = list(paths.list_images(args["dataset"]))
imagePaths = np.array(sorted(imagePaths))

for imagePath in imagePaths:
	image = cv2.imread(imagePath)
	hist = describe(image)
	data.append(hist)

clt = KMeans(n_clusters=args["clusters"])
labels = clt.fit_predict(data)

for label in np.unique(labels):
	labelPaths = imagePaths[np.where(labels == label)]

	for (i, path) in enumerate(labelPaths):
		image = cv2.imread(path)
		cv2.imshow("Cluster {}, image {}".format(label+1, i+1), image)

	cv2.waitKey(0)
	cv2.destroyAllWindows()

Execution:

$ python cluster_histograms.py -d data

Trong đó, data là folder chứa các bức ảnh input.

Output:
cluster-1

Figure 2 – Cluster 1

cluster-2

Figure 3 – Cluster 2

Giải thích:
– Ở dòng 9-14: chúng ta tạo function describe() để tính toán 3-D Histogram cho bức ảnh với số bin mặc định là 8 và normalize nó;
– Ở dòng 32, 33: chúng ta tạo một instance KMeans với số lượng cluster là 2 và sử dụng method fit_predict() để nhóm các histogram vào từng cluster phù hợp;
– Ở dòng 35-40: dựa vào từng label chúng ta hiển thị các bức ảnh theo cluster của nó.

Từ các bức ảnh Output chúng ta thấy rằng 4 bức ảnh Input đã được chia thành 2 nhóm riêng biệt.


SUMMARY

Qua bài viết này chúng ta đã tìm hiểu về Color Channel Statistic và Color Histogram Descriptor. Cả hai phương pháp này đều dựa trên Color Distribution của bức ảnh, trong đó Color Histogram Descriptor phối hợp với một chút Machine Learning đã cho ra kết quả khá ấn tượng. Cảm ơn các bạn đã theo dõi bài viết.

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

Reference:
[1] Cluster analysis.

2 thoughts on “[Image Descriptor] Color Channel Statistics and Color Histograms

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