k-means 图像分割
2017-10-22 20:49
351 查看
经典的无监督聚类算法,不多说,上代码。
1 import numpy as np 2 import pandas as pd 3 import copy 4 import matplotlib.pyplot as plt 5 6 pic = plt.imread('cs-nonoise.jpg') 7 # plt.imshow(pic) 8 # pic.shape #(1200, 800) 9 data = pic.reshape(-1, 3) 10 11 12 def kmeans_wave(n, k, data): # n为迭代次数, k为聚类数目, data为输入数据 13 data_new = copy.deepcopy(data) 14 data_new = np.column_stack((data_new, np.ones(1200*800))) # 扩展一个维度用来存放标签 15 center_point = np.random.choice(1200*800, k, replace=False) # 随机选择初始点 16 center = data_new[center_point,:] 17 distance = [[] for i in range(k)] # 距离度量 18 for i in range(n): 19 for j in range(k): 20 distance[j] = np.sqrt(np.sum(np.square(data_new - np.array(center[j])), axis=1)) # 更新距离 21 data_new[:,3] = np.argmin(np.array(distance), axis=0) # 将最小距离的类别标签作为当前数据的类别 22 for l in range(k): 23 center[l] = np.mean(data_new[data_new[:,3]==l], axis=0) # 更新聚类中心 24 25 return data_new 26 27 28 if __name__ == '__main__': 29 data_new = kmeans_wave(100,5,data) 30 print(data_new.shape) 31 # data_new = np.delete(data_new, 3, axis=1) 32 # print(data_new.shape) 33 pic_new = data_new[:,3].reshape(1200,800) # 将多个标签展示出来 34 plt.imshow(pic_new) 35 plt.show()
结果:
原图 k=5 结果图
相关文章推荐
- Opencv中K均值算法(K-Means)及其在图像分割中的应用
- K-means++ 图像分割
- Opencv中K均值算法(K-Means)及其在图像分割中的应用
- Kmeans++及字典学习和图像分割
- 基于K-means聚类的图像分割
- C均值算法(K-means)在opencv中实现图像分割(抠图)
- 基于K-means聚类的图像分割
- 基于CIELab空间色彩K-means聚类彩色图像分割
- K-means、图像分割
- meansift图像分割
- OpenCV学习 kmeans实现图像分割
- 图像分割--PixelNet: Representation of the pixels, by the pixels, and for the pixels
- 数字图像处理之边缘检测,图像分割
- 图像分割之区域生长
- 运动在图像分割的应用
- opencv之分水岭实现图像分割
- 图像分割之(四)OpenCV的GrabCut函数使用和源码解读
- 爬山法处理基于颜色的图像分割
- 图像分割之图割工具箱GCO3.0的使用(二)
- VC++ 黏连颗粒图像分割算法 尺寸统计