Opencv实现改进的直觉模糊C均值图像分割代码

本文档提供了一种改进的直觉模糊C均值(IFS_FCM)图像分割的Opencv实现,包括IFS_FCM.h、IFS_FCM.cpp及main.cpp三个文件。如遇到问题或发现错误,欢迎通过私信交流。
摘要由CSDN通过智能技术生成

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 &
  • 0
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值