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

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

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

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.

Примените три прямоугольных фильтра различного размера к интегральному изображению. 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 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.

См. также

| | |

Похожие темы