IFS_FCM.h
#pragma once
#if !defined (aaaaaa)
#include<opencv2/opencv.hpp>
using namespace std;
class IFS_FCM
{
private:
cv::Mat image;//输入图像
cv::Mat result;//输出图像
int m;//隶属度因子
int N_size;//邻域大小尺度
float alpha;//非隶属度控制参数
float belta;//邻域信息控制参数
int maxIterationCount;//最大迭代次数
double minError;//相邻两次迭代最小误差
int classNumber;//分类类别数
int dataNumber;//数据数
double **U;//隶属度矩阵
int *data;//数据数组
double *center;//类别中心数组
double *old_center;//存储为更新的聚类中心数组
double *value;//目标函数值数组
double *colsum;//隶属度矩阵列和数组
public:
IFS_FCM(string filename, int m1 = 2, int maxIterationCount1 = 200, double minError1 = 1e-5, int classNumber1 = 3, int N_size = 3, float alpha = 1.0, float belta = 2.0);
void preprocess();
void U_init();
float getNeighborMean(int k);
void updateU();
void updateC();
double calcTargetValue();
void process();
cv::Mat deBlur();
cv::Mat imageSegmentation();
};
#endif
IFS_FCM.cpp
#include<opencv2/opencv.hpp>
#include "IFS_FCM.h"
IFS_FCM::IFS_FCM(string filename, int m1 , int maxIterationCount1, double minError1, int classNumber1 , int N_size1, float alpha1, float belta1 ) {
//构造函数
//以灰度图的方式读取图片
image = cv::imread(filename, 0);
dataNumber = image.rows*image.cols;
//设置FCM的几个初始参数,隶属度因子、最大迭代次数、目标函数的最小误差、分类类别数、隶属度矩阵
m = m1;//隶属度因子
maxIterationCount = maxIterationCount1;//最大迭代次数
minError = minError1;//目标函数的最小误差
classNumber = classNumber1;//分类类别数
//要想把图像数据拉成一列进行计算,就得有一个数据数组。
data = (int*)malloc(dataNumber * sizeof(int));//数据数组
//聚类中心存放的也是像素值。要有一个聚类中心数组。
center = new double[classNumber];//聚类中心数组
old_center = new double[classNumber];//未更新的聚类中心数组
//列和数组是初始化隶属度矩阵时候,用于归一化,保证隶属度矩阵列和为1.
colsum = new double[dataNumber];//列和数组
//函数值数组用于存放目标函数的值,用于停止迭代判断。
value = new double[maxIterationCount];//函数值数组
//隶属度矩阵初始化
U = (double**)malloc(sizeof(double)*classNumber);
for (int i = 0; i < classNumber; i++) {
U[i] = (double*)malloc(sizeof(double)*dataNumber);
}
N_size = N_size1;
alpha = alpha1;
belta = belta1;
}
void IFS_FCM::preprocess() {
//把图像数据拉成一列
for (int i = 0; i < image.rows; i++) {
for (int j = 0; j < image.cols; j++) {
int a = image.ptr<uchar>(i)[j];
data[i*image.cols + j] = image.ptr<uchar>(i)[j];
/*cout << data[i*image.cols + j] << "\n" << endl;*/
}
}
/*for (int i = 0; i < dataNumber; i++) {
cout << data[i] <<"\n"<<endl;
}*/
}
void IFS_FCM::U_init() {
//随机初始化隶属度矩阵
for (int j &