c#和halcon实现的任意size的高斯核权重的简单计算方法

本文介绍了如何使用C#编程语言和Halcon辅助工具计算高斯滤波器的权重,特别关注了小到大尺寸卷积核的权重计算方法,以及归一化处理的过程。
摘要由CSDN通过智能技术生成

高斯滤波是一种服从正态分布的滤波器,邻域的权重大小与距离相关,有一个阈值\sigma\sigma值越大表示平滑度越高,滤波器的权重分布峰图就越矮。

权重的计算公式如下:gau=(\frac{1}{2\pi \cdot \sigma ^{2}})*\exp (\frac{-(x^{2}+y^{2})}{2 \cdot \sigma ^{2}})

对于权重的计算,如果是对于小size的卷积核,那么计算比较简单,那么对于大尺寸的卷积核,则计算较为复杂,提出一种简单的计算方式,建立了数组和卷积核坐标的转换关系,实现数组循环计算。如下图所示为数组坐标和卷积核坐标的位置关系。

直接上程序,程序采用c#,并使用了halcon辅助运算

        /// <summary>
        /// 输出固定size的卷积核值,存储方式为矩阵方式,并进行了归一化处理
        /// </summary>
        /// <param name="_size">滤波核的大小</param>
        /// <param name="nor">阈值 默认取1.5</param>
        /// <param name="conv">输出的卷积核</param>
        /// <returns></returns>
        public bool ComPut_Gauss_ConvKernel(int _size,double nor,out double[,] conv)
        {
            if((_size%2)==0)
            {
                conv = new double[3, 3];
                return false;
            }
            double sum = 0;
            double[] Array2CovMatrix=new double[6];
            double  phi = 90;

            HTuple phiRad = new HTuple();
            HTuple SinPhi = new HTuple();
            HTuple CosPhi = new HTuple();
            HOperatorSet.TupleRad(phi,out phiRad);
            HOperatorSet.TupleSin(phiRad, out SinPhi);
            HOperatorSet.TupleCos(phiRad, out CosPhi);

            Array2CovMatrix[0] = CosPhi.D;
            Array2CovMatrix[1] = SinPhi.D;
            Array2CovMatrix[3] = -SinPhi.D;
            Array2CovMatrix[4] = CosPhi.D;
            Array2CovMatrix[2] = -(_size-1)/2;
            Array2CovMatrix[5] = (_size-1)/2;

            conv = new double[_size, _size];
            for (int i = 0; i < _size; i++)
            {
                for (int j = 0; j < _size; j++)
                {
                    //应该是以中点为圆心
                    HOperatorSet.AffineTransPoint2d(Array2CovMatrix, i, j, out HTuple x, out HTuple y);
                    ComPut_gauss_conv(x.D, y.D, nor, out double value);
                    conv[i, j] = value;
                    sum += conv[i, j];
                }
            }
            //归一化
            for (int i = 0; i < _size; i++)
            {
                for (int j = 0; j < _size; j++)
                {
                    conv[i, j] /= sum;
                }
            }

            return true;
        }

        /// <summary>
        /// 计算某个位置的高斯核的权重值
        /// </summary>
        /// <param name="x">卷积核的位置坐标</param>
        /// <param name="y">卷积核的位置坐标</param>
        /// <param name="nor">阈值</param>
        /// <param name="_value">权重值</param>
        /// <returns></returns>
        public bool ComPut_gauss_conv(double x,double y,double nor,out double _value)
        {
            double _value1 = 1/(2 * Math.PI * Math.Pow(nor, 2));
            double _value2 = -(Math.Pow(x, 2) + Math.Pow(y, 2)) / (2 * Math.Pow(nor, 2));
            _value = _value1 *Math.Exp(_value2);
            return true;
        }

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值