我有这张图片:

c++ - 如何在OpenCV(C++)中加快Frangi过滤-LMLPHP

我想通过使用Frangi过滤器检测此图像上的异常。我到这里的代码是:Frangi filter。我将此参数用于frangi过滤器:

  // Manualy edited parameters of frangi filter.
#define DEFAULT_SIGMA_START 1
#define DEFAULT_SIGMA_END 3
#define DEFAULT_SIGMA_STEP 1
#define DEFAULT_BETA_ONE 1.6
#define DEFAULT_BETA_TWO 1.2
#define DEFAULT_BLACKWHITE true

异常检测非常正常。问题是计算速度。过滤时间为:7秒。在使用Frangi Filter维护良好检测的同时,可以采取哪些加速解决方案?

编辑1:花费最多时间的代码是frangi2d算法内部的for循环:
for (float sigma = opts.sigma_start; sigma <= opts.sigma_end; sigma += opts.sigma_step) {
        //create 2D hessians
        Mat Dxx, Dyy, Dxy;
        frangi2d_hessian(src, Dxx, Dxy, Dyy, sigma);

        //correct for scale
        Dxx = Dxx*sigma*sigma;
        Dyy = Dyy*sigma*sigma;
        Dxy = Dxy*sigma*sigma;

        //calculate (abs sorted) eigenvalues and vectors
        Mat lambda1, lambda2, Ix, Iy;
        frangi2_eig2image(Dxx, Dxy, Dyy, lambda1, lambda2, Ix, Iy);

        //compute direction of the minor eigenvector
        Mat angles;
        phase(Ix, Iy, angles);
        ALLangles.push_back(angles);

        //compute some similarity measures
        lambda2.setTo(nextafterf(0, 1), lambda2 == 0);
        Mat Rb = lambda1.mul(1.0 / lambda2);
        Rb = Rb.mul(Rb);
        Mat S2 = lambda1.mul(lambda1) + lambda2.mul(lambda2);

        //compute output image
        Mat tmp1, tmp2;
        exp(-Rb / beta, tmp1);
        exp(-S2 / c, tmp2);

        Mat Ifiltered = tmp1.mul(Mat::ones(src.rows, src.cols, src.type()) - tmp2);
        if (opts.BlackWhite) {
            Ifiltered.setTo(0, lambda2 < 0);
        }
        else {
            Ifiltered.setTo(0, lambda2 > 0);
        }

        //store results
        ALLfiltered.push_back(Ifiltered);

        cout << "Interation done" << endl;
    }

最佳答案

您的图像有一个很大的黑色区域,您可以选择一个ROI,以便应用滤镜。

ROI选择可以基于图像的预处理来寻找ROI的顶点。也许它对于您的应用程序是固定的。也许您可以使用其他信息来选择投资返回率。

Rect region_of_interest = Rect(x, y, w, h);
Mat image_roi = image(region_of_interest);

09-04 04:02