Как применить движущиеся окна к 2D-матрице в MATLAB? - PullRequest
8 голосов
/ 25 марта 2009

Я делаю извлечение объектов из изображения в Matlab. Для этого мне нужно применить много функций к окнам nXn (например, чтобы найти дисперсию для каждого окна 3X3 и т. Д.
Есть ли простой и эффективный способ сделать это в Matlab, кроме циклического прохождения по матрице и сбора элементов окна каждый раз?
Для некоторых функций я смог найти эквивалентную маску и применить их, используя filter2, но для многих других я не вижу такой роскоши (один хороший пример: медиана окна 3X3).
Мне нужно что-то , например arrayfun, но что-то, что относится к окнам nXn, а не к отдельным элементам.
Спасибо,
Сундар

1 Ответ

5 голосов
/ 25 марта 2009

Если у вас есть набор инструментов для обработки изображений, вы можете использовать blkproc для обработки nxm блоков вашего изображения с использованием пользовательских функций. Вот пример

function Ip = imageProcessed(II,blockSize)
   % FUNCTION imageProcessed calculates average value of blocks of size nxm
   % blocks 
      if nargin<2,
         % default/example value for block size
         blockSize = [3 4];
      end

      if size(II,3)>1,
          % blkproc requires a grayscale image
          % convert II to gray scale if it is RGB.
          II=rgb2gray(II)
      end


      % Custom average function.
      myAveFun = @(x) ones(size(x))*sum(x(:))/length(x(:));

      % use blkproc to process image
      Ip = blkproc(II,[blockSize(1), blockSize(2)],myAveFun);
end

Примечание:

Начиная с пакета инструментов обработки изображений MATLAB 2009b, blkproc устарел и заменен на blockproc (см. R2099b section здесь ) Таким образом, последние две строки могут быть изменены на:

 myAveFun = @(blkstrct) ones(size(blkstrct.data))*mean(blkstrct.data(:))
 Ip = blockproc(II,blockSize,myAveFun);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...