毕设分享 基于Kmeans的图像分割算法软件设计

0 简介

今天学长向大家分享一个毕业设计项目

毕业设计 基于Kmeans的图像分割算法软件设计

项目运行效果:

毕业设计 基于kmean的图像分割

🧿 项目分享:见文末!

1 Kmeans聚类算法基本原理

K-Means算法的思想很简单,对于给定的样本集,按照样本之间的距离大小,将样本集划分为K个簇。让簇内的点尽量紧密的连在一起,而让簇间的距离尽量的大。

以彩色图像为例:基于彩色图像的RGB三通道为xyz轴建立空间直角坐标系,那么一副图像上的每个像素点与该空间直角坐标系建立了一 一映射(双射)的关系。

从空间直角坐标系中随机取 k 个点,作为 k个簇的各自的中心。计算所有像素点到k个簇心的距离,并将所有像素点划分至与其距离最小的簇类。自此聚类完成。其中,距离定义为欧氏距离:
在这里插入图片描述
其中r,g,b分别表示红绿蓝三通道,r1,g1,b1为彩色图片中某像素点;r0,g0,b0表示某簇类的簇心。

2 基于Kmeans图像分割算法流程

Note:彩色图像的操作是基于一个三维空间
1、加载图像,获取图像的所有像素点并将其转换为样本数据。
2、开始迭代
a)、初始化簇心坐标。
a)、更新簇心坐标,遍历样本数据中的数据点并计算数据点与所有簇心的距离。对于某数据点计算得到的与所有簇类的欧氏距离中,取欧氏距离最小所对应的簇类作为该数据点对应的类。
c)、计算更新后的簇心坐标与更新前的簇心坐标的均方误差。若均方误差仍大于某阈值,则重复b),反之结束迭代。
Kmeans的详细算法流程参考博文:
https://www.cnblogs.com/pinard/p/6164214.html
三、代码主函数部分
1、加载图片

	Mat src, dst;
	src = imread("J20.jpg");
	namedWindow("输入图像", WINDOW_AUTOSIZE);
	imshow("输入图像", src);

2、初始化颜色(图像分割后需要上色)

	Scalar colorTab[] = {
		Scalar(0,0,255),
		Scalar(0,255,0),
		Scalar(255,0,0),
		Scalar(0,255,255),
		Scalar(255,0,255),
	};

3、初始化簇类数,并将所有的像素点全部转换为样本数据

	int sampleCount = width*height;
	int clusterCount = 5;
	Mat points(sampleCount, dims, CV_32F, Scalar(10));
	//将彩色图像的像素点转换为样本数据
	int index = 0;
	for (int row = 0; row < height; row++)
	{
		for (int col = 0; col < width; col++)
		{
			index = row*width + col;
			Vec3b bgr = src.at<Vec3b>(row, col);
			points.at<float>(index, 0) = static_cast<int>(bgr[0]);//b
			points.at<float>(index, 1) = static_cast<int>(bgr[1]);//g
			points.at<float>(index, 2) = static_cast<int>(bgr[2]);//r
		}
	}

4、利用Kmeans算法对样本数据分类

	centers, feature = Kmeans(points, clusterCount, sampleCount);

5、
显示图像分割后的结果

	//显示图像分割结果
	Mat result = Mat::zeros(src.size(), src.type());
	int index1 = 0;
	for (int row = 0; row < height; row++)
	{
		for (int col = 0; col < width; col++)
		{
			index1 = row*width + col;
			int label = feature.at<float>(index1, 3);
			result.at<Vec3b>(row, col)[0] = colorTab[label][0];
			result.at<Vec3b>(row, col)[1] = colorTab[label][1];
			result.at<Vec3b>(row, col)[2] = colorTab[label][2];
		}
	}
	imshow("基于Kmeans聚类的图像分割", result);

