усреднение маски и маски Лапласа при обработке изображений
-
27-10-2019 - |
Вопрос
В данном приложении я применяю усредняющую маску для ввода изображений, чтобы уменьшить шум, а затем маска Лапласа, чтобы улучшить мелкие детали. Кто -нибудь знает, получу ли я те же результаты, если я отменил порядок этих операций в 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)) )
Другие советы
Допустим, у вас есть два фильтра F1
а также F2
, и изображение I
. Анкет Если вы передадите свое изображение через два фильтра, вы получите ответ, который был определен как
X = ((I * F1) * F2)
Где здесь я использую *
представлять сверток.
По ассоциативному правилу свертки это то же самое, что.
X = (I * (F1 * F2))
Используя коммутативность, мы можем сказать, что
X = (I * (F2 * F1)) = ((I * F2) * F1)
Конечно, это в хорошей непрерывной домене математики, делая эти вещи на машине, означает, что будут ошибки округления, а некоторые данные могут быть потеряны. Вы также должны подумать, если ваши фильтры Пихта, в противном случае вся концепция размышлений о цифровой фильтрации, так как сорта свертки начинает разрушаться, поскольку ваш фильтр не может вести себя так, как вы этого хотели.
РЕДАКТИРОВАТЬ
Дискретная свертка определяется как
Таким образом, добавление нулей по краям ваших данных ничего не меняет в математическом смысле.
Как отмечали некоторые люди, вы получите различные ответы численно, но это ожидается всякий раз, когда мы справляемся с вычислением фактических данных. Эти вариации должны быть небольшими и ограничивать низкоэнергетические компоненты вывода свертки (т.е. края).
Также важно рассмотреть, как работает операция свертки. Свернув два набора данных длины X
и длина Y
приведет к ответу, который X+Y-1
в длину. В таких программах, как Matlab и Mathematica, есть некоторые закулисные магии, которые дают вам ответ, который имеет длину X
или же Y
.
Так что в отношении поста @belisarius, кажется, мы действительно говорим то же самое.
Численно результаты не одинаковы, но изображения выглядят довольно похожими.
Пример в математике:
Редактировать
В качестве ответа на комментарий @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}
*)