Примените несколько фильтров к интегральному изображению

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

Считайте изображение в рабочую область и отобразите ее.

originalImage = imread('cameraman.tif');

figure
imshow(originalImage)
title('Original Image')

Figure contains an axes. The axes with title Original Image contains an object of type 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')

Figure contains an axes. The axes with title Integral Image Representation contains an object of type image.

Примените три фильтра поля различных размеров к интегральному изображению. 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 contains an axes. The axes with title Image filtered with [7 7] box filter contains an object of type image.

figure
imshow(filteredImage2,[])
title('Image filtered with [11 11] box filter')

Figure contains an axes. The axes with title Image filtered with [11 11] box filter contains an object of type image.

figure
imshow(filteredImage3,[])
title('Image filtered with [15 15] box filter')

Figure contains an axes. The axes with title Image filtered with [15 15] box filter contains an object of type image.

Смотрите также

| | |

Похожие темы