您好,欢迎访问三七文档
阈值获取总结图像处理中,常去除图像中不理想的部分,而保留对象部分。所以,我们可以通过阈值进行提取,例如,通过阈值法提取出文字部分,可用下式进行表示:tyxftyxfyxg,,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:/*********************************************************************FunctionName:histgram--获得灰度图像直方图**InputParam:u8image_in[Y_SIZE][X_SIZE];//输入图像数组**u32hist[64];//直方图数组**OutputParam:No**ReturnValue:No********************************************************************/voidhistgram(u8image_in[Y_SIZE][X_SIZE],u16hist[64]){u16i,j,n;for(n=0;n64;n++)hist[n]=0;for(i=0;iY_SIZE;i++){for(j=0;jX_SIZE;j++){n=image_in[i][j];hist[n]++;//统计灰度级n}}}/*********************************************************************FunctionName:picture_thresh**InputParam:u16hist[64]**u8*thresh;//返回的灰度图像阈值thresh**OutputParam:No**ReturnValue:No********************************************************************/voidpicture_thresh(u16hist[64],u8*thresh){u8i;floatsum_per0,sum_per1,sum_gray0,sum_gray1;floatresult,record0,record1;floatgray_percentage[64];//各级灰度的百分比floataverage_gray[64];//各级平均灰度值sum_per0=0.0;sum_gray0=0.0;sum_gray1=0.0;record0=1;record1=0;for(i=0;i64;i++){gray_percentage[i]=hist[i]/19200.0;average_gray[i]=(float)i*gray_percentage[i];sum_gray1+=average_gray[i];//平均灰度值}for(i=0;i64;i++){sum_per0=sum_per0+gray_percentage[i];//w0sum_per1=1-sum_per0;//w1sum_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((record1record0)&&(record1result)){break;}record0=record1;record1=result;}if(i==0)*thresh=0;if(i=50)*thresh=50;else*thresh=i;}上面的两个函数需要组合使用,并且通过STM32和OV7670进行实地的调试,显示效果还是可以的。Date:2016/5/30CreateBy:硅谷的另一面
本文标题:2灰度图像阈值确定
链接地址:https://www.777doc.com/doc-2915923 .html