统计学与线性代数学在图像处理与检测方面有不少的应用,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;
}
}
}
算法还是很简单的,输入数据计算均值和标准差就行了,分别以均值减三倍标准差和均值加三倍标准差为高低阈值,应用的时候根据缺陷特征异常到底是高阈值以上,还是低阈值以上进行阈值分割就好了。下面是正态分布图。