В этом примере показано, как применить несколько фильтров поля различных размеров к изображению с помощью интегральной фильтрации изображений. Интегральное изображение является полезным представлением изображений, из которого локальные суммы изображений могут быть вычислены быстро. Фильтр поля может считаться локальной взвешенной суммой на уровне каждого пикселя.
Считайте изображение в рабочую область и отобразите ее.
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