Как улучшить обнаружение функций в opencv

Я работаю над проектом, который мне нужен для обнаружения функций на изображениях с помощью OpenCV.

я использую

SURF detector;
SURF extractor;
BFMatcher matcher;

для обнаружения, извлечения и сопоставления точек. Это хорошо работает для некоторых изображений, но не работает на некоторых других изображениях.

Например, система терпит неудачу на этом образе:

введите описание изображения здесь

Очевидно, это изображение имеет некоторую текстуру, и детектор признаков должен обнаруживать их, но никакой признак не обнаруживается, и, следовательно, совпадение не создается.

Как я могу улучшить эту функцию обнаружения?

Могу ли я использовать любую технику обработки изображений для этого?

Есть ли другой детектор, который я могу использовать, чтобы помочь в этой проблеме?

3

Решение

Я не использовал SURF, но использовал алгоритм ORB. И чтобы улучшить обнаружение функций, я экспериментировал с несколькими фильтрами. Наилучшие результаты, которые я получил, были с комбинацией фильтров Equalize Histogram и Fast Fourier Transform.

Фильтр выравнивания гистограммы: Усиливает бессмысленные детали и скрывает важные, но небольшие высококонтрастные пиксели, которые считаются шумом. Выравнивание гистограммы использует монотонное нелинейное отображение, которое повторно назначает значения интенсивности пикселей во входном изображении так, чтобы выходное изображение содержало равномерное распределение интенсивностей (то есть плоская гистограмма)

Фильтр быстрого преобразования Фурье: Изображение разлагается на синус и косинус. Выходные данные преобразования, выполняемого этим фильтром, представляют изображение в частотной области, тогда как входное изображение является эквивалентом пространственной области. В изображении в области Фурье каждая точка представляет конкретную частоту, содержащуюся в изображении в пространственной области.

Я не уверен, но я думаю, что в OpenCV нет фильтра FFT, поэтому, вероятно, вам нужно будет использовать другую библиотеку.

Edit1:
У меня есть код, но, к сожалению, это на Java, а не на C ++. Но если вы примените те же фильтры, результат будет таким же. Вот это документация гистограммы Eqaulize. И чтобы применить фильтр FFT, я использовал ImageJ, который является библиотекой Java. Вы можете попробовать найти что-то похожее на эту библиотеку, например этот один.

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Ниже приведены примеры обнаруженных функций до и после применения указанных фильтров.

  1. SURF без фильтра:
    введите описание изображения здесь
  2. SURF с EH + FFT:
    введите описание изображения здесь
  3. ШАР с EH + FFT:
    введите описание изображения здесь

Как видно из алгоритма SURF, слишком много избыточной информации для сопоставления. Поэтому я предлагаю вам использовать алгоритм ORB. Также преимуществом ORB является то, что он бесплатный в использовании, эффективен и стабилен для поворота и масштабирования изображения. Вы также можете сгладить изображение перед применением EH + FFT, чтобы обнаруживать особенности только по углам.

Edit4Я также нашел полезную информацию о БПФ. В соответствии с Эта тема БПФ является эффективной реализацией ДПФ. Который описан Вот. Это также может быть ответ четыре ваш недавний вопрос.

6

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]