2011-06-08 14 views
6

Estoy trabajando en un proyecto de procesamiento de imágenes en MATLAB. Para preprocesar la imagen más fácilmente, la he dividido en filas y columnas, así que a partir de una imagen original (una matriz 2D uint8), ahora tengo una matriz 3D, como una pila.MATLAB - Combinar submatrices

Image decomposition

Después de procesar cada bloque, quiero recomponer la imagen de nuevo. El problema es que el número de filas y columnas es dinámico, por lo que no puedo usar (o no sé cómo usarlo aquí) el comando cat o la sintaxis [firstsubmatrix secondsubmatrix].

Por cierto, hago la división de la siguiente manera:

numRows = 3 
numCols = 3 
blockHeight = originalHeight/numRows; 
blockWidth = originalWidth/numCols; 

blocks = uint8(zeros(numCols * numRows, blockHeight, blockWidth)); 

Así que para cada bloque, lleno su contenido utilizando

y0 = (row - 1) * rowHeight + 1; 
y1 = row * rowHeight; 
x0 = (col - 1) * rowWidth + 1; 
x1 = col * rowWidth; 

blocks(numBlock, :, :) = originalImage(y0:y1, x0:x1); 

¿Hay una mejor manera de hacerlo, y cualquier forma de tener los bloques unidos?

+0

Usted puede encontrar esto útil: http://www.mathworks.com/help/toolbox/images/ref/blockproc.html (o blkproc en las versiones anteriores) –

Respuesta

3

Si estoy entendiendo bien su pregunta, entonces esta es la forma en que lo haría: Asumamos que tenemos alguna matriz de datos con dimensiones m por n

[m n] = size(data); 

rows_wanted = 10; 
cols_wanted = 10; 
submatrix_rows = rows_wanted*ones(1,m/rows_wanted); 
submatrix_cols = cols_wanted*ones(1,n/cols_wanted); 
data_cells = mat2cell(data,submatrix_rows,submatrix_cols); 
for k1 = 1:submatrix_rows; 
    for k2 = 1:submatrix_cols; 
     proc_data_cells{k1,k2} = function_for_matrics(data_cells{k,l}); 
    end 
end 
proc_data_mtx = cell2mat(proc_data_cells); 

convertir sus datos en una celda, donde cada elemento de la celda es una submatriz, luego revisa cada elemento, preforma tu función y la envía a una nueva celda. Use cell2mat para generar una matriz procesada completamente concatenada.

Si tiene acceso a Image Processing Toolbox, también verificaría la función 'blkproc'.

+0

No tenía ni idea de las celdas. ¡Gracias! –

1

Con respecto a su pregunta específica sobre cómo se puede convertir entre una matriz 2-D y una matriz 3-D de acuerdo con su diagrama, primero voy a suponer que originalHeight y originalWidth se pueden dividir en partes iguales numRows y numCols, respectivamente. Sobre la base de a solution I gave-a similar problem que se hizo anteriormente, aquí es una solución utilizando sólo cambia la forma y permutaciones de las matrices:

%# Convert from 2-D to 3-D: 
blocks = reshape(permute(reshape(originalImage,blockHeight,blockWidth,[]),... 
         [1 3 2]),blockHeight,blockWidth,[]); 

%# Convert from 3-D to 2-D: 
newImage = reshape(permute(reshape(blocks,blockHeight,[],blockWidth),... 
          [1 3 2]),originalHeight,originalWidth); 

Tenga en cuenta que los bloques de la matriz 3-D se concatenan a lo largo de la tercera dimensión, por lo blocks(:,:,i) es el bloque i th de la matriz 2-D. Tenga en cuenta también que estas soluciones extraerán y rellenarán bloques en la matriz bidimensional de forma fila. En otras palabras, si originalImage = [A1 A2; A3 A4];, entonces blocks(:,:,1) = A1;, blocks(:,:,2) = A2;, etc.