• 基于像素特征的kmeas聚类的图像分割方案


    kmeans聚类代码

    将像素进行聚类,得到每个像素的聚类标签,默认聚类簇数为3

    1. def seg_kmeans(img,clusters=3):
    2. img_flat=img.reshape((-1,3))
    3. # print(img_flat.shape)
    4. img_flat=np.float32(img_flat)
    5. criteria=(cv.TERM_CRITERIA_MAX_ITER+cv.TERM_CRITERIA_EPS,20,0.5)
    6. flags=cv.KMEANS_RANDOM_CENTERS
    7. ret,labels,centers=cv.kmeans(data=img_flat,K=clusters,bestLabels=None,criteria=criteria,attempts=10,flags=flags)
    8. return labels

    为显示分割后的图像,将标签进行颜色映射,下述代码中,将第一类标签映射为绿色,第二类标签映射为蓝色,第三类标签映射为红色等:

    1. def img_res(labels):
    2. color = np.uint8([[255, 0, 0],
    3. [0, 0, 255],
    4. [0, 255, 0],
    5. [255,255,0]])
    6. res = color[labels.flatten()] # 像素映射
    7. result = res.reshape((img.shape))
    8. return result

    为探究不同聚类簇数的影响,分别采用聚类簇数clusters为2、3、4进行结果显示

    RGB颜色模型下的聚类效果

    HSV颜色模型下的聚类效果

    完整源码

    1. import cv2 as cv
    2. import matplotlib.pyplot as plt
    3. import os
    4. import numpy as np
    5. def img_read(pattern=cv.IMREAD_GRAYSCALE):#默认显示灰度图
    6. path=os.path.abspath(".")
    7. img_path=path+r"\data\twins.jpg"
    8. img=cv.imread(img_path,pattern)
    9. return img
    10. def seg_kmeans(img,clusters=3):
    11. img_flat=img.reshape((-1,3))
    12. # print(img_flat.shape)
    13. img_flat=np.float32(img_flat)
    14. criteria=(cv.TERM_CRITERIA_MAX_ITER+cv.TERM_CRITERIA_EPS,20,0.5)
    15. flags=cv.KMEANS_RANDOM_CENTERS
    16. ret,labels,centers=cv.kmeans(data=img_flat,K=clusters,bestLabels=None,criteria=criteria,attempts=10,flags=flags)
    17. return labels
    18. def img_res(labels):
    19. color = np.uint8([[255, 0, 0],
    20. [0, 0, 255],
    21. [0, 255, 0],
    22. [255,255,0]])
    23. res = color[labels.flatten()] # 像素映射
    24. result = res.reshape((img.shape))
    25. return result
    26. def plot_res(img):
    27. clusters = [2, 3, 4] # 聚类簇数
    28. img_list = [img] * len(clusters)
    29. # 采取不同的聚类簇数进行聚类
    30. labels = map(seg_kmeans, img_list, clusters)#map函数返回一个迭代器对象
    31. labels = [np.array(label) for label in labels]
    32. # 对结果进行颜色映射,便于输出
    33. results = map(img_res, labels)
    34. plt.subplot(2, 2, 1), plt.imshow(img)
    35. for i, res in enumerate(results):
    36. plt.subplot(2, 2, i + 2)
    37. plt.imshow(res)
    38. plt.title('k=' + str(i + 2))
    39. plt.subplots_adjust(hspace=0.5)
    40. plt.show()
    41. if __name__=="__main__":
    42. img=img_read(pattern=None)
    43. img_RGB=cv.cvtColor(img,cv.COLOR_BGR2RGB)
    44. img_HSV=cv.cvtColor(img,cv.COLOR_BGR2HSV)
    45. plot_res(img_RGB)
    46. plot_res(img_HSV)

  • 相关阅读:
    Worthington植物原生质体制备丨纤维素酶方案
    MacOS系统Chrome开发者模式下载在线视频
    假设检验:如何理解单侧、双侧检验的拒绝域
    git学习笔记-发现问题如何恢复
    1×1 问题详解
    Java23种设计模式-行为型模式之命令模式
    系统设计中的缓存技术:完整指南
    Git命令语句
    笑着看完webpack原理【webpack厂长第一视角】
    HTML+CSS+JS学习
  • 原文地址:https://blog.csdn.net/qq_58158950/article/details/134502261