您的位置:首页 > 其它

关于门限处理的实现

2008-06-24 13:56 162 查看
一、基本全局门限

如果图像的直方图波峰波谷明显,具有双波峰,如图3所示时,使用该方法效果较佳。这里介绍迭代法,其算法流程为:



图1使用迭代法获得门限再做图像分割后,二值化图像如图2所示,分割效果较好。





图1 图2



图3

二、基本自适应门限
但如果图像在成像时,由于曝光程度的不均匀,使用全局门限则效果不佳,此时应采用自适应门限方法。一种方法是将图像分成若干个子图像,再对子图像求取基本全局门限;如图4中铸盘内圆右上1/4圆出曝光过度,直接用全局门限分割会导致轮廓不清晰,如图5所示,此时采用自适应门限,将图像均匀划分为20个子图像,效果如图6所示,效果较好,轮廓为损毁。





图4 图5



图6
迭代法的C代码为:其中函数的参数为OpenCV中的图像结构

double threshold(IplImage *img)
//迭代法的实现,输入参数为待求取阈值的图像或字图像块
{

double *block_org=new double[HEIGHT*WIDTH];//HEIGHT,WIDTH为全局变量,由用户自己根据需要定义

double *block=new double[HEIGHT*WIDTH];

CvScalar pixel;

int m, n;

//阈值初始值选取

for(m=0; m<HEIGHT; m++)

for(n=0; n<WIDTH; n++)

{

pixel=cvGet2D(img, m, n);

block_org[m*WIDTH+n]=pixel.val[0];

}

double max=0;//灰度图像中的最大值

for(m=0; m<HEIGHT; m++)

for(n=0; n<WIDTH; n++)

{

if(block_org[m*WIDTH+n]>max)

max=block_org[m*WIDTH+n];

}

double min=255;//灰度图像中的最小值

for(m=0; m<HEIGHT; m++)

for(n=0; n<WIDTH; n++)

{

if(block_org[m*WIDTH+n]<min)

min=block_org[m*WIDTH+n];

}

double thresh=(max+min)/2;//初始化阈值

//将灰度图中的元素分为两组,小于阈值的放在数组前面,大于的放在数组的尾端

int len=(HEIGHT-1)*(WIDTH-1);

int l_offset=-1;

int r_offset=len-1;

double temp_down=0;

double temp_up=0;

for(m=0; m<len; m++)

{

if(block_org[m]<thresh)

{

l_offset++;

block[l_offset]=block_org[m];

}

else

{

block[r_offset]=block_org[m];

r_offset--;

}

}

for(m=0; m<l_offset+1; m++)

{

temp_down+=block[m];

}

temp_down/=(l_offset+1);

for(m=r_offset; m<len; m++)

{

temp_up+=block[m];

}

temp_up/=(len-r_offset);

double thresh_update=(temp_up+temp_down)/2;//阈值t(k)

while(thresh_update!=thresh)

{

l_offset=-1;

r_offset=len-1;

temp_down=0;

temp_up=0;

thresh=thresh_update;//t(k)=t(k+1)

for(m=0; m<len; m++)

{

if(block_org[m]<thresh)

{

l_offset++;

block[l_offset]=block_org[m];

}

else

{

block[r_offset]=block_org[m];

r_offset--;

}

}

for(m=0; m<l_offset+1; m++)

{

temp_down+=block[m];

}

temp_down/=(l_offset+1);

for(m=r_offset; m<len; m++)

{

temp_up+=block[m];

}

temp_up/=(len-r_offset);

thresh_update=(temp_up+temp_down)/2;

}//迭代过程

delete []block_org;

delete []block;

return thresh_update;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