使用OpenCV Python中的K-means对图像进行颜色量化

使用OpenCV Python中的K-means对图像进行颜色量化

颜色量化 过程中,图像中使用的颜色数量减少了。这样做的一个原因是为了减少内存占用。有时,某些设备只能产生有限数量的颜色。在这些情况下,进行颜色量化。我们使用 cv2.kmeans() 来应用k-means聚类进行颜色量化。

步骤

要使用K-means聚类在图像中实现颜色量化,可以按照以下步骤进行:

  • 导入所需的库 OpenCVNumPy 。确保您已经安装了它们。

  • 使用 cv2.imread() 方法读取两个输入图像。指定图像的完整路径。将图像重新调整为大小为Mx3的数组(M是图像中的像素总数)。将图像的dtype转换为 np.float32

  • 定义迭代终止标准 criteria ,聚类数 K 和应用K-means聚类算法 cv2.kmeans() 。传递标志cv2.KMEANS_RANDOM_CENTERS或cv.KMEANS_PP_CENTERS以指定如何获取初始中心。

  • 现在将其转换回uint8,并通过将质心值应用于所有像素来创建具有指定颜色数量 K 的结果图像。

  • 显示结果图像。

让我们来看一些使用K-means聚类在图像中实现颜色量化的示例。

输入图像

我们将在下面的示例中使用此图像作为输入文件。

使用OpenCV Python中的K-means对图像进行颜色量化

示例

在下面的Python代码中,我们使用K-means聚类算法将输入图像进行颜色量化,设置K=8。

# import required libraries
import numpy as np
import cv2

# read input image
img = cv2.imread('horizon.jpg')
z = img.reshape((-1,3))

# convert to np.float32
z = np.float32(z)

# define criteria, number of clusters(K) and apply kmeans()
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 10, 1.0)
K = 8
ret,label,center=cv2.kmeans(z,K,None,criteria,10,cv2.KMEANS_RANDOM_CENTERS)

# Convert back into uint8, and make original image
center = np.uint8(center)
res = center[label.flatten()]
res2 = res.reshape((img.shape))

# display the image
cv2.imshow('Image with K=8',res2)
cv2.waitKey(0)
cv2.destroyAllWindows()

输出

当你运行上述Python程序时,它将产生以下输出窗口

使用OpenCV Python中的K-means对图像进行颜色量化

注意,在上述输出图像中使用的颜色数量减少为8,因为我们使用了K=8。

示例

在以下Python代码中,我们使用不同的K值(K=2,K=5和K=8)对输入图像执行颜色量化,采用K-means聚类算法。

# import required libraries
import numpy as np
import cv2
import matplotlib.pyplot as plt

# read input image
img = cv2.imread('horizon.jpg')
Z = img.reshape((-1,3))

# convert to np.float32
Z = np.float32(Z)

# define criteria, number of clusters(K) and apply kmeans()
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 10, 1.0)
def colorQuant(Z, K, criteria):

   ret,label,center=cv2.kmeans(Z,K,None,criteria,10,cv2.KMEANS_RANDOM_CENTERS)

   # Now convert back into uint8, and make original image
   center = np.uint8(center)
   res = center[label.flatten()]
   res2 = res.reshape((img.shape))
   return res2
res1 = colorQuant(Z, 2, criteria)
res2 = colorQuant(Z, 5, criteria)
res3 = colorQuant(Z, 8, criteria)

plt.subplot(221),plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
plt.title('Original Image'), plt.xticks([]), plt.yticks([])

plt.subplot(222),plt.imshow(cv2.cvtColor(res1, cv2.COLOR_BGR2RGB))
plt.title('K=2'), plt.xticks([]), plt.yticks([])

plt.subplot(223),plt.imshow(cv2.cvtColor(res2, cv2.COLOR_BGR2RGB))
plt.title('K=4'), plt.xticks([]), plt.yticks([])

plt.subplot(224),plt.imshow(cv2.cvtColor(res3, cv2.COLOR_BGR2RGB))
plt.title('K=8'), plt.xticks([]), plt.yticks([])
plt.show()

输出

当您执行上述代码时,它将产生以下 输出

使用OpenCV Python中的K-means对图像进行颜色量化

注意不同输出图像中存在的颜色差异。较高的K值更接近原始图像。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程