c语言图像阈值分割,最大熵阈值分割算法的C语言实现

/*==================================================================

= 代码内容:最大熵阈值分割

= 修改日期:2009-3-3

= 作者:crond123

= 博客:http://blog.csdn.net/crond123/

= E_Mail:crond123@163.com

====================================================================*/

#include "stdafx.h"

#include "cv.h"

#include "highgui.h"

#pragma comment(lib,"highgui.lib")

#pragma comment(lib,"cv.lib")

#pragma comment(lib,"cvaux.lib")

#pragma comment(lib,"cxcore.lib")

int HistogramBins = 256;

float HistogramRange1[2]={0,255};

float *HistogramRange[1]={&HistogramRange1[0]};

typedef

enum {back,object} entropy_state;

double caculateCurrentEntropy(CvHistogram * Histogram1,int cur_threshold,entropy_state state)

{

int start,end;

if(state == back){

start = 0;end = cur_threshold;

}

else{

start = cur_threshold;end = 256;

}

int total = 0;

for(int i=start;i

total += (int)cvQueryHistValue_1D(Histogram1,i);

}

double cur_entropy = 0.0;

for(int i=start;i

if((int)cvQueryHistValue_1D(Histogram1,i)==0)

continue;

double percentage = cvQueryHistValue_1D(Histogram1,i)/total;

cur_entropy += -percentage*logf(percentage);

}

return cur_entropy;

}

void MaxEntropy(IplImage *src,IplImage *dst)

{

assert(src != NULL);

assert(src->depth == 8 && dst->depth == 8);

assert(src->nChannels == 1);

CvHistogram * hist = cvCreateHist(1,&HistogramBins,CV_HIST_ARRAY,HistogramRange);

cvCalcHist(&src,hist);

double maxentropy = -1.0;

int max_index = -1;

for(int i=0;i

double cur_entropy =

caculateCurrentEntropy(hist,i,object)+caculateCurrentEntropy(hist,i,back);

if(cur_entropy>maxentropy){

maxentropy = cur_entropy;

max_index = i;

}

}

cvThreshold(src, dst, (double)max_index,255, CV_THRESH_BINARY);

cvReleaseHist(&hist);

}

int _tmain(int argc, _TCHAR* argv[])

{

IplImage* src; //声明IplImage指针

//载入图像

if( argc == 2 &&

(src = cvLoadImage( argv[1], CV_LOAD_IMAGE_GRAYSCALE)) != 0 )

{

cvNamedWindow( "Image", 1 );//创建窗口

IplImage* dst = cvCreateImage(cvGetSize(src),IPL_DEPTH_8U,1);

MaxEntropy(src,dst);

cvShowImage( "Image", dst );//显示图像

cvWaitKey(0); //等待按键

cvDestroyWindow( "Image" );//销毁窗口

cvReleaseImage( &src ); //释放图像

cvReleaseImage( &dst ); //释放图像

return 0;

}

return -1;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值