Какой тип сглаживания использовать?

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

У меня есть следующие данные RAW. введите здесь описание изображения

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

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

Однако вы заметите, что на «шагах» скользящая средняя уменьшает градиент там, где я хочу сохранить высокий вертикальный градиент.

Существует ли какой-либо метод сглаживания, который будет учитывать большое вертикальное «смещение», но сглаживать другие данные?


person Simon    schedule 01.11.2012    source источник


Ответы (2)


Да, мне пришлось сделать что-то подобное с изображениями с космического корабля.

Простой метод № 1: используйте медианный фильтр с небольшой шириной — скажем, около 5 выборок или 7. Это дает выходное значение, которое является медианой соответствующего входного значения и нескольких его непосредственных соседей на любая сторона. Он избавится от этих шипов и хорошо сохранит края ступеней.

Медианный фильтр присутствует во всех наборах инструментов для обработки чисел, о которых я знаю, таких как Matlab, Python/Numpy, IDL и т. д., а также в библиотеках для скомпилированных языков, таких как C++, Java (хотя конкретные названия сейчас не приходят на ум. ..)

Прием № 2, возможно, не так хорош: используйте сглаживающий фильтр Савицки-Голея. Это работает за счет эффективного полиномиального подбора данных по методу наименьших квадратов в каждой выходной выборке с использованием соответствующей входной выборки и окрестности точек (во многом подобно медианному фильтру). Сглаживатель SG известен тем, что довольно хорошо сохраняет пики и резкие переходы.

Фильтр SG обычно предоставляется большинством пакетов обработки сигналов и обработки чисел, но может быть не таким распространенным, как медианный фильтр.

Прием № 3, самый трудоемкий и требующий наибольшего опыта и суждений: используйте более сглаженное — скользящее прямоугольное среднее, гауссовское и т. д. — но затем создавайте выходные данные, которые смешиваются между исходным и сглаженным данные. Смешение, управляемое новым рядом данных, который вы создаете, варьируется от полностью исходного (смешивание в 0 % сглаженного) до полностью сглаженного (100 %).

Чтобы контролировать смешивание, начните с детектора краев для обнаружения скачков. Вы можете сначала отфильтровать данные по медиане, чтобы избавиться от пиков. Затем расширьте (расширение на жаргоне обработки изображений) или сгладьте и перенормализуйте выходной сигнал детектора краев и переверните его, чтобы он давал 0,0 на скачках и рядом с ними и 1,0 во всех остальных местах. Возможно, вам нужен плавный переход к ним. Сделать это правильно — целое искусство, которое зависит от того, как будут использоваться данные — для меня это обычно изображения для просмотра людьми. Автоматизированная встроенная система управления может работать лучше, если ее настроить по-другому.

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

person DarenW    schedule 01.11.2012

Я рекомендую сначала определить шаги, а затем сгладить каждый шаг по отдельности.

Вы знаете, как выполнять сглаживание, и обнаружение краев/шагов также довольно просто (см. здесь, Например). Типичная схема обнаружения границ заключается в сглаживании ваших данных, а затем в их умножении/свертке/кросс-корреляции с некоторым фильтром (например, массивом [-1,1], который покажет вам, где находятся шаги). В математическом контексте это можно рассматривать как изучение производной вашего графика для поиска точек перегиба (для некоторых фильтров).

Альтернативным «хакерским» решением было бы сделать скользящее среднее, но исключить выбросы из сглаживания. Вы можете решить, что такое выброс, используя некоторый порог t. Другими словами, для каждой точки p со значением v возьмите окружающие ее точки x и найдите подмножество тех точек, которые находятся между v - t и v + t, и взять среднее значение этих точек в качестве нового значения p .

person Bitwise    schedule 01.11.2012
comment
Данные, кажется, имеют некоторые истинные выбросы, а также шаги. Если у вас есть адаптивный порог, например. на основе процентилей данных в районе и применения порога и среднего значения для левой и правой руки, я думаю, вы могли бы как исключить истинные выбросы, так и иметь резкие шаги. - person A. Webb; 01.11.2012