资源简介
FLICM聚类算法是近年来提出的一个模糊C均值算法,它结合了空间邻域信息和灰度信息,可有效去除杂点的影响。这个版本是根据原作者提供的程序修改成了C版本
代码片段和文件信息
#include
#include
#include “cv.h“
#include “highgui.h“
#include “time.h“
void IplToMatrix(unsigned char *SrcData float *DstData int step int iHeight int iWidth)
{
for(int h=0; h {
for(int w=0; w {
DstData[h*iWidth+w] = (float)SrcData[h*step+w];
int test = 0;
}
}
}
void CalcCenters( float *image int height int width float *U int cNum float m float *c )
{
int L = height*width;
float sSum;
for(int k=0; k {
c[k] = 0.0;
sSum = 0.0;
for(int i=0; i {
for(int j=0; j {
sSum += pow( U[i*width + j + k*L] m );
c[k] += pow(U[i*width + j + k*L]m) * image[i*width+j];
}
}
int test1 = 0;
c[k] /= sSum;
int test = 0;
}
}
void FLICM_alg( float *img int height int width float *Uinit float *U float *cinit float m int cNum int winSize int maxIter float thrE)
{
int sStep = (winSize-1)/2;
float *Uold = (float*)malloc(sizeof(float)*height*width*cNum);
float *c = (float*)malloc(sizeof(float)*cNum);
float *d = (float*)malloc(sizeof(float)*cNum);
for(int i=0; i {
for(int j=0; j {
for(int k=0; k {
U[k*height*width + i*width + j] = Uinit[k*height*width + i*width + j];
Uold[k*height*width + i*width + j] = U[k*height*width + i*width + j];
}
}
}
for(int k=0; k c[k] = cinit[k];
int sweeps = 0;
float dMax = 10.f;
float vec = 0.f;
float sSum = 0.f;
float dist = 0.f;
float dd = 0.f;
while( dMax>thrE && sweeps<=maxIter )
{
// Calculation of the new array U.
for(int i=0; i {
for(int j=0; j {
// for each center.
for(int k=0; k {
vec = img[i*width+j];
sSum = fabs( vec-c[k] );
for(int ii=-sStep; ii<=sStep; ii++ )
for(int jj=-sStep; jj<=sStep; jj++ )
{
int x = j + jj;
int y = i + ii;
dist = sqrt( (float)(x-j)*(x-j) + (float)(y-i)*(y-i) );
if( x>=0 && x=0 && y {
vec = img[y*width + x];
sSum += 1.f/(1.f + dist)*pow(1.f-Uold[y*width+x+k*height*width] m) * fabs(vec-c[k]);
}
}
d[k] = sSum;
}
for(int k=0; k {
dd = d[k];
sSum = 0.f;
for(int ii=0; ii sSum += pow( dd/d[ii] 1.f/(m-1.f));
U[k*height*width + i*width + j] = 1.f / sSum;
}
}
}
// New center calculation.
CalcCenters( img height width U cNum m c );
dMax = -1.f;
// Copy new array U to old one.
for(int i=0; i {
for(int j=0; j {
for(int k=0; k {
if( dMax dMax = fabs(Uold[k*height*width + i*width + j] - U[k*height*width + i*width + j
- 上一篇:超市管理系统(MFC编写
- 下一篇:对图像进行LZW编码
评论
共有 条评论