Я не использовал SURF, но использовал алгоритм ORB. И для улучшения обнаружения объектов я экспериментировал с несколькими фильтрами. Лучшие результаты, которые я получил, были с комбинацией фильтров Equalize Histogram и Fast Fourier Transform.
Equalize Histogram filter: Он усиливает бессмысленные детали и скрывает важные, но небольшие высококонтрастные пиксели, которые воспринимаются как шум. выравнивание гистограмм работает монотонное, нелинейное отображение, которое повторно присваивает значения интенсивности пикселей входного изображения таким образом, что вывод изображение содержит равномерное распределение интенсивности (то есть плоская гистограммы)
быстрого преобразования Фурье фильтра : Он разлагает изображение на его синусоидальные и косинусные компоненты. Результат преобразования, выполняемого этим фильтром, представляет изображение в частотной области, тогда как входное изображение является эквивалентом пространственной области. В изображении домена Фурье каждая точка представляет собой определенную частоту, содержащуюся в изображении пространственной области.
Я не уверен, но я думаю, что в OpenCV нет фильтра FFT, поэтому, вероятно, вам понадобится использовать другую библиотеку.
Редактировать 1: У меня есть код, но, к сожалению, он находится на Java, а не на C++. Но если вы будете применять те же фильтры, результат будет таким же. Here - документация гистограммы Eqaulize. И для применения фильтра FFT я использовал ImageJ, который является библиотекой Java. Вы можете попытаться найти что-то похожее на эту библиотеку, например this.
Edit2: код ImageJ применять FFT фильтр
import ij.plugin.filter.FFTFilter;
...
FFTFilter fft = new FFTFilter();
ImageProcessor ip = new ColorProcessor(bufImage);
ImagePlus imgPlus = new ImagePlus();
imgPlus.setImage(bufImage);
try{
fft.setup(null, imgPlus);
}catch(Exception e){e.printStackTrace();}
fft.run(ip);
Edit3: Ниже приведены примеры обнаруженных признаков до и после применения упомянутых фильтров.
- SURF без фильтра:
- SURF с EH + FFT:
- ОРБ с EH + FFT:
Как вы можете видеть с помощью алгоритма SURF, там слишком много избыточной информации для выполнения сопоставления. Поэтому я предлагаю вам использовать алгоритм ORB. Кроме того, преимущества ORB заключаются в том, что он свободен в использовании, эффективен и устойчив к вращению и масштабированию изображения. Вы также можете сгладить изображение перед применением EH + FFT для обнаружения функций только по углам.
Редактировать: 0:: Я также нашел полезную информацию о БПФ. Согласно this topic FFT является эффективной реализацией DFT. Описание описано here. Это также может быть ответ четыре вопроса your.
Спасибо, не могли бы вы поделиться каким-то кодом? Например, как выполнить выравнивание гистограммы на входном изображении? Или использовать БПФ? – mans
Я оставил некоторые комментарии в разделе _Edit_ – andriy
Спасибо, я использовал Histogramequalizer и, похоже, имеет большое значение. Как использовать БПФ? Вы фильтруете низкую частоту изображения? Например, собираетесь ли вы в домен fft, удалить некоторую частоту и вернуться в пространственный домен? Какую частоту вы удаляете? – mans