2011-09-02 22 views
5

Me gusta blockproc, hace que trabajar con imágenes grandes (muy grandes) sea fácil. Sin embargo, por lo que yo entiendo, se limita a trabajar con funciones que dan como resultado una matriz del mismo tamaño que la entrada que toman.Función similar a Blockproc para salida de matriz de células

así que me preguntaba si hay una manera de reproducir/simulando lo blockproc hace pero para las funciones que salida de una serie de células. Podemos asumir que la matriz de salida de la función de procesamiento tiene las mismas dimensiones que la matriz de entrada, o que simplemente genera un elemento de celda, en cuyo caso la salida final del procesamiento total sería una matriz de celdas con elementos M x N, con M y N especificando el mosaico para el procesamiento.

Creo que puedo construir esto usando cellfun, pero me preguntaba si hay otros builtins o librerías (¿tal vez de terceros?) Que pueda usar para esto, y quizás incluso evite por completo reinventar la rueda.

Más específicamente, Busco algo que tiene los mismos puntos fuertes como blockproc:

  • puede cargar una imagen de gran tamaño del disco progresivamente de bloque por baldosas para reducir al mínimo el consumo de memoria del procesamiento
  • Se encarga de la concatenación final de los resultados para la construcción de la matriz celular final
  • tiene una interfaz similar a blockproc (por ejemplo, # de azulejos, etc.)
+0

Supongo que su matriz de celdas contiene datos "complicados" para que no pueda simplemente envolver su función en ['cell2mat'] (http://www.mathworks.de/help/techdoc/ref/cell2mat.html) y usar 'blockproc'? –

+0

Eso es correcto @Jonas.Estoy buscando una solución que no haga suposiciones sobre la celda de salida de la función que procesa (por ejemplo, tipo, su contenido, etc.) –

Respuesta

2

A continuación se muestra una solución que satisfaga sus criterios, excepto para el primer punto

Utilice la función IM2COL para organizar bloques de imágenes distintas de la imagen en columnas, a continuación, aplicar la función a cada columna almacenar el resultado en una matriz de células.

Por supuesto, esto sólo funciona si todos los bloques encajan en la memoria, de lo contrario tendría que escribir manualmente el código que extrae un bloque a la vez y procesar de esa manera ...

%# read image 
img = im2double(imread('tire.tif')); 

%# blocks params 
sizBlk = [8 8]; 
numBlk = ceil(size(img) ./ sizBlk); 

%# extract blocks 
B = im2col(img, sizBlk, 'distinct'); 
B = reshape(B, [sizBlk size(B,2)]); %# put blocks on the 3rd dimension 
B = squeeze(num2cell(B,[1 2]));  %# convert to cell array 
B = reshape(B, numBlk);    %# reshape as blocks overlayed on image 

%# process blocks 
myFcn = @(blk) [mean2(blk) std2(blk)]; %# or any other processing function 
I = cellfun(myFcn, B, 'UniformOutput',false); 

%# in this example, we can show each component separately 
subplot(121), imshow(cellfun(@(c)c(1),I)), title('mean') 
subplot(122), imshow(cellfun(@(c)c(2),I)), title('std') 

Por otra parte, todavía se podía utilizar la función BLOCKPROC, pero hay que llamarlo varias veces, cada vez que el cálculo de una sola característica:

%# compute one feature at a time 
b1 = blockproc(img, sizBlk, @(b)mean2(b.data), 'PadPartialBlocks',true); 
b2 = blockproc(img, sizBlk, @(b)std2(b.data), 'PadPartialBlocks',true); 

%# combine into cellarray of features 
II = arrayfun(@(varargin)[varargin{:}], b1, b2, 'UniformOutput',false); 

%# compare to previous results 
isequal(I,II) 
+0

¡Gracias! Esto es tan útil. –

0

que he estado haciendo algo similar, aunque con nume valores ric en lugar de celda.

Algo como esto debería funcionar:

I = imread('pout.tif'); 

G = blockproc(I, [8 8], @(b) shiftdim(imhist(b.data)', -1), 'PadPartialBlocks', true); 

G = reshape(G, size(G, 1) * size(G, 2), size(G, 3)); 

pout.tif es una imagen en escala de grises, pero estoy seguro de que esto se puede cambiar para RGB.

También tenga cuidado al usar shiftdim, imhist devuelve un vector de fila para que lo transponga a una columna.

Cuestiones relacionadas