маска усреднения и лапласианская маска при обработке изображений - PullRequest
7 голосов
/ 13 июня 2011

в данном приложении я применяю усредняющую маску для входных изображений, чтобы уменьшить шум, а затем лапласианскую маску, чтобы улучшить мелкие детали.Кто-нибудь знает, получу ли я такие же результаты, если переверну порядок этих операций в Matlab?

Ответы [ 3 ]

8 голосов
/ 14 июня 2011

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


Вот пример MATLAB, аналогичный тому, который @ belisarius написал:

f='http://upload.wikimedia.org/wikipedia/commons/f/f4/Noise_salt_and_pepper.png';
I = imread(f);

kAvg = fspecial('average',[5 5]);
kLap = fspecial('laplacian',0.2);

lapMask = @(I) imsubtract(I,imfilter(I,kLap));

subplot(131), imshow(I)
subplot(132), imshow( imfilter(lapMask(I),kAvg) )
subplot(133), imshow( lapMask(imfilter(I,kAvg)) )

enter image description here

7 голосов
/ 15 июня 2011

Допустим, у вас есть два фильтра F1 и F2 и изображение I. Если вы пропустите изображение через два фильтра, вы получите ответ, который был определен как

X = ((I * F1) * F2)

Где я использую * для представления свертки .

По ассоциативному правилу свертки это то же самое, что и

X = (I * (F1 * F2))

Используя коммутативность, мы можем сказать, что

X = (I * (F2 * F1)) = ((I * F2) * F1)

Конечно, это в хорошей непрерывной области математики, выполнение этих операций на машине означает, что будут ошибки округления и некоторые данные могут быть потеряны. Вам также следует подумать о том, являются ли ваши фильтры FIR , в противном случае вся концепция представления о цифровой фильтрации в виде сверточного типа начинает разрушаться, поскольку ваш фильтр не может действительно вести себя так, как вы хотели. *


EDIT

Дискретная свертка определяется как

conv2 uses a straightforward formal implementation of the two-dimensional convolution equation in spatial form

поэтому добавление нулей по краям ваших данных ничего не меняет в математическом смысле.

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

Также важно рассмотреть, как работает операция свертки. Свертывание двух наборов данных длиной X и длиной Y приведет к ответу длиной X+Y-1. В таких программах, как MATLAB и Mathematica, есть какая-то закулисная магия, дающая вам ответ, длина которого X или Y.

Итак, что касается сообщения @belisarius, похоже, мы действительно говорим то же самое.

3 голосов
/ 13 июня 2011

Численно результаты не совпадают, но изображения выглядят очень похоже.

Пример в Mathematica:

enter image description here

Редактировать

В качестве ответа на комментарий @thron в своем ответе о коммутации линейных фильтров и заполнения, просто рассмотрите следующие операции.

В то время как коммутация фильтра Гаусса и Лапласа без заполнения верна:

list = {1, 3, 5, 7, 5, 3, 1};
gauss[x_] := GaussianFilter[ x, 1]
lapl[x_] := LaplacianFilter[x, 1]
Print[gauss[lapl[list]], lapl[gauss[list]]]
(*
->{5.15139,0.568439,-1.13688,-9.16589,-1.13688,0.568439,5.15139}    
  {5.15139,0.568439,-1.13688,-9.16589,-1.13688,0.568439,5.15139}
*)

Если сделать то же самое с отступом, получится разница по краям:

gauss[x_] := GaussianFilter[ x, 1, Padding -> 1]
lapl[x_] := LaplacianFilter[x, 1, Padding -> 1]
Print[gauss[lapl[list]], lapl[gauss[list]]]

(*
->{4.68233,0.568439,-1.13688,-9.16589,-1.13688,0.568439,4.68233}
  {4.58295,0.568439,-1.13688,-9.16589,-1.13688,0.568439,4.58295}
*)
...