标签:home off 对象 copy 效果 line 蓝色 提取 inline
最近我在想,有没有可能检测出一幅图像的主色。最后我使用k-means聚类算法取得了很好的效果。我使用python OpenCV和scikit-learn实现了它。
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比从头开始的算法做得更好,因为它几乎完美地捕捉到了我们创建的初始聚类(主色)的边界。
标签:home off 对象 copy 效果 line 蓝色 提取 inline
原文地址:https://www.cnblogs.com/chuangye95/p/10225936.html