【基于Kmeans、Kmeans++和二分K均值算法的图像分割】数据挖掘实验三

news2024/11/23 18:44:02

文章目录

  • Ⅰ、项目任务要求
    • 任务描述:
    • 主要任务要求:
  • II、实现过程
    • 数据集描述
    • 实现描述
    • 具体实现过程
  • III、完整代码
    • 代码①
    • 代码②


Ⅰ、项目任务要求

任务描述:

  • 图像分割是图像处理和计算机视觉中重要的一环,在实际生活中得到了广泛的应用。例如,在医学上,用于测量医学图像中组织体积、三维重建、手术模拟等;在遥感图像中,分割合成孔径雷达图像中的目标、提取遥感云图中不同云系与背景等、定位卫星图像中的道路和森林等。图像分割也可作为预处理将最初的图像转化为若干个更加抽象、更便于计算机处理的形式,既保留了图像中的重要特征信息,又有效减少了图像中的无用数据、提高了后续图像处理的准确率和效率。例如,在通信方面,可事先提取目标的轮廓结构、区域内容等,保证不失有用信息的同时,有针对性地压缩图像,以提高网络传输效率;在交通领域可用来对车辆进行轮廓提取、识别或跟踪,行人检测等。总的来说,凡是与目标的检测、提取和识别等相关的内容,都需要利用到图像分割技术。因此,无论是从图像分割的技术和算法,还是从对图像处理、计算机视觉的影响以及实际应用等各个方面来深入研究和探讨图像分割,都具有十分重要的意义。
  • 聚类技术是图像分割技术中重要组成部分,其中特征空间聚类法,如Kmeans算法及其相应变体是划分聚类方法中的典范。利用特征空间聚类法进行图像分割是将图像空间中的像素用对应的特征空间点表示,根据它们在特征空间的聚集对特征空间进行分割,然后将它们映射回原图像空间,得到分割结果。
  • 本次实验利用图像的灰度、颜色、纹理、形状等特征,把图像分成若干个互不重叠的区域,并使这些特征在同一区域内呈现相似性,在不同的区域之间存在明显的差异性。然后就可以将分割的图像中具有独特性质的区域提取出来用于不同的研究。
  • 实验内容:分别用Kmeans、Kmeans++和二分K均值三种聚类方法对图片进行图像分割,并写出实验结果分析。

主要任务要求:

  • 简述三种算法思想和实现原理。
  • 小组每人准备一张自己喜欢的图片(图片种类多样化)
  • 写出实验结果分析:
    • 实验运行环境描述。如开发平台、编程语言、调参情况等。
    • 不同初始簇数下三种方法对图片的分割效果对比、分析。
      • 对比表样式如下所示,可将分割效果图分别粘贴到对应位置;
      • 采用轮廓系数(或其它评价指标)评估三种方法的聚类效果(见参考资料网址);
      • 结合对比表(表样如下)结果和评估结果对实验结果进行分析说明。
        在这里插入图片描述

II、实现过程

数据集描述

实现描述

具体实现过程


III、完整代码

代码①

import numpy as np
import PIL.Image as image
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score
import matplotlib.pyplot as plt


# Todo: 准备数据集 ------------------------------------------------------------
# 定义函数loadData来处理图片
def loadData(filePath):
    f = open(filePath, 'rb')  # 以二进制方式打开文件
    data = []
    img = image.open(f)  # 以列表形式返回图片像素值
    m, n = img.size  # 图片的大小
    for i in range(m):
        for j in range(n):  # 将每个像素点的RGB颜色处理到0-1范围内并存放到data中
            x, y, z = img.getpixel((i, j))
            data.append([x / 256.0, y / 256.0, z / 256.0])
    f.close()
    return np.asarray(data), m, n


imgData1, row, col = loadData("1.jpg")
imgData2, row, col = loadData("1.jpg")
imgData3, row, col = loadData("1.jpg")
imgData4, row, col = loadData("1.jpg")

# Todo: KMeans聚类 ------------------------------------------------------------
print("# Todo: KMeans聚类 ------------------------------------------------------------")


