最大方差阈值分割法在分割过程中对图像上每个像素都是用了相等的阈值,但在实际的情况中,当照明不均匀,有突发噪声或
者背景灰度变化较大时,整幅图像分割时将没有合适的单一阈值,如果仍采用单一的阈值去处理每一个像素,可能会将目标区
域和背景区域错误的划分,因此,诞生了自适应阈值分割的思想,即图像中的每个像素对应的阈值可能不相同。
一个较为简单的自适应阈值选取方法是:每个像素的阈值由自身为中心的邻域窗口确定,把中值 均值 或者高斯卷积作为阈
值,再或者在此基础上加个常量值等等。
下面代码由OPENCV实现
有两种自动化阈值方式1. CV_BLUR 均值
2. CV_GUASSIA 高斯
/*
函数 : my_AdaptiveThreshold
参数:Src 源图像
Dst 目的图像
method --- 中值滤波CV_BLUR
高斯滤波CV_GAUSSIAN
type --- 二值化类型 THRESH_BINARY CV_THRESH_BINARY_INV
blocksize -- 核大小
delta ---- 差值 src - mean
功能 : 自动化阈值分割
限制 : 8 位灰度图
*/
void my_AdaptiveThreshold(IplImage * Src,IplImage *Dst , int method, int type , int blocksize, int delta )
{
IplImage * mean = cvCreateImage(cvGetSize(Src),Src - >depth,Src - >nChannels);
cvSmooth(Src ,mean , method ,blocksize,blocksize );
for ( int i = 0 ; i < Src - >height ; ++i)
{
unsigned char * usrc =( unsigned char *) Src - >imageData + i * Src - >widthStep ;
unsigned char * umean =( unsigned char *) mean - >imageData + i * mean - >widthStep ;
unsigned char * udst =( unsigned char *) Dst - >imageData + i * Dst - >widthStep;
for ( int j = 0 ; j < Src - >width ; ++j)
{
if (type ==CV_THRESH_BINARY )
udst[j] = (usrc[j] - umean[j]) > = delta ? 255 : 0 ;
else if (type == CV_THRESH_BINARY_INV)
udst[j] = (usrc[j] - umean[j]) > = delta ? 0 : 255 ;
}
}
cvReleaseImage( &mean);
}
函数 : my_AdaptiveThreshold
参数:Src 源图像
Dst 目的图像
method --- 中值滤波CV_BLUR
高斯滤波CV_GAUSSIAN
type --- 二值化类型 THRESH_BINARY CV_THRESH_BINARY_INV
blocksize -- 核大小
delta ---- 差值 src - mean
功能 : 自动化阈值分割
限制 : 8 位灰度图
*/
void my_AdaptiveThreshold(IplImage * Src,IplImage *Dst , int method, int type , int blocksize, int delta )
{
IplImage * mean = cvCreateImage(cvGetSize(Src),Src - >depth,Src - >nChannels);
cvSmooth(Src ,mean , method ,blocksize,blocksize );
for ( int i = 0 ; i < Src - >height ; ++i)
{
unsigned char * usrc =( unsigned char *) Src - >imageData + i * Src - >widthStep ;
unsigned char * umean =( unsigned char *) mean - >imageData + i * mean - >widthStep ;
unsigned char * udst =( unsigned char *) Dst - >imageData + i * Dst - >widthStep;
for ( int j = 0 ; j < Src - >width ; ++j)
{
if (type ==CV_THRESH_BINARY )
udst[j] = (usrc[j] - umean[j]) > = delta ? 255 : 0 ;
else if (type == CV_THRESH_BINARY_INV)
udst[j] = (usrc[j] - umean[j]) > = delta ? 0 : 255 ;
}
}
cvReleaseImage( &mean);
}