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

文章目录

  • Ⅰ、项目任务要求
    • 任务描述:
    • 主要任务要求:
  • 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, nimgData1, 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# 设置聚类中心数为3label = 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 methodkmeans = 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 pointsclusters = [imgData]while len(clusters) < k:# Choose the cluster to split (the one with the highest SSE)cluster_idx = -1max_sse = -1for i in range(len(clusters)):sse = np.sum((clusters[i] - np.mean(clusters[i], axis=0)) ** 2)if sse > max_sse:max_sse = ssecluster_idx = i# Perform K-Means on the chosen clusterkmeans = 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 resultscluster1 = cluster_data[labels == 0]cluster2 = cluster_data[labels == 1]# Add the split clusters back to the clusters listclusters.append(cluster1)clusters.append(cluster2)# Assign labels to original data pointslabels = 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 labelsclustered_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 scoresilhouette_avg = silhouette_score(imgData, labels.flatten())print(f"Bisecting K-Means with {k} clusters - Silhouette Score: {silhouette_avg}")# Show clustered imageplt.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.rhkb.cn/news/158917.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

P1433 吃奶酪

#include <iostream> #include <cmath> using namespace std; #define M 15 #define S(n) ((n) * (n)) double indx[M 5], indy[M 5], ans 0, sum 0;//坐标数组&#xff0c;从下标为1开始记录 int n, vis[M 5] { 0 };//vis数组&#xff0c;选过的数字标记为1…

openssl学习——消息认证码原理

消息认证码原理 消息认证码&#xff08;Message Authentication Code, MAC&#xff09;是一种技术&#xff0c;它的原理是通过对消息和密钥进行特定的处理&#xff0c;生成一个固定长度的数据&#xff0c;这个数据就是消息认证码&#xff08;MAC&#xff09;。这个过程可以看作…

openGauss学习笔记-99 openGauss 数据库管理-管理数据库安全-客户端接入认证之配置文件参考

文章目录 openGauss学习笔记-99 openGauss 数据库管理-管理数据库安全-客户端接入认证之配置文件参考99.1 参数说明99.2 认证方式 openGauss学习笔记-99 openGauss 数据库管理-管理数据库安全-客户端接入认证之配置文件参考 99.1 参数说明 表 1 参数说明 参数名称描述取值范…

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

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

SpringCloud-Config

一、介绍 &#xff08;1&#xff09;服务注册中心 &#xff08;2&#xff09;管理各个服务上的application.yml&#xff0c;支持动态修改&#xff0c;但不会影响客户端配置 &#xff08;3&#xff09;一般将application.yml文件放在git上&#xff0c;客户端通过http/https方式…

Maika 与越南童模们受邀请参加中国上海时装周 hanakimi 品牌开幕

金风送爽&#xff0c;秋高气和。2024中国上海时装周以“活力互链”为主题&#xff0c;于10月8日正式启幕。 魅力四射的越南童模身着著名时尚品牌MLB、Hana Kami、Jacadi的精美设计&#xff0c;迈着有力、专业但又不失优雅的步伐走上时尚舞台上海大型现场。无论是拍摄造型照还是…

windows TBB的使用

windows TBB的使用 1. Install with GUI 1. Install with GUI To install oneTBB using GUI, complete the following steps: Go to the Download page.Select the preferred installer Online installer has a smaller file size but requires a permanent Internet connec…

MFF论文笔记

论文名称&#xff1a;Improving Pixel-based MIM by Reducing Wasted Modeling Capability_发表时间&#xff1a;ICCV2023 作者及组织&#xff1a;上海人工智能实验室&#xff0c;西门菲沙大学&#xff0c;香港中文大学 问题与贡献 MIM(Model Maksed Model)方法可以分为两部分…

C语言-贪吃蛇 1.输入控制ncurse

一、为什么要用nurse C语言中的gets()、scanf()、getchar()等函数是在用户输入后需要按下Enter键才能执行代码&#xff0c;而贪吃蛇要求按下按键后立即对蛇的方向进行操作&#xff0c;所以根据贪吃蛇功能的需求引入ncurse&#xff0c;让用户输入后就能让蛇进行对应的行动。 二、…