def KMeansModel(n_clusters, img):
    imgData = img
    # 设置聚类中心数为3
    label = KMeans(n_clusters=n_clusters, init='random').fit_predict(imgData)
    # 获取每个像素的标签
    label = label.reshape([row, col])
    # 创建一个新的图像用于保存K-Means的结果
    pic_new = image.new("L", (row, col))
    # 根据标签添加像素
    for i in range(row):
        for j in range(col):
            pic_new.putpixel((i, j), int(256 / (label[i][j] + 1)))
    pic_new.save("KMeans{}.jpg".format(n_clusters), "JPEG")

    # 计算轮廓系数
    silhouette_avg = silhouette_score(imgData, label.flatten())  # 将label转换为一维数组
    print(f"聚类n_clusters={n_clusters}效果的轮廓系数为: {silhouette_avg}")

    # 展示分割效果图
    plt.imshow(pic_new, cmap='gray')
    plt.axis('off')
    plt.show()


KMeansModel(2, imgData1)
KMeansModel(3, imgData1)
KMeansModel(4, imgData1)

# Todo: KMeans++聚类 ------------------------------------------------------------
print("# Todo: KMeans++聚类 ------------------------------------------------------------")


def KMeansPlusPlusModel(n_clusters, img):
    imgData = img
    # Initialize KMeans with KMeans++ initialization method
    kmeans = KMeans(n_clusters=n_clusters, init='k-means++')
    label = kmeans.fit_predict(imgData)
    # 获取每个像素的标签
    label = label.reshape([row, col])
    # 创建一个新的图像用于保存K-Means的结果
    pic_new = image.new("L", (row, col))
    # 根据标签添加像素
    for i in range(row):
        for j in range(col):
            pic_new.putpixel((i, j), int(256 / (label[i][j] + 1)))
    pic_new.save("KMeansPlusPlus{}.jpg".format(n_clusters), "JPEG")

    # 计算轮廓系数
    silhouette_avg = silhouette_score(imgData, label.flatten())  # 将label转换为一维数组
    print(f"KMeans++聚类n_clusters={n_clusters}效果的轮廓系数为: {silhouette_avg}")

    # 展示分割效果图
    plt.imshow(pic_new, cmap='gray')
    plt.axis('off')
    plt.show()


KMeansPlusPlusModel(2, imgData2)
KMeansPlusPlusModel(3, imgData2)
KMeansPlusPlusModel(4, imgData2)

# Todo: 二分K均值 ------------------------------------------------------------
print("# Todo: 二分K均值 ------------------------------------------------------------")


def bisectingKMeans(imgData, k):
    # Initialize with a single cluster containing all data points
    clusters = [imgData]
    while len(clusters) < k:
        # Choose the cluster to split (the one with the highest SSE)
        cluster_idx = -1
        max_sse = -1
        for i in range(len(clusters)):
            sse = np.sum((clusters[i] - np.mean(clusters[i], axis=0)) ** 2)
            if sse > max_sse:
                max_sse = sse
                cluster_idx = i

        # Perform K-Means on the chosen cluster
        kmeans = KMeans(n_clusters=2, init='k-means++')
        cluster_data = clusters.pop(cluster_idx)
        kmeans.fit(cluster_data)
        labels = kmeans.labels_

        # Split the cluster into two based on K-Means results
        cluster1 = cluster_data[labels == 0]
        cluster2 = cluster_data[labels == 1]

        # Add the split clusters back to the clusters list
        clusters.append(cluster1)
        clusters.append(cluster2)

    # Assign labels to original data points
    labels = np.zeros(len(imgData))
    for i in range(len(clusters)):
        labels[np.isin(imgData, clusters[i]).all(axis=1)] = i

    # Create a new image with cluster labels
    clustered_img = labels.reshape([row, col])
    pic_new = image.new("L", (row, col))
    for i in range(row):
        for j in range(col):
            pic_new.putpixel((i, j), int(256 / (clustered_img[i][j] + 1)))
    pic_new.save("BisectingKMeans{}.jpg".format(k), "JPEG")

    # Calculate silhouette score
    silhouette_avg = silhouette_score(imgData, labels.flatten())
    print(f"Bisecting K-Means with {k} clusters - Silhouette Score: {silhouette_avg}")

    # Show clustered image
    plt.imshow(pic_new, cmap='gray')
    plt.axis('off')
    plt.show()


