У меня есть 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
источник
Ответы:
Для вашей попытки №2 действительно существует 2D-версия - она похожа в теории, но ее нельзя разложить на две одномерные операции. Пожалуйста, прочитайте о "морфологической фильтрации 2D в градациях серого". Это быстрее, чем кривая примерка.
Медианная фильтрация также может быть полезна, если вы пытаетесь удалить спеклы. Более продвинутой формой медианной фильтрации является «порядковая фильтрация».
Во всех случаях требование № 1 может быть выполнено тривиально, беря пиксельный минимум между выходом и входом. Это важный критерий качества, но он не будет ограничивать выбор алгоритмов.
Гауссова фильтрация (и ряд других полезных фильтров) может быть разложена (сначала от операций 2D к 1D, затем с помощью преобразования Фурье), но есть много других полезных методов обработки изображений, которые не разлагаются, что делает их медленными, но не уменьшает их полезность.
источник
Я предлагаю использовать сглаживающий сплайн.
Вот как вы можете сделать это, используя Matlab с надежной функцией сглаживания сплайнов SMOOTHN из Matlab File Exchange (которая содержит полный исходный код, так что вы можете повторно реализовать его где-нибудь в случае необходимости). Обратите внимание, что он также работает с n-мерными данными:
источник