Какова математическая связь аргументов диаметра и сигмы в функции двустороннего фильтра?

Изучая технику шумоподавления изображения на основе двустороннего фильтра, я наткнулся на это руководство, который предоставляет полные списки аргументов, используемых для запуска функции OpenCV bilateralFilter. То, что я вижу, немного сбивает с толку, потому что нет объяснения математическому правилу изменения значения диаметра путем манипулирования обоими аргументами сигмы. Итак, если выбрать какие-то конкретные аргументы для передачи в эту функцию, я вряд ли пойму, какой диаметр соответствует конкретной паре значений сигмы.

Существует ли зависимость между обоими отклонениями и диаметром? Если мой вывод верен, какое уравнение (возможно, представленное в документации OpenCV) следует использовать при применении двустороннего фильтра в программном решении?


person mission_code_now    schedule 27.12.2019    source источник


Ответы (2)


Согласно документации, функция bilateralFilter в OpenCV принимает параметр d, диаметр окрестности, а также параметр sigmaSpace, пространственная сигма. Их можно выбрать отдельно, но если d "не положительное, то оно вычисляется из sigmaSpace". Для получения более подробной информации нам нужно посмотреть исходный код:

    if( d <= 0 )
        radius = cvRound(sigma_space*1.5);
    else
        radius = d/2;
    radius = MAX(radius, 1);
    d = radius*2 + 1;

То есть, если d не положительное, то оно принимается как 3 умноженное на sigmaSpace. d также всегда вынужден быть нечетным, чтобы по соседству был центральный пиксель.

Обратите внимание, что другое сигма, sigmaColor, не связано с пространственным размером фильтра.


В общем, если выбрать sigmaSpace, который слишком велик для заданного d, то ядро ​​Гаусса будет обрезано таким образом, что оно не будет выглядеть как гауссовское, и потеряет свои хорошие фильтрующие свойства (см., например, объяснение здесь). Если взять его слишком маленьким для заданного d, то многие соседние пиксели всегда будут иметь вес, близкий к нулю, а это означает, что вычислительная работа будет потрачена впустую. Значение по умолчанию довольно мало (обычно для гауссовой фильтрации используется радиус, равный 3 сигма), но все же вполне разумно, учитывая вычислительную стоимость билатерального фильтра (меньшее соседство дешевле).

person Cris Luengo    schedule 27.12.2019

Эти два значения (d и сигма) совершенно не связаны друг с другом. Sigma определяет значения пикселей ядра, а d определяет размер ядра.

Например, рассмотрим этот фильтр Гаусса с сигмой = 1:

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

Это ядро ​​​​фильтра, и, как вы можете видеть, значения пикселей ядра зависят только от сигмы (матрица 3 * 3 в середине одинакова в обоих ядрах), но уменьшение размера ядра (или уменьшение диаметра) будет сделать внешние пиксели неэффективными, не влияя на значения средних пикселей.

И теперь, если вы измените сигму (с k = 3), ядро ​​​​по-прежнему будет 3 * 3, но значения пикселей будут другими.

person MH304    schedule 28.12.2019