四、代码子函数部分
1、初始化聚类中心

	//初始化簇心
	Mat centers = Mat::zeros(clusterCount, 1, CV_32FC3);//4行3列
	centers.at<float>(0, 0) = 150;
	centers.at<float>(0, 1) = 180;
	centers.at<float>(0, 2) = 200;

	centers.at<float>(1, 0) = 20;
	centers.at<float>(1, 1) = 25;
	centers.at<float>(1, 2) = 37;

	centers.at<float>(2, 0) = 80;
	centers.at<float>(2, 1) = 100;
	centers.at<float>(2, 2) = 140;

	centers.at<float>(3, 0) = 226;
	centers.at<float>(3, 1) = 234;
	centers.at<float>(3, 2) = 235;

2、利用Kmeans算法进行迭代

	Mat feature = Mat::zeros(sampleCount, 1, CV_32FC4);
	float *distance = new float[sampleCount];
	int epoch = 0;
	while (true)
	{
		for (int row = 0; row < points.rows; row++)
		{
			for (int i = 0; i < centers.rows; i++)
			{
				distance[i] = pow((points.at<float>(row, 0) - centers.at<float>(i, 0)), 2) + pow((points.at<float>(row, 1) - centers.at<float>(i, 1)), 2)
					+ pow((points.at<float>(row, 2) - centers.at<float>(i, 2)), 2);
			}
			float min = distance[0];
			int flag = 0;
			for (int i = 0; i < clusterCount; i++)
			{
				if (min > distance[i])
				{
					min = distance[i];
					flag = i;
				}
			}
			feature.at<float>(row, 0) = points.at<float>(row, 0);
			feature.at<float>(row, 1) = points.at<float>(row, 1);
			feature.at<float>(row, 2) = points.at<float>(row, 2);
			feature.at<float>(row, 3) = flag;
		}
		float new_center_r = 0, new_center_g = 0, new_center_b = 0;
		float *temp = new float[clusterCount];
		for (int i = 0; i < clusterCount; i++)
		{
			int num = 0;
			float sum_center_r = 0, sum_center_g = 0, sum_center_b = 0;
			for (int row = 0; row < sampleCount; row++)
			{
				if (feature.at<float>(row, 3) == i)
				{
					sum_center_b = sum_center_b + feature.at<float>(row, 0);
					sum_center_g = sum_center_g + feature.at<float>(row, 1);
					sum_center_r = sum_center_r + feature.at<float>(row, 2);
					num++;
				}
			}
			new_center_b = sum_center_b / num;
			new_center_g = sum_center_g / num;
			new_center_r = sum_center_r / num;

			temp[i] = pow((new_center_b - centers.at<float>(i, 0)), 2) + pow((new_center_g - centers.at<float>(i, 1)), 2)
				+ pow((new_center_r - centers.at<float>(i, 2)), 2);

			centers.at<float>(i, 0) = new_center_b;
			centers.at<float>(i, 1) = new_center_g;
			centers.at<float>(i, 2) = new_center_r;
		}
		float total = 0;
		float mean_square_error = 0;
		for (int i = 0; i < clusterCount; i++)
		{
			total = total + temp[i];
		}
		mean_square_error = total / 4;
		if (epoch % 1 == 0)
			cout << "epoch:" << epoch << "\terror of mean square:" << mean_square_error << endl;
		if (mean_square_error < 0.01)
			break;
		epoch++;
	}

4 代码运行结果及评价

输入图片:
在这里插入图片描述
2、迭代过程
在这里插入图片描述
3、聚类结果
在这里插入图片描述
如上图,从左至右分别为Blue、Green、Red通道;从上之下分别是五个簇心的坐标(像素值)。

4、图像分割结果
在这里插入图片描述
如上图,图像被清晰的分为了五个部分:背景为蓝色、歼20的迷彩涂装分为了红黄两色,颜色最暗的地方为紫色,颜色次暗的地方为绿色。
另外,对于大数据,经典的Kmeans算法显然处理速度太慢,但对于彩色图像,使用经典Kmeans算法对其进行分割,其所耗时长在可接受的范围内。
至此完全实现了基于Kmeans聚类算法的图像分割,经验证,其结果与利用OpenCV提供的API得到的效果完全一致!

5 最后

项目运行效果:

在这里插入图片描述
在这里插入图片描述

🧿 项目分享:见文末!

