阈值获取总结
图像处理中,常去除图像中不理想的部分,而保留对象部分。所以,我们可以通过阈值进行提取,例如,通过阈值法提取出文字部分,可用下式进行表示:
但是,随着环境的变化,所给的阈值的不同,对于所提取的对象就有很大的差别。所以,需要一种实时确定阈值的方法使得背景和物体可以准确地分类。在此推荐的方法—— 最大类间方差法(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]; //各级灰度的百分比
sap软件 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;
el *thresh = i;
}
上面的两个函数需要组合使用,并且通过STM32和OV7670进行实地的调试,显示效果还是可以的。
Date : 2016/5/30
阎罗令Create By : 硅谷的另一面