В литературе по цифровой обработке изображений вы найдете примеры ядер Лапласа относительно низких порядков, обычно 3 или 5. Интересно, есть ли какой-либо общий способ построения ядер Лапласа или произвольного порядка? Ссылки и/или ссылки приветствуются.
Ядра Лапласа высшего порядка в обработке изображений
Ответы (1)
оператор Лапласа определяется как сумма вторых производных по каждой из осей изображения . (То есть это след матрицы Гессе):
- Δ I = ( ∂2/∂x2 + ∂2/∂ y2 ) I
Есть два распространенных способа дискретизации:
Используйте конечные разности. Оператор производной представляет собой свертку по
[1,-1]
или[0.5,0,-0.5]
, второй оператор производной дважды применяет свертку[1,-1]
, что приводит к свертке с[1,-2,1]
.Свертка с производной ядра регуляризации. Оптимальное ядро регуляризации является гауссовым, что приводит к оператору Лапласа или Гаусса. Результатом является точный Лаплас изображения, сглаженного ядром Гаусса.
Альтернативой является замена ядра регуляризации интерполирующим ядром. Мой бывший коллега опубликовал статью об этом методе:
А. Хаст, Простой дизайн фильтра для производных первого и второго порядка с помощью подхода двойной фильтрации, Pattern Письма о признании 42(1):65-71, 2014.
Он использовал двойной фильтр, но с линейными фильтрами, которые всегда можно упростить до одинарной свертки.
Идея заключается в том, чтобы взять интерполирующее ядро и вычислить его производную в целочисленных ячейках. Ядро интерполяции всегда равно 1 в начале координат и 0 в других целых местах, но оно проходит через эти узловые точки, а это означает, что его производная не равна нулю в этих целых местах.
В крайнем случае возьмем идеальный интерполятор, функция sinc:
- sinc(x) = sin(πx) / πx
Его вторая производная :
- d2/dx2(sinc(πx)) = [ (2 - π 2x2) sin(πx) - 2πx cos(π х) ] / (πx3)
Выборка из 11 целочисленных местоположений приводит к:
[ 0.08 -0.125 0.222 -0.5 2 -3 2 -0.5 0.222 -0.125 0.08 ]
Но обратите внимание, что нормализация здесь неверна, так как мы отсекаем бесконечно длинное ядро. Таким образом, лучше выбрать более короткое ядро, такое как ядро кубического сплайна.
Второй альтернативой является вычисление оператора Лапласа через область Фурье. Это просто требует умножения на -πu2-πv2, на u и 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.
Наконец, я хотел бы отметить, что оператор Лапласа очень чувствителен к шуму (значительно усиливаются высокие частоты). Обсуждаемые здесь методы имеют смысл только для данных без носа (предположительно синтетических данных?). Для любых реальных данных я настоятельно рекомендую вам использовать Лапласа или Гаусса. Это даст вам точный Лаплас сглаженного изображения. Сглаживание необходимо для предотвращения влияния шума. С небольшим шумом вы можете использовать небольшую гауссовую сигму (например, σ = 0,8). Это даст вам гораздо больше полезных результатов, чем любой другой подход.