二值化自动阈值计算?
解决方案 »
- 连数据库时为什么用driver={SQL Server}能连,用Provider=SQLOLEDB.1就不行了不行
- 关于内存绘图内存暴增的问题
- WM_IDLEUPDATECMDUI WM_KICKIDLE的含义??
- 如何在ListCtrl的大图标上动态的绘制符号?
- 怎样在CMainFrm中取得View的指针
- VC如何屏蔽Alt+F4
- mfc的dll里,如何使得dll初始化失败
- 求救!!!为何我的加密函数在2000和WinMe下对文件加密后产生的新文件不一样?(300分)
- new指针时报错,请高手帮忙查找原因,万分感激中...
- 类,对象,实例有什么不同呢!
- 程序编到一定程度,经常不能再添加或删除控件了,什么原因?
- 怎么在子对话框中获取父对话框的窗口句柄?
效果不错,尤其是处理灰度图像
#ifndef _CThreshold_H_
#define _CThreshold_H_//计算最佳阈值
class CThreshold
{
enum {N=256};
public:
CThreshold(){}
~CThreshold(){}
void set(int gray[N],int a[],int n=N);
double GetThreshold();
protected:
double GetOneThreshold(int t); //计算一个阈值
void GetUT(); //计算图象灰度平均值
private:
int gray[N],n[N],m_total,m_ntotal;
double m_ut,m_threshold; //图象灰度平均值
};#endif //_CThreshold_H_#include "stdafx.h"
#include "cthreshold.h"
#define SQR(x) (x)*(x)void CThreshold::set(int g[],int a[],int total)
{
m_total=total;
for(int i=0;i<m_total;i++){
n[i]=a[i];
gray[i]=g[i];
}
GetUT();
}void CThreshold::GetUT()
{
int nTotal=0;
m_ut=0.0; m_ntotal=0;
for(int i=0;i<m_total;i++)
nTotal+=n[i];
for(i=0;i<m_total;i++){
m_ut+=1.0*gray[i]*n[i]/nTotal;
m_ntotal+=n[i];
}
}double CThreshold::GetOneThreshold(int t)
{
//计算类C1的像素灰度平均值和方差,发生概率
double u1=0.0,s1=0.0,w1=0.0;
int total=0;
for(int i=0;i<t;i++) total+=n[i];
for(i=0;i<t;i++){
u1+=1.0*gray[i]*n[i]/total;
w1+=1.0*n[i]/m_ntotal;
}
for(i=0;i<t;i++) s1+=1.0*SQR(gray[i]-u1)*n[i]/total;
//计算类C2的像素灰度平均值和方差
double u2=0.0,s2=0.0,w2=0.0;
total=0;
for(i=t;i<m_total;i++) total+=n[i];
for(i=t;i<m_total;i++){
u2+=1.0*gray[i]*n[i]/total;
w2+=1.0*n[i]/m_ntotal;
}
for(i=t;i<m_total;i++) s2+=1.0*SQR(gray[i]-u2)*n[i]/total;
double sw2=w1*s1+w2*s2;
double sb2=w1*SQR(u1-m_ut)+w2*SQR(u2-m_ut);
return sb2/sw2;
}double CThreshold::GetThreshold()
{
m_threshold=0;
double nSepMax=0.0; //求分离度最大的值
for(int t=0;t<m_total;t++){
double temp=GetOneThreshold(gray[t]);
if(temp>nSepMax){
nSepMax=temp;
m_threshold=gray[t];
}
}
return m_threshold;
}
一维算法中比较经典的有:大津法(OSTU算法,即类间方差最大法),叠代法,最小错误分割法等等。这些算法都很容易找到,也很容易实现,效果也还行。
这些经典算法主要适合直方图具有明显双峰特性的图像,即背景和目标要有良好的区分性。如果图像质量较差,就要用其他适应性更强的推广算法。 P.S. 以上均为整体阈值法的范畴。
其他改进和推广算法在一些期刊网能找到,我是在中国期刊网上找的。
我下了很多相关算法的论文,楼主若是需要,请留下email,我发一些给你。
特别是
set(int g[],int a[],int total)函数中各参数的具体意义谢谢