机器学习应用:颜色量化实现示例
Posted chuangye95
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了机器学习应用:颜色量化实现示例相关的知识,希望对你有一定的参考价值。
最近我在想,有没有可能检测出一幅图像的主色。最后我使用k-means聚类算法取得了很好的效果。我使用python OpenCV和scikit-learn实现了它。
怎么运作的?
k-means是机器学习中使用的聚类算法,其中一组数据点将被分类为“k”组。它适用于简单的距离计算。
- 随机选择‘k‘个点(不一定来自数据集)。
- 将每个数据点分配给最近的聚类。
- 计算并放置每个聚类的新质心。
- 将数据点重新分配给新的最近的聚类。如果发生任何重新分配,转到步骤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比从头开始的算法做得更好,因为它几乎完美地捕捉到了我们创建的初始聚类(主色)的边界。
以上是关于机器学习应用:颜色量化实现示例的主要内容,如果未能解决你的问题,请参考以下文章
机器学习sklearn----KMeans实例(图片数据矢量量化的应用)