1. 简介
在计算机视觉和图像处理中,颜色空间的概念至关重要。相比于RGB颜色空间,HSV颜色空间在处理颜色时更加方便。在本文中,我们将会介绍一种对HSV颜色空间进行量化操作的方法,并且通过Python代码实现。
2. 什么是HSV颜色空间
HSV是一种色彩模型,也即颜色空间,全称是色相、饱和度、明度(Hue, Saturation, Value),通常用来描述颜色。HSV颜色空间常用于计算机视觉和图像处理领域。在HSV颜色空间中,色相(Hue)是从0到360的一个角度值表示颜色类型,饱和度(Saturation)表示该颜色所含色彩的纯度、鲜艳程度、逼真程度,取值范围是0%~100%。明度(Value)表示颜色的明暗程度,取值范围是0%~100%。
3. HSV颜色空间量化的应用
3.1 前置知识
在了解HSV颜色空间量化的应用之前,我们需要先了解一下kmeans聚类算法。
kmeans聚类算法是一种常见的无监督学习方法,其可将n个样本点划分为k个簇,使得所划分的簇内部点的相似度较高,簇间点的相似度较低。下面是kmeans算法的具体过程:
对算法输入进行预处理,确定k的值和样本集合:
def kmeans(k, X):
# 样本点数量
m, n = X.shape
# 随机初始化k个簇心
centroids = init_centroids(X, k)
# 迭代
for i in range(10):
# 分配每个样本到最近的簇
idx = find_closest_centroids(X, centroids)
# 更新每个簇心
centroids = compute_centroids(X, idx, k)
return idx, centroids
3.2 HSV颜色空间量化
在HSV颜色空间量化中,我们首先需要将图片的RGB格式转换为HSV格式:
import cv2
import numpy as np
# 加载图片
img = cv2.imread('test.jpg')
# 将RGB转为HSV格式
hsv_img = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
接着,我们将对图像进行量化处理。对于HSV格式的图像,我们可以将色相(H)和饱和度(S)两个通道的数值量化。
首先,我们需要获取图像的像素值:
# 获取图像像素值
rows, cols, dims = hsv_img.shape
pixvals = []
for i in range(rows):
for j in range(cols):
pixvals.append(hsv_img[i][j])
pixvals = np.array(pixvals)
接着,我们需要设定k值并应用kmeans聚类算法:
# 设定k值
K = 8
# 应用kmeans聚类算法
idx, centroids = kmeans(K, pixvals)
最后,我们将新的像素值重新投射回原图像中:
# 新的HSV值矩阵
px = centroids[idx.flatten()]
new_hsv_img = np.reshape(px, (rows,cols,dims))
# 将HSV图像格式转回RGB格式
new_img = cv2.cvtColor(new_hsv_img, cv2.COLOR_HSV2BGR)
4. Python代码实现
下面是完整的Python实现代码:
import cv2
import numpy as np
def kmeans(k, X):
# 样本点数量
m, n = X.shape
# 随机初始化k个簇心
centroids = init_centroids(X, k)
# 迭代
for i in range(10):
# 分配每个样本到最近的簇
idx = find_closest_centroids(X, centroids)
# 更新每个簇心
centroids = compute_centroids(X, idx, k)
return idx, centroids
# 初始化簇心
def init_centroids(X, k):
return X[np.random.choice(X.shape[0], k, replace=False), :]
# 找到每个样本点所属的最近簇心
def find_closest_centroids(X, centroids):
m = X.shape[0]
idx = np.zeros(m)
for i in range(m):
dists = np.sum((X[i, :] - centroids) ** 2, axis=1)
idx[i] = np.argmin(dists)
return idx
# 更新簇心
def compute_centroids(X, idx, k):
m, n = X.shape
centroids = np.zeros((k, n))
for i in range(k):
# 找到当前簇所有样本点
x_idx = np.where(idx == i)[0]
# 当前簇内无样本点
if len(x_idx) == 0:
centroids[i, :] = np.random.rand(n) * 255
else:
centroids[i, :] = np.mean(X[x_idx, :], axis=0)
return centroids
# 加载图片
img = cv2.imread('test.jpg')
# 将RGB转为HSV格式
hsv_img = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
# 获取图像像素值
rows, cols, dims = hsv_img.shape
pixvals = []
for i in range(rows):
for j in range(cols):
pixvals.append(hsv_img[i][j])
pixvals = np.array(pixvals)
# 设定k值
K = 8
# 应用kmeans聚类算法
idx, centroids = kmeans(K, pixvals)
# 将新的像素值重新投射回原图像中
px = centroids[idx.flatten()]
new_hsv_img = np.reshape(px, (rows,cols,dims))
# 将HSV图像格式转回RGB格式
new_img = cv2.cvtColor(new_hsv_img, cv2.COLOR_HSV2BGR)
# 显示原图像和量化后的图像
cv2.imshow('Original image', img)
cv2.imshow('Quantized image', new_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
5. 总结
在本文中,我们介绍了HSV颜色空间以及它在计算机视觉和图像处理中的应用。通过kmeans聚类算法,我们实现了对HSV格式的图像进行量化处理。这种方法可以将图像中的颜色进行压缩,减少需要存储的像素点数量。这对于图像压缩和图像处理来说非常有用。