1

我正在研究 CSS 算法,但我不了解“弧长参数”的概念。

根据文献,平面曲线 Gamma(u)=(x(u),y(u)) 他们说这个 u 是弧长参数,显然,高斯核 g 也被这个 u 参数化。

如果我出错了,请阻止我,但是,不是像素的 x 和 y 位置吗?另一个参数如何表示?

我第一次在文献上看到它时不知道,所以我查了代码。显然,我更加困惑了。

这是代码的一部分

    void getGaussianDerivs(double sigma, int M, vector<double>& gaussian,                       
                           vector<double>& dg, vector<double>& d2g) {
        int L = (M - 1) / 2;
        double sigma_sq = sigma * sigma;
        double sigma_quad = sigma_sq*sigma_sq;
        dg.resize(M); d2g.resize(M); gaussian.resize(M);

        Mat_<double> g = getGaussianKernel(M, sigma, CV_64F);
        for (double i = -L; i < L+1.0; i += 1.0) {
        int idx = (int)(i+L);
        gaussian[idx] = g(idx);
            // from http://www.cedar.buffalo.edu/~srihari/CSE555/Normal2.pdf
        dg[idx] = (-i/sigma_sq) * g(idx);
        d2g[idx] = (-sigma_sq + i*i)/sigma_quad * g(idx);
        }
    }

因此,该代码似乎使用 M 的简单一维高斯内核孔径大小,并且它正在尝试计算其一阶和二阶导数。据我所知,一维高斯核的参数 x 是水平坐标,sigma 是比例。似乎'弧长参数u'相当于x的变量。这没有任何意义,因为在后面的代码中,它直接对轮廓上的 x 和 y 集合进行卷积。

这是什么你?

PS。既然我回复了试图回答我问题的人,我想我应该修改我的问题,所以,我们开始吧。

我感到困惑的是,这个参数'u'是如何在代码中实现的?我想我理解了上面的完整代码——当然,我只插入了一部分代码——但问题是,我不知道算法的“改进”版本会是什么。它说它使用的是“仿射长度参数”而不是这个“弧长参数”,我不太确定如何在代码中实现这个概念。

根据文献,弧长参数和仿射长度参数的主要区别在于它的采样间隔,弧长参数在垂直和水平方向使用1,对角方向使用2的根。这是有道理的,因为上面的代码部分使用 for 循环来计算 1d 高斯的一阶和二阶导数,并且它直接插入区间 1 的值,但是,不同变量的不同区间如何呢?是否有可能我无法使用“for循环”?

4

0 回答 0