机器学习应用:颜色量化实现示例
最近我在想,有没有可能检测出一幅图像的主色。最后我使用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比从头开始的算法做得更好,因为它几乎完美地捕捉到了我们创建的初始聚类(主色)的边界。
相关推荐
jaybeat 2020-11-17
机器学习之家 2020-11-10
mori 2020-11-06
jaybeat 2020-11-02
changyuanchn 2020-11-01
Micusd 2020-11-19
人工智能 2020-11-19
81510295 2020-11-17
flyfor0 2020-11-16
lgblove 2020-11-16
Pokemogo 2020-11-16
Pokemogo 2020-11-16
clong 2020-11-13
lizhengjava 2020-11-13
ohbxiaoxin 2020-11-13
Icevivian 2020-11-13
EchoYY 2020-11-12
CSDN人工智能头条 2020-11-11
mogigo00 2020-11-11