机器学习应用:颜色量化实现示例

最近我在想,有没有可能检测出一幅图像的主色。最后我使用k-means聚类算法取得了很好的效果。我使用python OpenCV和scikit-learn实现了它。

怎么运作的?

k-means是机器学习中使用的聚类算法,其中一组数据点将被分类为“k”组。它适用于简单的距离计算。

  1. 随机选择'k'个点(不一定来自数据集)。
  2. 将每个数据点分配给最近的聚类。
  3. 计算并放置每个聚类的新质心。
  4. 将数据点重新分配给新的最近的聚类。如果发生任何重新分配,转到步骤3,否则模型已准备就绪。

图像分割

  • 分割将图像分割为具有与对象的部分相对应的类似视觉外观的区域
  • 我们将尝试使用K-Means提取最主要的'K'颜色
  • 我们可以应用K-Means,每个像素将重新分配到最接近的K色,从而导致分割

我们将使用强大的机器学习(ML)库scikit-learn for k-means。

应用图像

机器学习应用:颜色量化实现示例

由于图像由三个通道组成:红色,绿色和蓝色,我们可以将每个像素视为3D空间中的一个点,因此可以在其上应用k均值聚类算法。

在用算法处理每个像素之后,聚类质心将是所需的主色。

读取和绘制图像

import numpy as np
import cv2
import skimage.io as io
import matplotlib.pyplot as plt
%matplotlib inline
from sklearn.cluster import KMeans
im=io.imread('/home/manish/Desktop/images1.jpeg')
im=cv2.resize(im,(400,400))
plt.xticks([])
plt.yticks([])
plt.imshow(im)
print im.shape
plt.show()

机器学习应用:颜色量化实现示例

(400, 400, 3)

机器学习应用:颜色量化实现示例

Flatten图像的每个通道

data=im.reshape(-1,3)
data.shape

(160000, 3)

使用scikit-learn应用KMeans

km=KMeans(n_clusters=5)
km.fit(data)

KMeans(algorithm='auto', copy_x=True, init='k-means++', max_iter=300,

n_clusters=5, n_init=10, n_jobs=1, precompute_distances='auto',

random_state=None, tol=0.0001, verbose=0)

寻找并绘制K主色

dominant_colors=km.cluster_centers_.astype(np.uint8)
plt.figure(0)
for i in range(dominant_colors.shape[0]):
 plt.subplot(1,dominant_colors.shape[0],i+1)
 plt.xticks([])
 plt.yticks([])
 col=np.zeros((100,100,3),dtype=np.uint8)
 col[:,:,:]=dominant_colors[i]
 plt.imshow(col)

机器学习应用:颜色量化实现示例

机器学习应用:颜色量化实现示例

为每种主色赋予标签

new_image=np.zeros_like(data)
labels=km.predict(data)
print np.unique(labels,return_counts=False)

[0 1 2 3 4]

for ix in range(len(new_image)):
 new_image[ix,:]=dominant_colors[labels[ix]]

打印新图像和实际图像

#new image
plt.subplot(1, 2, 1)
plt.grid("off")
plt.xticks([])
plt.yticks([])
plt.imshow(new_image.reshape(im.shape))
#actual image
plt.subplot(1,2,2)
plt.xticks([])
plt.yticks([])
plt.imshow(im)

机器学习应用:颜色量化实现示例

机器学习应用:颜色量化实现示例

它工作得相当不错,并显示5种主要颜色,用于生成新图像。KMeans比从头开始的算法做得更好,因为它几乎完美地捕捉到了我们创建的初始聚类(主色)的边界。

相关推荐