В литературе по цифровой обработке изображений вы найдете примеры ядер Лапласа относительно низких порядков, обычно 3 или 5. Интересно, есть ли какой-либо общий способ построения ядер Лапласа или произвольного порядка? Ссылки и / или ссылки будут оценены.
Или ты про размер ядра? Если это так, ищите Лапласа Гауссова.
@AnderBiguri Да, это то, что я имею в виду
@Cris Luengo Я полагаю, что размер ядра и порядок приближения - это одно и то же число. Во всяком случае, я имею в виду не LoG, а чистое ядро Лапласа.





Оператор Лапласа определяется как сумма вторых производных по каждой из осей изображения. (То есть это след матрицы Гессе):
Есть два распространенных способа дискретизировать это:
Используйте конечные разности. Оператор производной - это свертка с помощью [1,-1] или [0.5,0,-0.5], оператор второй производной, применяющий свертку [1,-1] дважды, что приводит к свертке с помощью [1,-2,1].
Сверните с производной ядра регуляризации. Оптимальным ядром регуляризации является гауссовский, приводящий к гауссовскому оператору Лапласа. Результатом является точный лапласа изображения, сглаженного гауссовым ядром.
Альтернативой является замена ядра регуляризации интерполирующим ядром. Мой бывший коллега опубликовал статью об этом методе:
A. Hast, "Simple filter design for first and second order derivatives by a double filtering approach", Pattern Recognition Letters 42(1):65-71, 2014.
Он использовал «двойной фильтр», но с линейными фильтрами, которые всегда можно упростить до одинарной свертки.
Идея состоит в том, чтобы взять интерполирующее ядро и вычислить его производную в целочисленных точках. Интерполирующее ядро всегда равно 1 в начале координат и 0 в других целочисленных точках, но оно проходит через эти «узловые точки», что означает, что его производная не равна нулю в этих целочисленных точках.
В крайнем случае возьмем идеальный интерполятор функция sinc:
Его вторая производная:
Выборка из 11 целочисленных местоположений приводит к:
[ 0.08 -0.125 0.222 -0.5 2 -3 2 -0.5 0.222 -0.125 0.08 ]
Но обратите внимание, что нормализация здесь неверна, так как мы отсекаем бесконечно длинное ядро. Таким образом, лучше выбрать более короткое ядро, например кубическое сплайн ядро.
Вторая альтернатива - вычислить оператор Лапласа через область Фурье. Это просто требует умножения на -πты3-πv2, с ты и v частот.
Это некий код MATLAB, который применяет этот фильтр к изображению единичного импульса, приводя к изображению ядра размером 256x256:
[u,v] = meshgrid((-128:127)/256,(-128:127)/256);
Dxx = -4*(pi*u).^2;
Dyy = -4*(pi*v).^2;
L = Dxx + Dyy;
l = fftshift(ifft2(ifftshift(L)));
l = real(l); % discard insignificant imaginary component (probably not necessary in MATLAB, but Octave leaves these values there)
l(abs(l)<1e-6) = 0; % set near-zero values to zero
l здесь тот же, что и результат выше для идеального интерполятора, добавляя вместе вертикальный и горизонтальный и нормализуя для длины 256.
Наконец, я хотел бы упомянуть, что оператор Лапласа очень чувствителен к шуму (высокие частоты значительно усиливаются). Обсуждаемые здесь методы имеют смысл только для данных без носа (предположительно синтетических данных?). Для любых реальных данных я очень рекомендую использовать Лапласа Гаусса. Это даст вам точный Laplace сглаженного изображения. Сглаживание необходимо для предотвращения воздействия шума. С небольшим шумом вы можете использовать маленькую гауссову сигму (например, σ = 0,8). Это даст вам гораздо больше полезных результатов, чем любой другой подход.
Крис, спасибо большое! Это действительно исчерпывающее объяснение! Да, в моем случае я имею дело с синтетическими изображениями, и мне нужно протестировать их с различными видами чистых лапласианов.
Что значит «заказ»? Порядок аппроксимации конечных разностей?