Задание 2: Шумоподавление

Обязательная часть задания

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

Шум является аддитивным, белым, с нормальным распределением с нулевым средним и одинаковой дисперсией для всех пикселей. Такая модель достаточно хорошо описывает шум, характерный для сенсоров цифровых камер.

Среднеквадратическое отклонение (корень из дисперсии) шума является неизвестной величиной, в диапазоне от 0 до 256. Перед шумоподавлением требуется провести оценку шума. Рекомендуемый способ: осуществить шумоподавление, исходя из некоторых усреднённых параметров, затем, предполагая, что разностное изображение содержит преимущественно шум, посчитать дисперсию значений пикселей на разностном изображении и принять её за дисперсию шума. Далее уточнить дисперсию шума, повторив процедуру, но используя для шумоподавления не усреднённые параметры, а ранее посчитанную дисперсию шума.

Шумоподавление предлагается осуществлять путём последовательного применения медианной фильтрации с квадратным окном некоторого радиуса, затем фильтра Гаусса или билатеральной фильтрации. Оптимальные значения парамеров медианной фильтрации и билатеральной фильтрации являются неизвестными и должны быть найдены самостоятельно. Рекомендуемый способ: взять набор тестовых изображений, добавить на них шум с различной дисперсией, для каждого уровня шума подобрать оптимальные параметры, минимизировав MSE — среднеквадратичную ошибку между результатом шумоподавления и исходными изображениями, на выходе получить функцию соответствия между дисперсией шума и праметрами шумоподавления.

Диапазон значений пикселей изображений — [0, 255].

Дополнительная часть задания

Для шумоподавления должна быть использована билатеральная фильтрация вместо фильтра Гаусса.

Рекомендации

Для построения функции можно взять фикисрованную сетку уровней шума, например 0, 0.5, 1.0, 1.5, 2.0, 3.0, 4.0, ... (лучше использовать логарифмическую шкалу), а в промежуточных значениях делать линейную интерполяцию.

Формат параметров командной строки

Программа должна поддерживать запуск из командной строки со строго определённым форматом команд:

python main.py (command) (parameters...)

Список команд:

mse (input_file_1) (input_file_2)
  Вычислить значение метрики MSE и вывести его на экран
calc_noise (input_file)
  Оценить среднеквадратическое отклонение шума и вывести его на экран
median (r) (input_file) (output_file)
  Медианная фильтрация с окном размера (2r+1) × (2r+1)
bilateral (sigma_d) (sigma_r) (input_file) (output_file)
  Билатеральная фильтрация с параметрами σd и σr
query (noise_level)
  Вывести на экран параметры шумоподавления для шума со среднеквадратичным отклоннием noise_level
denoise (input_file) (output_file)
  Осуществить подавление шума

Замечания

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

Результат работы команды query — три числа, разделённые пробелами:

(median_r) (sigma_d) (sigma_r)

Если вы вместо билатеральной фильтрации используете фильтр Гаусса, тогда вместо (sigma_r) выведите 0.

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

Примеры изображений


Изображение без шума

Изображение с шумом, σ=16

Изображение с шумом, σ=64
Медианная фильтрация median 1
Медианная фильтрация median 2
Фильтр Гаусса с параметром σ=2
Билатеральная фильтрация bilateral 2 2
Билатеральная фильтрация bilateral 2 16
Билатеральная фильтрация bilateral 2 64

Справочные материалы