exponenta event banner

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

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

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

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 функция может использоваться для применения фильтра поля 2-D к интегральному представлению изображения.

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.

См. также

| | |

Связанные темы