2009-03-25 18 views
8

Estoy haciendo extracción de características de una imagen en Matlab. Tengo que aplicar muchas funciones a través de ventanas nXn para este propósito (por ejemplo, para encontrar la varianza sobre cada ventana de 3X3, etc.
¿Hay alguna manera fácil y eficiente de hacer esto en Matlab aparte de hacer un bucle sobre la matriz y recolectando los elementos de ventana cada vez?
Para algunas funciones, he podido encontrar una máscara equivalente y las he aplicado usando filter2, pero para muchas otras no parece tener tanto lujo (un buen ejemplo: mediana de una ventana de 3x3).
Lo que quiero es algo como arrayfun, sino algo que se aplica a las ventanas nXn, no elementos individuales.
Gracias,
Sundar¿Cómo aplicar ventanas móviles a una matriz 2D en MATLAB?

+0

Puede ser útil si puede actualizar la pregunta y enumerar las operaciones específicas que desea aplicar a los elementos de ventana. Puede haber formas de convertirlos a todos en máscaras/elementos de filtro para usar con FILTER2 (o posiblemente CONV2). – gnovice

+0

¿tiene la caja de herramientas de procesamiento de imágenes? – Azim

Respuesta

4

Si usted tiene la caja de herramientas de procesamiento de imágenes, puede utilizar blkproc para procesar nxm bloques de la imagen utilizando funciones definidas personalizado. Aquí está un ejemplo

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 

Nota:

A partir de la imagen de MATLAB 2009b Processing Toolbox, blkproc se depcrecated y se reemplaza con blockproc (ver sección R2099b here). Por lo tanto, las dos últimas líneas podrían cambiarse a:

myAveFun = @(blkstrct) ones(size(blkstrct.data))*mean(blkstrct.data(:)) 
Ip = blockproc(II,blockSize,myAveFun); 
+0

Gracias, tengo la caja de herramientas de procesamiento de imágenes y eso es exactamente lo que necesitaba. – sundar

+0

su bienvenida. Me alegro de que ayudó. – Azim

+0

La ayuda para esta función me indicó 'colfilt'. Resulta colfilt con una ventana 'deslizante' hace que mi trabajo sea aún más fácil. Gracias por abrirme esta nueva serie de funciones. – sundar

Cuestiones relacionadas