# Apply bisecting K-Means clustering with different numbers of clusters
bisectingKMeans(imgData3, 2)
bisectingKMeans(imgData3, 3)
bisectingKMeans(imgData3, 4)

代码②

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1092155.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C++】:关键字+命名空间+输入输出+缺省参数+函数重载+引用

【本节目标】 C关键字命名空间C输入&输出缺省参数函数重载引用 C是在C的基础之上&#xff0c;容纳进去了面向对象编程思想&#xff0c;并增加了许多有用的库&#xff0c;以及编程范式等 熟悉C语言之后&#xff0c;对C学习有一定的帮助&#xff0c;本章节主要目标&#xff…

2023年天猫淘宝双11红包活动入口是什么时候开始至什么时间结束?

​2023年淘宝天猫双11超级红包活动领取时间是从2023年10月24日20:00开始至11月11日23:59结束&#xff0c;淘宝天猫双十一活动时间内每天都可以领取1超级红包最高可得23888元。 2023年天猫淘宝双十一红包使用时间分为2个阶段&#xff1a;第一阶段是从2023年10月31日20:00开始至…

计算机指令、机器码

目录 背景 在软硬件接口中&#xff0c;CPU 帮我们做了什么事&#xff1f; 从编译到汇编&#xff0c;代码怎么变成机器码&#xff1f; 解析指令和机器码 总结延伸 背景 上大学的时候&#xff0c;我们系里教 C 语言程序设计的老师说&#xff0c;他们当年学写程序的时候&…

3.Python-用Python实现MySQL数据库的增删改查

题记 用python实现mysql数据库的增删改查&#xff0c;以下是具体的代码和操作步骤 安装flask模块 pip install flask 安装mysql.connector模块 pip install mysql-connector-python 编写app.py文件 app.py文件如下&#xff1a; 为什么显示不完整&#xff1f;&#xff1f;&am…

【Spring】事务传播机制

事务传播机制 一. 事务传播机制是什么二. 为什么需要事务传播机制三. 事务传播机制有哪些四. Spring 事务传播机制演示1. ⽀持当前事务&#xff08;REQUIRED&#xff09;2. 不支持当前事务&#xff08;REQUIRES_NEW&#xff09;3. 不⽀持当前事务&#xff0c;NEVER 抛异常4. NE…

订单型企业经营分析指标大全(ODOO15/16)

ODOO-ERP搭建完成之后&#xff0c;我们重点是帮客户建立经营分析能力&#xff0c;以下是针对订单型企业的经营分析指标&#xff0c;涵盖业务运营的监控、资产构成、利润、盈亏点计算、资产运营效率等各方面&#xff0c;并且持续完善。 有些企业不重视&#xff0c;觉得自己企业小…

WebAPI+EF连接SQL Server数据库

右击解决方案-添加-新建项目-选择“类库&#xff08;.NET Framework&#xff09;”,新建的项目取名叫WebApi1.EF 添加EF&#xff1a; 新建一个ADO实体数据模型 选择DBFirst 数据源选择MySql 填写数据库地址及账号密码 选择实体框架版本 选择在数据库中的表User 到此配置完成&am…

对称加密和非对称加密以及CA证书

对称加密 对称加密只用到了公匙,这个公匙是消息的发送方和消息的接收方共享的,也就是消息发送方使用这个公匙对消息加密,然后接收方使用公匙对消息解密,最典型的例子比如像 encrypt 加密,比如我们有个 springboot 应用,需要对 application.yml 文件里的密码做加密,我们…

操作系统备考学习 day8 (2.4.1 ~ 2.4.4)

操作系统备考学习 day8 第二章 进程与线程2.4 死锁2.4.1 死锁的基本概念死锁产生的必要条件死锁什么时候会发生死锁的处理策略 2.4.2 死锁预防破坏互斥条件破坏不剥夺条件破坏请求和保持条件破坏循环等待条件 2.4.3 避免死锁银行家算法 2.4.4 死锁的检测和解除死锁的检测死锁的…

faster python之ctypes调用so/dll

目录 .so和.dll文件将go代码编译为动态链接库将C代码编译成动态链接库 ctypes库基础数据类型使用方法基本数据类型数组类型指针类型结构体类型嵌套结构体结构体数组结构体指针结构体指针数组 ctypes加载DLL的方式1. 使用 CDLL 类2. 使用 WinDLL 类&#xff08;Windows特定&…

