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

发布时间:2026/9/18 9:48:33
毕设开源 基于Kmeans的图像分割算法软件设计 文章目录0 简介1 Kmeans聚类算法基本原理2 基于Kmeans图像分割算法流程4 代码运行结果及评价5 最后0 简介今天学长向大家分享一个毕业设计项目毕业设计 基于Kmeans的图像分割算法软件设计项目运行效果毕业设计 基于kmean的图像分割项目分享见主页任意置顶文章1 Kmeans聚类算法基本原理K-Means算法的思想很简单对于给定的样本集按照样本之间的距离大小将样本集划分为K个簇。让簇内的点尽量紧密的连在一起而让簇间的距离尽量的大。以彩色图像为例基于彩色图像的RGB三通道为xyz轴建立空间直角坐标系那么一副图像上的每个像素点与该空间直角坐标系建立了一 一映射双射的关系。从空间直角坐标系中随机取 k 个点作为 k个簇的各自的中心。计算所有像素点到k个簇心的距离并将所有像素点划分至与其距离最小的簇类。自此聚类完成。其中距离定义为欧氏距离其中rgb分别表示红绿蓝三通道r1g1b1为彩色图片中某像素点r0g0b0表示某簇类的簇心。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.atVec3b(row, col); points.atfloat(index, 0) static_castint(bgr[0]);//b points.atfloat(index, 1) static_castint(bgr[1]);//g points.atfloat(index, 2) static_castint(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.atfloat(index1, 3); result.atVec3b(row, col)[0] colorTab[label][0]; result.atVec3b(row, col)[1] colorTab[label][1]; result.atVec3b(row, col)[2] colorTab[label][2]; } } imshow(基于Kmeans聚类的图像分割, result);四、代码子函数部分1、初始化聚类中心​//初始化簇心 Mat centers Mat::zeros(clusterCount, 1, CV_32FC3);//4行3列 centers.atfloat(0, 0) 150; centers.atfloat(0, 1) 180; centers.atfloat(0, 2) 200; centers.atfloat(1, 0) 20; centers.atfloat(1, 1) 25; centers.atfloat(1, 2) 37; centers.atfloat(2, 0) 80; centers.atfloat(2, 1) 100; centers.atfloat(2, 2) 140; centers.atfloat(3, 0) 226; centers.atfloat(3, 1) 234; centers.atfloat(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.atfloat(row, 0) - centers.atfloat(i, 0)), 2) pow((points.atfloat(row, 1) - centers.atfloat(i, 1)), 2) pow((points.atfloat(row, 2) - centers.atfloat(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.atfloat(row, 0) points.atfloat(row, 0); feature.atfloat(row, 1) points.atfloat(row, 1); feature.atfloat(row, 2) points.atfloat(row, 2); feature.atfloat(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.atfloat(row, 3) i) { sum_center_b sum_center_b feature.atfloat(row, 0); sum_center_g sum_center_g feature.atfloat(row, 1); sum_center_r sum_center_r feature.atfloat(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.atfloat(i, 0)), 2) pow((new_center_g - centers.atfloat(i, 1)), 2) pow((new_center_r - centers.atfloat(i, 2)), 2); centers.atfloat(i, 0) new_center_b; centers.atfloat(i, 1) new_center_g; centers.atfloat(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 最后项目运行效果项目分享见主页任意置顶文章

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询