Spring Boot中的异步编程:解决的问题与应用场景

Spring Boot中的异步编程&#xff1a;解决的问题与应用场景 在现代Web应用程序中&#xff0c;高并发和性能是至关重要的。为了处理大量的请求和任务&#xff0c;异步编程成为了不可或缺的一部分。Spring Boot提供了强大的异步编程支持&#xff0c;可以显著提高应用程序的吞吐量…

Spring MVC 和Spring JDBC

目录 Spring MVC MVC模式 核心组件 工作流程 Spring JDBC Spring JDBC功能和优势 Spring JDBC的关键组件 Spring MVC Spring MVC&#xff08;Model-View-Controller&#xff09;是Spring框架的一个模块&#xff0c;用于构建Web应用程序。它的主要目标是将Web应用程序的不…

比较和同步数据库架构和数据:MssqlMerge Pro Crack

比较和同步数据库架构和数据 适用于Oracle、MySQL 和 MariaDB、SQL Server、PostgreSQL、SQLite、MS Access和跨 DBMS 场景 业界领先的文本比较工具中常用的两面板 UI 快速过滤器显示所有/新/更改/新更改 合并两个方向的更改 轻量级&#xff1a;跨 DBMS 工具小于 20 MB&#xf…

【大数据Hive】hive select 语法使用详解

目录 一、前言 二、Hive select 完整语法树 三、Hive select 操作演示 3.1 数据准备 3.1.1 创建一张表 3.1.2 将数据load加载到t_usa_covid19表 3.1.3 再创建一张分区表 3.1.4 使用动态分区插入数据 3.2 select 常用语法 3.2.1 查询所有字段或者指定字段 3.2.2 查询…

计算机视觉:池化层的作用是什么?

本文重点 在深度学习中,卷积神经网络(CNN)是一种非常强大的模型,广泛应用于图像识别、目标检测、自然语言处理等领域。而池化层作为CNN中的一个关键步骤,扮演着优化神经网络、提升深度学习性能的重要角色。本文将深入探讨池化层的作用及其重要性,帮助读者更好地理解和应…

如何使用JMeter测试导入接口/导出接口

今天一上班&#xff0c;被开发问了一个问题&#xff1a;JMeter调试接口&#xff0c;文件导入接口怎么老是不通&#xff1f;还有导出文件接口&#xff0c;不知道文件导到哪里去了&#xff1f; 我一听&#xff0c;这不是JMeter做接口测试经常遇到的嘛&#xff0c;但是一时半会又…

nodejs+vue考研信息查询系统-计算机毕业设计

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性&#xff1a;…

MSVC编译dcmtk库

官网 https://www.dcmtk.org/en/dcmtk/ 下载源码和支持包 支持包在support文件夹下,选择适合你的MSVC版本 到官网下载cmake,官网cmake.org 解压源码 支持库 打开cmake-gui,填写源码目录(dcmtk解压的源码目录)和编译目录(自定义的目录) 点下面的configure,弹出选…

腾讯云我的世界mc服务器配置怎么选择?

使用腾讯云服务器开Minecraft我的世界服务器配置怎么选择&#xff1f;10人以内玩2核4G就够用了&#xff0c;开我的世界服务器选择轻量应用服务器就够了&#xff0c;腾讯云轻量CPU采用至强白金处理器&#xff0c;大型整合包一般1.12版本的&#xff0c;轻量2核4G配置都差不多的&a…

Lua调用C#类

先创建一个Main脚本作为主入口&#xff0c;挂载到摄像机上 public class Main : MonoBehaviour {// Start is called before the first frame updatevoid Start(){LuaMgr.GetInstance().Init();LuaMgr.GetInstance().DoLuaFile("Main");}// Update is called once p…

JAVA中的垃圾回收

JVM规范说了并不需要必须回收方法区&#xff0c;不具有普遍性&#xff0c;永久代使用的是JVM之外的内存 引用计数:效率要比可达性分析要强&#xff0c;随时发现&#xff0c;随时回收&#xff0c;实现简单&#xff0c;但是可能存在内存泄漏 局部变量表&#xff0c;静态引用变量&…