усреднение маски и маски Лапласа при обработке изображений

StackOverflow https://stackoverflow.com/questions/6325595

Вопрос

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

Это было полезно?

Решение

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


Вот пример 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

Другие советы

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

X = ((I * F1) * F2)

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

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

X = (I * (F1 * F2))

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

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

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


РЕДАКТИРОВАТЬ

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

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, кажется, мы действительно говорим то же самое.

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

Пример в математике:

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}
*)
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top