当前位置: 首页 > article >正文

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

kmeans聚类代码

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

def seg_kmeans(img,clusters=3):
    img_flat=img.reshape((-1,3))
    # print(img_flat.shape)

    img_flat=np.float32(img_flat)
    criteria=(cv.TERM_CRITERIA_MAX_ITER+cv.TERM_CRITERIA_EPS,20,0.5)
    flags=cv.KMEANS_RANDOM_CENTERS
    ret,labels,centers=cv.kmeans(data=img_flat,K=clusters,bestLabels=None,criteria=criteria,attempts=10,flags=flags)
    return labels

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

def img_res(labels):
    color = np.uint8([[255, 0, 0],
                      [0, 0, 255],
                      [0, 255, 0],
                      [255,255,0]])
    res = color[labels.flatten()]  # 像素映射
    result = res.reshape((img.shape))
    return result

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

RGB颜色模型下的聚类效果

HSV颜色模型下的聚类效果

完整源码

import cv2 as cv
import matplotlib.pyplot as plt
import os
import numpy as np

def img_read(pattern=cv.IMREAD_GRAYSCALE):#默认显示灰度图
    path=os.path.abspath(".")
    img_path=path+r"\data\twins.jpg"
    img=cv.imread(img_path,pattern)
    return img

def seg_kmeans(img,clusters=3):
    img_flat=img.reshape((-1,3))
    # print(img_flat.shape)

    img_flat=np.float32(img_flat)
    criteria=(cv.TERM_CRITERIA_MAX_ITER+cv.TERM_CRITERIA_EPS,20,0.5)
    flags=cv.KMEANS_RANDOM_CENTERS
    ret,labels,centers=cv.kmeans(data=img_flat,K=clusters,bestLabels=None,criteria=criteria,attempts=10,flags=flags)
    return labels

def img_res(labels):
    color = np.uint8([[255, 0, 0],
                      [0, 0, 255],
                      [0, 255, 0],
                      [255,255,0]])
    res = color[labels.flatten()]  # 像素映射
    result = res.reshape((img.shape))
    return result

def plot_res(img):
    clusters = [2, 3, 4]  # 聚类簇数
    img_list = [img] * len(clusters)
    # 采取不同的聚类簇数进行聚类
    labels = map(seg_kmeans, img_list, clusters)#map函数返回一个迭代器对象
    labels = [np.array(label) for label in labels]
    # 对结果进行颜色映射,便于输出
    results = map(img_res, labels)
    plt.subplot(2, 2, 1), plt.imshow(img)
    for i, res in enumerate(results):
        plt.subplot(2, 2, i + 2)
        plt.imshow(res)
        plt.title('k=' + str(i + 2))
    plt.subplots_adjust(hspace=0.5)
    plt.show()

if __name__=="__main__":
    img=img_read(pattern=None)
    img_RGB=cv.cvtColor(img,cv.COLOR_BGR2RGB)
    img_HSV=cv.cvtColor(img,cv.COLOR_BGR2HSV)
    plot_res(img_RGB)
    plot_res(img_HSV)


http://www.kler.cn/a/134631.html

相关文章:

  • Elasticsearch可视化工具Elasticvue插件用法
  • 【日志】392.判断子序列
  • 【CSS】“flex: 1“有什么用?
  • 【p2p、分布式,区块链笔记 DAM】GUN/SEA(Security, Encryption, Authorization) 模块genkey
  • SQL练习(2)
  • 腾讯云nginx SSL证书配置
  • 安全测试工具分为 SAST、DAST和IAST 您知道吗?
  • 【开源】基于Vue.js的智能教学资源库系统
  • GCC多平台编译会遇到小问题
  • Codewhisperer 使用评价
  • 机器学习技术栈—— 概率学基础
  • markdown 公式编辑
  • 用户运营:如何搭建用户分析体系
  • 三极管与mos管的区分与应用
  • RT-DETR优化改进:SEAM、MultiSEAM分割物与物相互遮挡、分割小目标性能
  • 零基础安装分布式数据服务注册系统
  • SpringCache
  • 【开源】基于JAVA的校园二手交易系统
  • 微服务和Spring Cloud Alibaba介绍
  • SpringBoot和Spring的区别是什么?
  • AI创作系统ChatGPT网站源码/支持DALL-E3文生图/支持最新GPT-4-Turbo模型+Prompt应用
  • airlearning-ue4安装的踩坑记录
  • 小小发票拦住出海“巨头”,合合信息智能文档处理技术助力企业重塑财务管理流程
  • 第二部分:Module(也称为Package)
  • 属性的加密算法CP-ABE
  • unity-模块卸载重新安装