基于 K-means 算法的校园微博热点话题发现系统 一、研究目的 微博由其 “短平快 ” 的信息能力和快速传播能力 ,已广泛流行于高校学生的常生活中。但微博上的负面舆情信息给社会 、学校和个人带来巨大的危害 。由于微博的多而快特点 ,无法依赖人工对相关信息进行收集 、筛选和发掘热点话题 。因此研究并开发校园微博热点话题发现系统 ,对高校舆情工作有重要的意义。 二、研究内容 本文从微博独有的短文本特征及国内外相关微博研究出发,通过对校园微博进行分类处理后使 用K-means聚类算法对校园微博短文本聚类,并改进热度计算公式,通过话题热度提取校园微博热点话题,实现对校园微博热点话题的监控。本文通过几个模块设计并现了校园微博热点话题发现系统,包括微博数据爬取模块 、微博数据预处理模块、微博热点话题分析模块、微博热点话 题展示模块等模块。最后以广州中医药大学的生 活类微博 — 广中医I栋为研究对象,对校园微博 各模块功能及相关技术进行介绍,并对相关模块进行测试验证,分析校园微博热点话题特点,总结系统的优点和不足,提出下一步改进的设想。 三、研究结果 本文以校园微博作为研究主体,结合微博的特点,通过研究热点话题相关技术,实现了一套校园微博热点话题发现系统。该系统主要由数据获取、微博数据预处理、K-means 聚类分析等模块组成。该系统为校园舆情人员及时发现热点话题带来了很大的帮助。 本文主要实现内容如下: (1)使用Python爬虫技术并发获取微博页面 ,并使用 Python相关库快速提取微博文本内容 。 (2)观察校园微博的特点和传统文本的区别,根据校园微博短文本的特点进行数据预处理操作 。 (3)针对于向量空间模型的高维度以及微博文本表示的稀疏性,通过改进的TF-IDF算法实现有效的降维和特征选择,解决了VSM特征向量的稀疏性问题。 (4)针对于传统K-means 算法存在的局部最优解问题,改进了 Kmeans 算法初始簇心选择,提高了 K-means聚类的准确性 。 (5)根据校园微博的特点,改进了热度计算的算法,提高了获取热点话题的准确性。 (6)实现热点话题发现系统可通过可视化界面进行操作,方便舆情管理人员从界面上获取热点话题信息 。
本文首先研究使用Python语言和OpenCV对数字高程图DEM,运用高斯核、阈值化、以及形态学中的开运算、闭运算、对图像进行分割、边缘提取、提取建筑物轮廓,并将其组织成顶点和线段的矢量格式,输出成为矢量化数字地图。然后输出XML格式文件保存矢量化数据[2]。 关键词:图像矢量化;数字高程图;python;OpenCV;轮廓处理 1 前言 1.1图像与图像处理简介 在社会生活中,图像处理有着广泛的应用,人们可以通过图像获取很多日常生活中的一些重要信息,而由于社会的科技迅速发展,图像信息处理的技术也发展得越来越快,并且涉及到了日常生活中的方方面面,如科研、工业、农业现代化、军事国防、医疗卫生、公安机关、制造业等等多个领域,并且图像处理也涉及到了很多学科、如计算机科学、数学、物理、模式识别、人工智能、深度学习等,所以图像处理是一门具有交叉性很强的学科、并且能够与很多学科的融合并促进相关学科的发展。 2 相关工作 1. 工欲善其事必先利其器,由于需要使用Python OpenCV进行图像的操作,所以一开始需要先了解python的相关的使用语法以及编译器方面的使用,还有OpenCV的安装,然后才能更加顺利的开始进行接下来的步骤。 2. 需要对模式识别与图像处理的项目内的具体要求的方法进行初步了解,然后再进行深入的学习和掌握,所以需要对《OpenCV-Python-Tutorial-中文版》本书的相关知识进行学习并自己实践一番。如图像的基本操作、平滑、阈值化、形态学转换中的开运算、闭运算,以及轮廓处理的相关知识。 3. 对相关要求使用Python进行实现,并调试运行,查看相应的效果,最后输出XML文件存矢量化数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值