基本全局阈值法
基本全局阈值法
当图像由暗色背景和较亮物体组成时,从背景中提取出物体的方法是选择一个将两种灰度值分开的阈值T,即f(x,y)> T 的任何点(x,y)称
为一个对象点,否则将该点称为背景点。那么,分割后的图像g(x,y)由以下式子给出:
在这里:
阈值T可以是一个常数,则使用的是全局阈值处理
阈值T可以在一幅图上改变,则使用可变阈值处理
阈值T可以是多个,则使用双(多)阈值处理
比如下列灰度直方图,左侧可以使用单阈值,右侧则需要双阈值进行分割。
用迭代方法的全局阈值处理
在实际处理中,通常图像之间有较大变化,即使对每一幅图片使用全局阈值是可行的,但我们也需要有能力对每一幅图片进行自
动、估计阈值。因此,迭代方法就是用于这个目的:
1.为全局阈值T选择一个初始值(一般选择平均灰度)
2.用T分割该图像,这将产生两组像素:G1由灰度值大于T的所有像素组成,G2由灰度值小于T
的所有像素组成
3.对G1和G2的像素分别计算平均灰度值m1和m2
4.计算一个新的阈值:
T=(m1+m2)/2
5.重复步骤2到步骤4,直到连续迭代中的T值间的差小于一个预定义的参数t为止。
// nMaxIter:最大迭代次数;nDiffRec:使用给定阀值确定的亮区与暗区平均灰度差异值
int DetectThreshold(IplImage*img, int nMaxIter, int& iDiffRec) //阀值分割:迭代法
{
//图像信息
int height = img->height;
int width = img->width;
int step = img->widthStep/sizeof(uchar);
uchar *data = (uchar*)img->imageData;
iDiffRec =0;
int F[256]={ 0 }; //直方图数组
int iTotalGray=0;//灰度值和
int iTotalPixel =0;//像素数和
byte bt;//某点的像素值
uchar iThrehold,iNewThrehold;//阀值、新阀值
uchar iMaxGrayValue=0,iMinGrayValue=255;//原图像中的最大灰度值和最小灰度值
uchar iMeanGrayValue1,iMeanGrayValue2;
//获取(i,j)的值,存于直方图数组F
for(int i=0;iiMaxGrayValue)
iMaxGrayValue = bt;
F[bt]++;
}
}
iThrehold =0;//
iNewThrehold = (iMinGrayValue+iMaxGrayValue)/2;//初始阀值
iDiffRec = iMaxGrayValue - iMinGrayValue;
for(int a=0;(abs(iThrehold-iNewThrehold)>0.5)&&a