我有这张图片:
我想通过使用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);