图像处理知识点5:基于3sigma的阈值分割(异常值判断)

        统计学与线性代数学在图像处理与检测方面有不少的应用,3σ原则是一种常用的剔除异常值的方法。该方法的基本思想是,假设数据服从正态分布,那么在正态分布曲线上,距离均值3个标准差之外的数据点被认为是异常值。具体操作步骤如下:

(1)计算数据的均值和标准差;

(2)计算数据与均值的差值,如果差值大于3倍的标准差,则认为该数据点是异常值;

(3)将异常值剔除。该方法的优点是简单易行,但是它假设数据服从正态分布,如果数据不服从正态分布,则该方法可能会误判正常数据为异常值。

       在图像处理缺陷检测中该方法常常用来阈值分割出缺陷特征,因为通常缺陷特征常常表现为异常值,但是应用此方法有一个前提就是该图像的灰度分布获知其他特征值数据分布呈现出大致的正态分布时方可用此方法进行阈值分割。话不多说上个C++代码,代码实现还是比较简单的就是求均值和标准差。

/*************************************************************************
* /算法实现:     实现时间:2023.06.15    
* /函数名称:
* median_filtering()
* /输入参数:
* float* p - 输入要剔除的异常点的数据
* int a -数据起始坐标
* int b - 数据终点坐标
* /输出参数:
* float lowThreshold— 计算出的低阈值
* float highThreshold—计算出的高阈值
* /说明:
* 本函数应用3sigma原则进行异常值剔除的函数分别以u-3sigma和u+3sigma为高低阈值
*********************************************************************/
void standard_deviation(float* p, int a, int b, float lowThreshold, float highThreshold)
{
	float sum = 0;
	float count = 0;
	for (int i = a; i <= b; i++)
	{
		sum += p[i];
		count++;
	}
	float sumave = sum / count;                          //计算数据均值
	float median = 0;
	float  Sigma = 0;
	for (int i = a; i <= b; i++)
	{
		median += (p[i] - sumave) * (p[i] - sumave);
	}
	Sigma = sqrt(median / count);      //标准差
	lowThreshold = sumave - 3 * Sigma;              //均值减3倍标准差排除异常点的阈值
	highThreshold = sumave + 3 * Sigma;             //均值加3倍标准差排除异常点的阈值
	for (int i = a; i <= b; i++)
	{
		if (p[i]< lowThreshold || p[i]>highThreshold)
		{
			p[i] = 0;
		}
	}
}

算法还是很简单的,输入数据计算均值和标准差就行了,分别以均值减三倍标准差和均值加三倍标准差为高低阈值,应用的时候根据缺陷特征异常到底是高阈值以上,还是低阈值以上进行阈值分割就好了。下面是正态分布图。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值