Распараллелить цепочку из гауссовых пятен

У меня есть этот код (пересмотренная версия этого):

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);
}

Является ли это возможным?

Этот ответ позволил мне подумать, что это возможно, но я не могу понять, как я могу это реализовать:

Свертывание фильтров Если вы последовательно применяете несколько фильтров к одному и тому же изображению, например, размытие по Гауссу, тогда фильтр Габора можно объединить вместе. Сделайте все фильтры одинакового размера и сверните их. Затем примените результат к изображению. Мат говорит, что эффект будет идентичен предыдущей комбинации

0 ответов

Это возможно (вы можете распараллелить). У меня была точно такая же проблема, и я решил ее таким образом (см. Мой ответ на эту проблему с кодом Python).

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

Другие вопросы по тегам