Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何计算高斯加权圆窗?_C++_Matrix_Statistics_Gaussian - Fatal编程技术网

C++ 如何计算高斯加权圆窗?

C++ 如何计算高斯加权圆窗?,c++,matrix,statistics,gaussian,C++,Matrix,Statistics,Gaussian,我有一个矩阵,每个字段都有值。大小为15x15(225),现在我想根据矩阵的中心场计算每个场的权重。对于较大的距离,像素的值在计算中的权重较小。这应该看起来像一个围绕中心场的圆。下面是一个示例图像: 小矩形是中心区域。加权应为高斯加权圆形窗口,σ为1.5。我怎样才能做到这一点?我的想法是这样的,每个重量都填在一个相同大小的矩阵中,以便以后计算 expf = 1.f/(2.f * 1.5 * 1.5); [...] W[k] = (i*i + j*j) * expf; 其中i和j是距离中心像素

我有一个矩阵,每个字段都有值。大小为15x15(225),现在我想根据矩阵的中心场计算每个场的权重。对于较大的距离,像素的值在计算中的权重较小。这应该看起来像一个围绕中心场的圆。下面是一个示例图像:

小矩形是中心区域。加权应为高斯加权圆形窗口,σ为1.5。我怎样才能做到这一点?我的想法是这样的,每个重量都填在一个相同大小的矩阵中,以便以后计算

expf = 1.f/(2.f * 1.5 * 1.5);
[...]
W[k] = (i*i + j*j) * expf;
其中i和j是距离中心像素的距离(例如,对于第一次迭代
i=-7,j=-7

对我来说,这个解决方案似乎不错,但我得到的值总是很小,例如:

W[0]: 3.48362e-10
W[1]: 6.26123e-09
W[2]: 7.21553e-08
W[3]: 5.3316e-07
W[4]: 2.52596e-06
W[5]: 7.67319e-06
W[6]: 1.49453e-05
[...]
W[40]: 0.000523195
W[41]: 0.000110432
W[42]: 1.49453e-05
W[43]: 1.29687e-06
W[44]: 7.21553e-08
W[45]: 5.3316e-07
W[46]: 9.58266e-06
W[47]: 0.000110432
W[48]: 0.000815988
[...]
W[85]: 0.055638
W[86]: 0.0117436
W[87]: 0.00158933
W[88]: 0.000137913
[...]
W[149]: 7.67319e-06
W[150]: 2.52596e-06
W[151]: 4.53999e-05
W[152]: 0.000523195
W[153]: 0.00386592
难道重量的计算是错误的吗

2π-k/2 |∑|-0.5exp(-0.5((x-μ)|∑|-1((x-μ))

就你的情况而言,这意味着

double weight(int i, int j, double var) {
    return 1 / (2 * M_PI) * std::exp(-0.5 * (i * i + j * j) / var / var);
}
其中,
i
j
以0和0为中心,而
var
是方差

注:

  • 这是PDF格式。如果您希望中间的值为1,请使用
    weight(i,j,var)/weight(0,0,var)
    。否则,您将得到较小的数字

  • 衰减由
    var
    指定-较低的值将显示较大的衰减


  • 下面的代码打印

    $ g++ --std=c++11 gs.cpp && ./a.out 
    1
    0.884706
    1
    4.78512e-06
    
    比如说

    #include <cmath>
    #include <iostream>
    
    double weight(int i, int j, double var) {
        return 1 / (2 * M_PI) * std::exp(-0.5 * (i * i + j * j) / var / var);
    }
    
    int main() {
        {
            const double f = weight(0, 0, 20);
            std::cout << weight(0, 0, 20) / f << std::endl;
            std::cout << weight(-7, -7, 20) / f << std::endl;
        }
        {
            const double f = weight(0, 0, 2);
            std::cout << weight(0, 0, 2) / f << std::endl;
            std::cout << weight(-7, -7, 2) / f << std::endl;
        }
    }
    
    #包括
    #包括
    双权重(整数i、整数j、双变量){
    返回1/(2*M_PI)*std::exp(-0.5*(i*i+j*j)/var/var);
    }
    int main(){
    {
    常数双f=重量(0,0,20);
    
    std::我还可以通过维基条目来清楚地理解所有内容。但是这个例子看起来很好。谢谢你!@Vincenthe0ne我不幸在上面的公式中犯了一个错误。请查看当前版本。啊,我没有注意到,但是谢谢你的更正@AmiTavory。我还有一个问题要问。H您如何设置
    var
    值,或者将其设置为高或低的原因是什么?或者我可以看到
    var
    与我的sigma一样吗?@Vincent0ne var确实与您的sigma类似。我认为只有您知道问题的具体情况,才能设置适合它的衰减率。