使用OpenCV Python进行图像颜色量化?


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

步骤

要使用K均值聚类在图像中实现颜色量化,您可以按照以下步骤操作:

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

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

  • 定义迭代终止条件(criteria)、簇的数量(K)并应用K均值聚类算法(cv2.kmeans())。传递标志cv2.KMEANS_RANDOM_CENTERS或cv.KMEANS_PP_CENTERS以指定如何获取初始中心。

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

  • 显示结果图像。

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

输入图像

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


示例

在下面的Python代码中,我们使用K均值聚类算法(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程序后,它将生成以下输出窗口:


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

示例

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

# 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()

输出

执行上述代码后,将产生以下输出


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

更新于:2022年12月5日

3K+ 次查看

启动您的职业生涯

通过完成课程获得认证

开始学习
广告