Средний фильтр для сглаживания изображений в Matlab - PullRequest
15 голосов
/ 15 ноября 2009

Мне нужно проверить некоторые основные приемы обработки изображений в Matlab. Мне нужно протестировать и сравнить особенно два типа фильтров: средний фильтр и медианный фильтр.

Чтобы сгладить изображение с помощью медианной фильтрации, есть отличная функция medfilt2 из панели инструментов обработки изображений. Есть ли подобная функция для среднего фильтра? Или как использовать функцию filter2 для создания среднего фильтра?

Одна из самых важных вещей для меня - это возможность установить радиус фильтра. То есть для медианного фильтра, если мне нужен радиус [3 x 3] (маска), я просто использую

imSmoothed = medfilt2(img, [3 3]);

Я бы хотел добиться чего-то похожего для среднего фильтра.

Ответы [ 5 ]

28 голосов
/ 15 ноября 2009
h = fspecial('average', n);
filter2(h, img);

См. doc fspecial: h = fspecial('average', n) возвращает усредняющий фильтр. n - это вектор размером 1 на 2, указывающий количество строк и столбцов в h.

6 голосов
/ 16 ноября 2009

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

I = imread(...)
kernel = ones(3, 3) / 9; % 3x3 mean kernel
J = conv2(I, kernel, 'same'); % Convolve keeping size of I

Обратите внимание, что для цветных изображений вы должны применить это к каждому из каналов в изображении.

5 голосов
/ 15 ноября 2009
I = imread('peppers.png');
H = fspecial('average', [5 5]);
I = imfilter(I, H);
imshow(I)

Обратите внимание, что фильтры можно применять к изображениям интенсивности (2D матрицы), используя filter2, тогда как для многомерных изображений (изображения RGB или 3D матрицы) imfilter используется.

Также на процессорах Intel imfilter может использовать библиотеку Intel Integrated Performance Primitives (IPP) для ускорения выполнения.

2 голосов
/ 10 октября 2011

и свертка определяется путем умножения в области преобразования:

conv2(x,y) = fftshift(ifft2(fft2(x).*fft2(y)))

если рассматривается один канал ... для большего количества каналов это должно быть сделано для каждого канала

0 голосов
/ 23 октября 2013
f=imread(...);

h=fspecial('average', [3 3]);
g= imfilter(f, h);
imshow(g);
...