2.灰度图像阈值确定

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

阈值获取总结

图像处理中,常去除图像中不理想的部分,而保留对象部分。所以,我们可以通过阈值进行提取,例如,通过阈值法提取出文字部分,可用下式进行表示:

()()()⎩⎨⎧<≥=t

y x f t y x f y x g ,,0,,1, 但是,随着环境的变化,所给的阈值的不同,对于所提取的对象就有很大的差别。所以,需要一种实时确定阈值的方法使得背景和物体可以准确地分类。在此推荐的方法—— 最大类间方差法(Otsu 、大津法)。 通过对比和仔细的推算,此种方法比较容易实现,而且效果比较好。

下面简述并且摘录一下文献中关于“最大类间方差法”的说明:最大类间方差法(Otsu)是由Otsu 于1979年提出的,是基于整幅图像的统计特性实现阈值的自动选取的,是全局二值化最杰出的代表。Otsu 算法的基本思想是用某一假定的灰度值t 将图像的灰度分成两组,当两组的类间方差最大时,此灰度值t 就是图像二值化的最佳阈值。设图像有L 个灰度值,取值范围在 0~L-1,在此范围内选取灰度值 T ,将图像分成两组G0和G1,G0包含的像素的灰度值在 0~T ,G1的灰度值在 T+1~L-1,用 N 表示图像像素总数。

算法可这样理解:阈值T 将整幅图像分成前景和背景两部分,当两类的类间方差最大时,此时前景和背景的差别最大,二值化效果最好。因为方差是灰度分布均匀性的一种度量,方差值越大,说明构成图像的两部分差别越大,当部分目标错分为背景或部分背景错分为目标 都会导致两部分差别变小,因此使类间方差最大的分割阈值意味着错分概率最小。

大律法得到了广泛的应用,但是当物体目标与背景灰度差不明显时,会出现无法忍受的大块黑色区域,甚至会丢失整幅图像的信息。所以,此时应该适当降低图像的阈值,从而消除大块的黑色区域。下面是具体确定理想阈值的API :

/*******************************************************************

** Function Name : histgram -- 获得灰度图像直方图

** Input Param : u8 image_in[Y_SIZE][X_SIZE];// 输入图像数组

** u32 hist[64]; // 直方图数组

** Output Param : No

** Return Value : No

********************************************************************/

void histgram(u8 image_in[Y_SIZE][X_SIZE],u16 hist[64])

{

u16 i,j,n;

for(n = 0;n < 64; n ++) hist[n] = 0;

for(i = 0;i < Y_SIZE;i ++){

for(j = 0;j < X_SIZE;j ++){

n = image_in[i][j];

hist[n] ++; //统计灰度级n

}

}

}

/********************************************************************

* Function Name : picture_thresh

** Input Param : u16 hist[64]

** u8 *thresh; // 返回的灰度图像阈值thresh ** Output Param : No

** Return Value : No

********************************************************************/

void picture_thresh(u16 hist[64],u8 *thresh)

{

u8 i;

float sum_per0,sum_per1,sum_gray0,sum_gray1;

float result,record0,record1;

float gray_percentage[64]; //各级灰度的百分比

float average_gray[64]; //各级平均灰度值

sum_per0 = 0.0;

sum_gray0 = 0.0;

sum_gray1 = 0.0;

record0 = 1;

record1 = 0;

for(i = 0;i < 64;i ++){

gray_percentage[i] = hist[i]/19200.0;

average_gray[i] = (float)i*gray_percentage[i];

sum_gray1 += average_gray[i]; //平均灰度值

}

for(i = 0;i < 64;i ++){

sum_per0 = sum_per0 + gray_percentage[i]; //w0

sum_per1 = 1 - sum_per0; //w1

sum_gray0 = sum_gray0 + average_gray[i];

sum_gray1 = sum_gray1 - average_gray[i];

result = sum_per0 * sum_per1 * (sum_gray0 - sum_gray1) *(sum_gray0 - sum_gray1);

if((record1 > record0) && (record1 > result)){

break;

}

record0 = record1;

record1 = result;

}

if(i == 0) *thresh = 0;

if(i >= 50) *thresh = 50;

相关文档
最新文档