У меня есть 2D-изображение, которое я хочу фильтровать нижними частотами, с этими ограничениями / показателями качества:
- Я не могу «добавить» свет к изображению, поэтому каждый пиксель в результате должен быть <= соответствующий пиксель на входе.
- Частота среза нижних частот должна быть параметром, чтобы экспериментировать с
- Повторное применение этого фильтра не должно существенно изменить результат.
- Время, необходимое для запуска этого алгоритма (5 минут для 5-мегапиксельного образа кажется разумным)
- Минимизация количества света, который отфильтровывается.
Ниже приведены некоторые подходы, которые я пробовал, вместе с их недостатками:
Фильтр Гаусса, как нормальный, затем перетяните результат вниз, чтобы соответствовать ограничению 1. Это очень хорошо соответствует первым 3 точкам, но уменьшает намного больше света, чем необходимо.
Подгонка «вверх» параболы через «низкие» точки и «вниз» параболы между ними, чтобы сгладить. Это прекрасно работает в 1D, но применяя его сначала по горизонтали, а затем по вертикали, дает плохие результаты в 2D. Это занимает намного больше времени, но не слишком долго для моего приложения. Однако повторное применение этого фильтра кардинально изменит результат. Если вход (1D) представляет собой идеальную «нисходящую» параболу (которую вообще не следует фильтровать), он будет заменен 2 «восходящими» параболами, сидящими в начале / конце.
Использование некоторой другой формы двумерных «базовых» функций и линейного решения для поиска оптимальных параметров. Это идея только в настоящее время, еще не реализована / проверена.
Мой опыт в обработке сигналов - почти исключительно обработка изображений, поэтому я надеюсь найти альтернативы этой проблеме с привлечением экспертов, работающих в других областях обработки сигналов.
обновление 2011/08/18
Основываясь на текущих реакциях, я решил прояснить ситуацию, добавив графики типичного ввода и результаты трех описанных мной подходов + предложения, которые я получил до сих пор. Для удобства сравнения в этих примерах я использовал только 1D-фильтрацию.
Входные данные:
Фильтр Гаусса + приведите его в соответствие с требованием (1).
Вы можете видеть, что его снижение приводит к ненужному уменьшению света с правой стороны.
Параболы.
Насколько я понимаю, это очень хорошо, к сожалению, он не очень хорошо переводится в 2D, применяя сначала горизонтальный, а затем вертикальный. В этом случае вы также видите, что я могу оценить подогнанные параболы в разрешении с плавающей запятой, что является небольшим преимуществом, но не является абсолютно необходимым.
Эрозия
в градациях серого. По предложению rwong я попробовал эрозию в градациях серого. Я использовал структурирующий элемент той же параболической формы, что и мои «подогнанные» параболы. Результат почти такой же, так что это выглядит многообещающе. Однако есть еще несколько проблем: 1. Мой структурирующий элемент не был «достаточно большим» (хотя его ширина уже составляла 801 пиксель). 1. У меня есть только «восходящие» параболы, но не «нисходящие», чтобы сгладить переход от одной параболы. к следующему.
Медианная фильтрация
Включена только для полноты, это не совсем то, что я хочу.
Необработанные данные
Я вставил необработанные входные данные + различные команды python в pastebin, чтобы вы тоже могли поэкспериментировать с теми же данными.
http://pastebin.com/ASnJ9M0p