В этом примере показано, как применить несколько прямоугольных фильтров различного размера к изображению с помощью интегральной фильтрации изображений. Интегральное изображение является полезным представлением изображения, из которого можно быстро вычислить локальные суммы изображений. Прямоугольный фильтр может рассматриваться как локальная взвешенная сумма на каждом пикселе.
Прочтите изображение в рабочую область и отобразите его.
originalImage = imread('cameraman.tif'); figure imshow(originalImage) title('Original Image')
Задайте размеры трех прямоугольных фильтров.
filterSizes = [7 7;11 11;15 15];
Дополните изображение, чтобы соответствовать размеру самого большого коробчатого фильтра. Дополните каждую размерность на величину, равную половине размера самого большого фильтра. Обратите внимание на использование заполнения в стиле репликации для уменьшения программных продуктов.
maxFilterSize = max(filterSizes); padSize = (maxFilterSize - 1)/2; paddedImage = padarray(originalImage,padSize,'replicate','both');
Вычислите интегральное представление изображения с заполнением с помощью integralImage
функцию и отобразить ее. Интегральное изображение монотонно не уменьшается слева направо и сверху вниз. Каждый пиксель представляет сумму всей интенсивности пикселей в верхней и левой частях текущего пикселя изображения.
intImage = integralImage(paddedImage);
figure
imshow(intImage,[])
title('Integral Image Representation')
Примените три прямоугольных фильтра различного размера к интегральному изображению. The integralBoxFilter
функция может использоваться, чтобы применить фильтр 2-D ящика к интегральному изображению изображения.
filteredImage1 = integralBoxFilter(intImage, filterSizes(1,:)); filteredImage2 = integralBoxFilter(intImage, filterSizes(2,:)); filteredImage3 = integralBoxFilter(intImage, filterSizes(3,:));
The integralBoxFilter
функция возвращает только части фильтрации, которые вычисляются без заполнения. Фильтрация одного и того же интегрального изображения с коробчатыми фильтрами разного размера приводит к выходам разного размера. Это похоже на 'valid'
опция в conv2
функция.
whos filteredImage*
Name Size Bytes Class Attributes filteredImage1 264x264 557568 double filteredImage2 260x260 540800 double filteredImage3 256x256 524288 double
Поскольку изображение было заполнено для размещения наибольшего коробчатого фильтра перед вычислением интегрального изображения, содержимое изображения не теряется. filteredImage1
и filteredImage2
иметь дополнительную подложку, которую можно обрезать.
extraPadding1 = (maxFilterSize - filterSizes(1,:))/2; filteredImage1 = filteredImage1(1+extraPadding1(1):end-extraPadding1(1),... 1+extraPadding1(2):end-extraPadding1(2) ); extraPadding2 = (maxFilterSize - filterSizes(2,:))/2; filteredImage2 = filteredImage2(1+extraPadding2(1):end-extraPadding2(1),... 1+extraPadding2(2):end-extraPadding2(2) ); figure imshow(filteredImage1,[]) title('Image filtered with [7 7] box filter')
figure
imshow(filteredImage2,[])
title('Image filtered with [11 11] box filter')
figure
imshow(filteredImage3,[])
title('Image filtered with [15 15] box filter')
integralBoxFilter
| integralBoxFilter3
| integralImage
| integralImage3