Как я могу фильтр нижних частот, только уменьшая пиковые данные?

16

У меня есть 2D-изображение, которое я хочу фильтровать нижними частотами, с этими ограничениями / показателями качества:

  1. Я не могу «добавить» свет к изображению, поэтому каждый пиксель в результате должен быть <= соответствующий пиксель на входе.
  2. Частота среза нижних частот должна быть параметром, чтобы экспериментировать с
  3. Повторное применение этого фильтра не должно существенно изменить результат.
  4. Время, необходимое для запуска этого алгоритма (5 минут для 5-мегапиксельного образа кажется разумным)
  5. Минимизация количества света, который отфильтровывается.

Ниже приведены некоторые подходы, которые я пробовал, вместе с их недостатками:

  1. Фильтр Гаусса, как нормальный, затем перетяните результат вниз, чтобы соответствовать ограничению 1. Это очень хорошо соответствует первым 3 точкам, но уменьшает намного больше света, чем необходимо.

  2. Подгонка «вверх» параболы через «низкие» точки и «вниз» параболы между ними, чтобы сгладить. Это прекрасно работает в 1D, но применяя его сначала по горизонтали, а затем по вертикали, дает плохие результаты в 2D. Это занимает намного больше времени, но не слишком долго для моего приложения. Однако повторное применение этого фильтра кардинально изменит результат. Если вход (1D) представляет собой идеальную «нисходящую» параболу (которую вообще не следует фильтровать), он будет заменен 2 «восходящими» параболами, сидящими в начале / конце.

  3. Использование некоторой другой формы двумерных «базовых» функций и линейного решения для поиска оптимальных параметров. Это идея только в настоящее время, еще не реализована / проверена.

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

обновление 2011/08/18

Основываясь на текущих реакциях, я решил прояснить ситуацию, добавив графики типичного ввода и результаты трех описанных мной подходов + предложения, которые я получил до сих пор. Для удобства сравнения в этих примерах я использовал только 1D-фильтрацию.

Входные данные: Входные данные

Фильтр Гаусса + приведите его в соответствие с требованием (1).
Вы можете видеть, что его снижение приводит к ненужному уменьшению света с правой стороны. гауссовский фильтр

Параболы.
Насколько я понимаю, это очень хорошо, к сожалению, он не очень хорошо переводится в 2D, применяя сначала горизонтальный, а затем вертикальный. В этом случае вы также видите, что я могу оценить подогнанные параболы в разрешении с плавающей запятой, что является небольшим преимуществом, но не является абсолютно необходимым. примерка параболы

Эрозия
в градациях серого. По предложению rwong я попробовал эрозию в градациях серого. Я использовал структурирующий элемент той же параболической формы, что и мои «подогнанные» параболы. Результат почти такой же, так что это выглядит многообещающе. Однако есть еще несколько проблем: 1. Мой структурирующий элемент не был «достаточно большим» (хотя его ширина уже составляла 801 пиксель). 1. У меня есть только «восходящие» параболы, но не «нисходящие», чтобы сгладить переход от одной параболы. к следующему. эрозия серого

Медианная фильтрация
Включена только для полноты, это не совсем то, что я хочу. средний фильтр

Необработанные данные
Я вставил необработанные входные данные + различные команды python в pastebin, чтобы вы тоже могли поэкспериментировать с теми же данными.
http://pastebin.com/ASnJ9M0p

Питер-Ян Бушар
источник
1
Можете ли вы объяснить немного больше об ограничениях 1 и 5? Они кажутся (на первый взгляд) противоречивыми.
Питер К.
Я, вероятно, неправильно понимаю, что вы подразумеваете под «этим алгоритмом», но 5 минут на 5 Мп кажутся большими для применения фильтра нижних частот.
bjoernz

Ответы:

8

Для вашей попытки №2 действительно существует 2D-версия - она ​​похожа в теории, но ее нельзя разложить на две одномерные операции. Пожалуйста, прочитайте о "морфологической фильтрации 2D в градациях серого". Это быстрее, чем кривая примерка.

Медианная фильтрация также может быть полезна, если вы пытаетесь удалить спеклы. Более продвинутой формой медианной фильтрации является «порядковая фильтрация».

Во всех случаях требование № 1 может быть выполнено тривиально, беря пиксельный минимум между выходом и входом. Это важный критерий качества, но он не будет ограничивать выбор алгоритмов.


Гауссова фильтрация (и ряд других полезных фильтров) может быть разложена (сначала от операций 2D к 1D, затем с помощью преобразования Фурье), но есть много других полезных методов обработки изображений, которые не разлагаются, что делает их медленными, но не уменьшает их полезность.

rwong
источник
Привет, спасибо за указатель на морфологическую фильтрацию в градациях серого. Описание в Википедии кажется интересным, и я буду исследовать это. Однако в вашей ссылке на документацию OpenCV я вижу только нормальные морфологические фильтры, но не серые. Я обязательно проверю эту опцию и сообщу вам результаты. Благодарю.
Питер-Ян Буссхарт
6
Предложение Руонга о медианной фильтрации помогает вообще? Объяснение немного больше о том, чего вы пытаетесь достичь, представив простой пример данных и «поддельный» пример того, что вы хотите получить, может помочь.
Питер К.
Я обновил свой вопрос с примерами данных + результаты различных предложений. Надеюсь, теперь все стало понятнее.
Питер-Ян Буссхарт
2

Я предлагаю использовать сглаживающий сплайн.

Вот как вы можете сделать это, используя Matlab с надежной функцией сглаживания сплайнов SMOOTHN из Matlab File Exchange (которая содержит полный исходный код, так что вы можете повторно реализовать его где-нибудь в случае необходимости). Обратите внимание, что он также работает с n-мерными данными:

%# - get inputlist from pastebin

%# - smoothen data. Lower factor means less smooth
smoothingFactor = 1000;
smoothData = smoothn(inputlist,smoothingFactor);

%# - shift down
smoothData = smoothData - max(inputlist-smoothData);

%# - show results
plot(inputlist,'b'),hold on,plot(smoothData,'r')

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

Jonas
источник
Спасибо за ваше предложение, я изучу его. Из вашего графика может показаться, что мне нужен намного более высокий коэффициент сглаживания, чем в вашем примере. Крутой край около x = 700 не удаляется и будет хорошо виден. Также начальный удар по x = [0, 400] вообще не удаляется. Не думаете ли вы, что это будет иметь ту же проблему, что и любой другой подход (фильтр нижних частот + движение вниз)? Вы можете увидеть глобальное смещение между двумя графиками, которое, вероятно, даже увеличится, если я использую более высокий коэффициент сглаживания.
Питер-Ян Буссхарт
@ Pieter-JanBusschaert: О, я думал, что первый пик был как-то полезен для вас. В любом случае, у всех фильтров нижних частот + понижение будет сложность с крутым подъемом ~ 650: они сделают эту часть более плоской, и, следовательно, кривая должна быть сильно смещена вниз. Медианный фильтр, сопровождаемый сглаживающим сплайном, немного помогает.
Джонас