【LeetCode高频SQL50题-基础版】打卡第8天:第41~45题

文章目录 【LeetCode高频SQL50题-基础版】打卡第8天&#xff1a;第41~45题⛅前言好友申请II&#x1f512;题目&#x1f511;题解 2016年的投资&#x1f512;题目&#x1f511;题解 部门工资前三高的所有员工&#x1f512;题目&#x1f511;题解 修复表中的名字&#x1f512;题目…

深入JTS事务引擎:理论与实践相结合,掌握高效事务管理的秘诀

事务是可靠应用程序的构建块 如果您阅读过任何有关 J2EE 的介绍性文章或者书籍&#xff0c;那么就会发现&#xff0c;只有一小部分资料是专门针对 Java Transaction Service&#xff08;JTS&#xff09;或 Java Transaction API&#xff08;JTA&#xff09;的。这并不是因为 J…

[补题记录] Atcoder Beginner Contest 295(E)

URL&#xff1a;https://atcoder.jp/contests/abc295 目录 E Problem/题意 Thought/思路 Code/代码 E Problem/题意 给定长度为 N 的数组 A。进行如下操作&#xff1a; 若 Ai 0&#xff0c;将 Ai 等概率地变为 1 ~ M 中的任意一个数&#xff1b;对 A 排序&#xff1b; …

SQL及数据库基础知识点总结

一. SQL&#xff08;Structured Query Language&#xff09;&#xff1a; 结构化查询语言。SQL语法不区分关键字的大小写&#xff0c;多条SQL语句必须以&#xff1b;分隔。 二. SQL的作用&#xff1a; SQL可以访问和处理数据库&#xff0c;包括数据的增删改查&#xff08;插…

【实战项目之网页聊天室】

目录 项目背景 需求分析 1.用户管理模块 注册 登录 2.主界面 个人信息模块 会话列表模块 好友列表模块 消息区域模块 消息传输模块 添加好友模块 编写项目 1.创建项目添加依赖 2.配置项目信息 3.功能实现 用户管理模块 个人信息模块 好友列表模块 消息区…

FPmarkets:MT4中Renko图表工具有哪些?怎么用

以下FPmarkets总结的在MT4中使用Renko图表的最有趣的工具&#xff1a; 第一个是KT Renko实时图表指标&#xff0c;这是一个简单的指示器&#xff0c;仅显示砖块&#xff0c;未添加其他元素&#xff0c;因此与其他自定义指标和顾问兼容。 第二个是Renko Live Chart开发人员提供…

Kafka消费者使用案例

本文代码链接&#xff1a;https://download.csdn.net/download/shangjg03/88422633 1.消费者和消费者群组 在 Kafka 中&#xff0c;消费者通常是消费者群组的一部分&#xff0c;多个消费者群组共同读取同一个主题时&#xff0c;彼此之间互不影响。Kafka 之所以要引入消费者群组…

源码选择指南:比较流行的同城外卖跑腿系统解决方案

随着现代生活的快节奏和数字化转型的浪潮&#xff0c;外卖和跑腿服务成为了不可或缺的一部分。不仅在城市&#xff0c;就连小镇和乡村也可以享受到这些便捷的服务。如果您计划开发或改进一个同城外卖和跑腿系统&#xff0c;选择适合的源码解决方案是至关重要的。在本文中&#…

Jenkins 结合 ANT 发送测试报告

目录 全局变量配置 新建任务 插件安装 HTML 报告配置 邮件配置 全局变量配置 点击 ManageJenkins进入Jenkins 管理 点击 Global Tool Configuration 进入全局变量配置 配置 Ant &#xff0c;Name 自己定义一个比较好理解的名称。 去掉 Install automatically 勾选&#x…

毕业设计选题Java+springboot校园新闻资讯系统源码 开题 lw 调试

&#x1f495;&#x1f495;作者&#xff1a;计算机源码社 &#x1f495;&#x1f495;个人简介&#xff1a;本人七年开发经验&#xff0c;擅长Java、Python、PHP、.NET、微信小程序、爬虫、大数据等&#xff0c;大家有这一块的问题可以一起交流&#xff01; &#x1f495;&…