利用k-means算法对灰度图像分割

本文介绍了如何使用k-means算法对灰度图像进行分割,详细阐述了算法的基本步骤,并提供了相应的代码实现。通过修改代码,还可将算法应用于彩色图像分割。
摘要由CSDN通过智能技术生成

利用k-means算法对灰度图像分割

本文主要利用k-means来对灰度图像进行分割。首先对k-means进行简单的介绍,然后直接上代码。那么什么是k-means算法?K-means算法是硬聚类算法,是典型的基于原型的目标函数聚类方法的代表,它是数据点到原型的某种距离作为优化的目标函数,利用函数求极值的方法得到迭代运算的调整规则。K-means算法以欧式距离作为相似度测度,它是求对应某一初始聚类中心向量V最优分类,使得评价指标J最小。算法采用误差平方和准则函数作为聚类准则函数。这是百度百科的介绍,说了这么多,其实作者也不知道百度百科在说啥,那就来看看基本的算法步骤吧。基本的算法步骤如下:
1. 从N个样本随机选取K个文本作为质心;
2. 对剩余每个样本测量其到每个质心的距离,并把它归到最近的质心类
3. 重新计算已经得到的各个类的质心;
4. 迭代2、3步骤直至新的质心与原质心相等或小于指定的阈值,算法结束。
这下算法就比较清晰,下面直接贴代码,我的代码主要定义了point.h头文件、kmeans.h头文件和kmeans.cpp源文件。下面是point.h文件的代码。

#ifndef POINT_H
#define POINT_H
//point结构主要用来存储图像中节点的横坐标,纵坐标以及灰度值
struct point
{
    int row;
    int col;
    double pixVal;
    point(int row, int col, double pixVal) :row(row),col(col),pixVal(pixVal) {}
};
#endif

接下来,是keams.h头文件:

#ifndef KMEANS_H
#define KMEANS_H

#include<opencv2\opencv.hpp>
#include<random>
#include<time.h>
#include<stdio.h>
#include<stdlib.h>
#include<list>
#include<iostream>
#include<math.h>
#include"point.h"

using namespace cv;
using namespace std;

class Kmeans{
private:
    //存储所有点
    vector<point> points;
    //存储簇的中心点
    vector<point> centers;
    //存储每个点到相应的簇
    vector<point>* clusters;
    //向量的维数
    int dimension;
    //簇的个数
    int k;
public:
    //构造函数
    Kme
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值