网站论坛模板,wordpress精简主题,基于企业网站的网络营销方法,多个网站能否统一做等保文章目录 0 简介1 Kmeans聚类算法基本原理2 基于Kmeans图像分割算法流程4 代码运行结果及评价5 最后 0 简介
今天学长向大家分享一个毕业设计项目
毕业设计 基于Kmeans的图像分割算法软件设计
项目运行效果#xff1a; 毕业设计 基于kmean的图像分割#x1f9ff; 项目分享…文章目录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 最后项目运行效果 项目分享:见文末!