python下对hsv颜色空间进行量化操作

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格式的图像进行量化处理。这种方法可以将图像中的颜色进行压缩,减少需要存储的像素点数量。这对于图像压缩和图像处理来说非常有用。

后端开发标签