基于DSP的Kmeans图像分割

基于DSP的Kmeans图像分割


一、目标

利用VisualDSP++ 5.0、仿真器、EBF-561实验平台实现该算法,并通过该聚类算法实现图像的不同区域的聚类结果。

二、实现方案

实验原理

产生图像不同区域的聚类本质是图像分割,就是把图像分成若干个特定的、具有独特性质的区域过程,它是由图像处理到图像分析的关键步骤。目前的图像分割方法主要分以下几类:基于阀值的分割方法、基于区域的分割方法、基于边缘的分割方法以及基于特定理论的分割方法等。近年来,研究人员不断改进原有的图像分割方法并把其它学科的一些新理论和新方法用于图像分割,提出了不少新的分割方法。

K-means 算法是很典型的基于距离的聚类算法,采用距离作为相似性的评价指标,即认为两个对象的距离越近,其相似度就越大。该算法认为簇是由距离靠近的对象组成的,因此把得到的紧凑且独立的簇作为最终目标。

变量说明

(1) N 样本的数目;
(2) Xn第 n 个样本特征(灰度图像时,表示灰度值);
(3) K 聚类的类别数目;
(4) Uk第 k 类的聚类中心。

实验步骤

输入:K,X[n] ;
(1) 选择 K 个初始中心点,例如 miyu[0] = x[0],……,miyu[k-1]=x[k-1];
(2) 对于 x[0],……,x[n],分别与 miyu[0],……,miyu[k-1]比较,假设 miyu[i]差值最少,就标记为第 i 类;
(3) 对于所有标记为 i 的样本,重新计算 miyu[i]=所有标记为 i 的x[i]之和/标记为 i 的个数;
(4) 重复步骤(2)和(3),直至所有 miyu[j]值的变化小于给定阈值或循环设定的次数。

三、核心代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
int cen1 = image[1], cen2 = image[1000]; //初始化聚类中心
int sum1 = cen1, sum2 = cen2;
int count1 = 0, count2 = 0;
int k = 50;
while (k--)
{
for (i = 0; i < 116*96; i++)
{
if(abs(image[i]-cen1) < abs(image[i]-cen2))
{
sum1 += image[i];
count1++;
}
else
{
sum2 += image[i];
count2++;
}
}
cen1 = sum1/count1;
cen2 = sum2/count2;
count1 = count2 = 0;
sum1 = sum2 = 0;
}
for(i = 0; i < 116*96; i++)
{
if(abs(image[i]-cen1) < abs(image[i]-cen2))
{
image[i] = 0;
}
else
{
image[i] = 255;
}
}