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

news/2024/5/20 8:34:00 标签: 聚类, 机器学习, 人工智能

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.niftyadmin.cn/n/5198802.html

相关文章

LeetCode 0053. 最大子数组和:DP 或 递归(线段树入门题?)

【LetMeFly】53.最大子数组和:DP 或 递归 力扣题目链接:https://leetcode.cn/problems/maximum-subarray/ 给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最…

【C++11】右值引用使用详解

系列文章目录 C11新特性使用详解-持续更新 文章目录 系列文章目录前言一、关联特性1.1 左值/右值 二、使用方法2.1 获得右值引用2.2 对象移动方法2.2.1 移动构造函数/移动赋值运算符2.2.2 标记为noexcept2.2.3 使移动源对象进入是可析构状态 三、使用场景3.1 移动语义3.1 完美…

005 OpenCV直方图

目录 一、环境 二、直方图原理概述 三、代码 一、环境 本文使用环境为: Windows10Python 3.9.17opencv-python 4.8.0.74 二、直方图原理概述 OpenCV是一个广泛使用的开源计算机视觉库,它提供了许多用于图像处理和分析的函数和算法。其中&#xff…

计算机网络的OSI七层模型

目录 1、OSI七层模型是什么 1.1 物理层(Physical Layer) 1.2 数据链路层(Data Link Layer) 1.3 网络层(Network Layer) 1.4 传输层(Transport Layer) 1.5 会话层(S…

什么是希尔伯特空间?

照片由 丹克里斯蒂安佩杜雷什 on Unsplash 一、说明 在本文中,我们将探讨希尔伯特空间这个非常重要的主题。希尔伯特空间由于其特性而经常出现在物理和工程中。为了理解希尔伯特空间,我们从度量空间的定义开始。 二、基础概念 集合是定义明确的元素的集合…

bson数据通过BulkOperations批量入库mongo表报重复ID处理

bson数据批量入库mongo表报重复ID处理 一、需求 需要将一批bson格式数据批量入库指定mongo表,并且该表已存在数据,批量入库的数据可能和表中已有数据重复。 二、批量入库时的问题 采用MongoTemplate 原生的BulkOperations批量操作API upsert方法进行…

【html+css】主页侧边导航栏设计

目录 效果图展示 index.html index.css reset.css(初始化&#xff09; html调用css 图标 官网&#xff1a; 使用 效果图展示 点击 三 展开 index.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"&…

【手撕数据结构】(三)顺序表和链表

文章目录 一、线性表二、顺序表1.概念及结构2.关于数组3.顺序表分类&#x1f397;️静态顺序表&#x1f397;️动态顺序表 4.接口实现&#xff08;1&#xff09;思路&#xff08;2&#xff09;SeqList.h文件代码功能1&#xff1a;顺序表初始化功能2&#xff1a;销毁顺序表功能3…