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

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

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

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

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

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

Ответы

Ответ 1

h = fspecial('average', n);
filter2(h, img);

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

Ответ 2

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

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

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

Ответ 3

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) для ускорения выполнения.

Ответ 4

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

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

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

Ответ 5

f=imread(...);

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