这篇文章的opencv实现代码源于http://blog.csdn.net/yangtrees/article/details/8785377这篇博客,自己稍加改动,再此对博主表示感谢。
1.最大熵原理
原理自己还是不是很清楚,-p*log(p)当p增大的时候log(p)减小,那么随着阈值的增加,前景(或者背景)的熵值的变化应该不是单调的(没有证明,只是自己感觉)。但我试着求出随着阈值变化的背景熵时,发现基本是单调变化的。额,写到这里突然发现高数都白学了,求导结果为-(1+log(p)),这个是大于0的,也就是会一直单调增加,无极值。
2.opencv代码
下面给出完整的(有点冗余)。
#include <opencv2\opencv.hpp>
#include<opencv2\imgproc\imgproc.hpp>
#include <iostream>
#include <string>
#include <windows.h>
#include "Plate.h"
#include <stdlib.h>
#include <ctime>
#define window_name "均衡化后直接二值化,呵呵"
using namespace cv;
using namespace std;
typedef enum {back,object} entropy_state;
float total;
//绘制hist;
Mat drawHist(Mat hist,int bins,int height,Scalar rgb)
{
double maxVal=0;
minMaxLoc(hist,0,&maxVal,0,0);
int scale=1;
Mat histImg = Mat::zeros(height, bins, CV_8UC3);
float *binVal = hist.ptr<float>(0);
for (int i=0; i<bins; i++)
{
int intensity = cvRound(binVal[i]*height/maxVal);
rectangle(histImg,Point(i*scale,0),
Point((i+1)*scale,(intensity)),rgb,CV_FILLED);
}
flip(hist