Этот пример показывает, как применить несколько фильтров поля переменных размеров к изображению с помощью интегральной фильтрации изображений. Интегральное изображение является полезным представлением изображений, из которого локальные суммы изображений могут быть вычислены быстро. Фильтр поля может считаться локальной взвешенной суммой на уровне каждого пикселя.
Считайте изображение в рабочую область и отобразите ее.
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')
Примените три фильтра поля переменных размеров к интегральному изображению. Функция integralBoxFilter
может использоваться, чтобы применить 2D фильтр поля к интегральному представлению изображений изображения.
filteredImage1 = integralBoxFilter(intImage, filterSizes(1,:)); filteredImage2 = integralBoxFilter(intImage, filterSizes(2,:)); filteredImage3 = integralBoxFilter(intImage, filterSizes(3,:));
Функция 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