У меня есть этот код (пересмотренная версия этот):
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);
}
Является ли это возможным?
это ответ позвольте мне думать, что это возможно, но я не могу понять, как я могу это реализовать:
Свертывание фильтров Если вы применяете несколько фильтров к одному изображению
последовательно, как гауссово размытие, а затем фильтр Габора, вы можете
объединить их вместе. Сделайте все фильтры одинакового размера и сверните
их. Затем примените результат к изображению. Мат говорит, что эффект будет
совпадает с предыдущей комбинацией
Задача ещё не решена.
Других решений пока нет …