并行化高斯模糊链

Parallelize chain of Gaussian Blurs

本文关键字:模糊 高斯 并行化      更新时间:2023-10-16

我有这段代码(重新访问版本(:

void HessianDetector::detectOctaveKeypoints(const Mat &firstLevel, ...)
{
   vector<Mat> blurs (par.numberOfScales+3, Mat());
   blurs[1] = firstLevel;
   for (int i = 1; i < par.numberOfScales+2; i++){
       float sigma = par.sigmas[i]* sqrt(sigmaStep * sigmaStep - 1.0f);
       blurs[i+1] = gaussianBlur(blurs[i], sigma);
   }
...

哪里:

Mat gaussianBlur(const Mat input, const float sigma)
{
   Mat ret(input.rows, input.cols, input.type());
   int size = (int)(2.0 * 3.0 * sigma + 1.0); if (size % 2 == 0) size++;      
   GaussianBlur(input, ret, Size(size, size), sigma, sigma, BORDER_REPLICATE);
   return ret;
}

所以,如你所见,每个blurs[i+1]都依赖于blurs[i],所以它不能并行化。我的问题是:是否有一种等效的方法可以获得相同的结果,但使用 firstLevel 而不是 blurs[i] ?所以它应该看起来像这样:

for (int i = 1; i < par.numberOfScales+2; i++){
  float sigma = //something;
  blurs[i+1] = gaussianBlur(firstLevel, sigma);
}

可能吗?

这个答案让我认为这是可能的,但我无法理解我如何实现这一点:

卷积过滤器 如果在同一图像上应用多个滤镜 连续,就像高斯模糊,然后是Gabor滤波器,你可以 将它们组合在一起。使所有过滤器的大小相同并卷积 他们。然后将结果应用于图像。数学说效果将是 与之前的组合相同

这是

可能的(你可以并行化(。我遇到了完全相同的问题,并以这种方式解决了它(请参阅我对这个问题的回答,使用 python 代码(。

https://dsp.stackexchange.com/questions/667/image-pyramid-without-decimation/55654#55654