Implementación eficiente de `im2col` y` col2im`

Los im2col y col2im son una función muy importante para la vectorización en MATLAB cuando se trata de imágenes.
Sin embargo, requieren la caja de herramientas de procesamiento de imágenes de MATLAB.

Mi pregunta es, ¿existe una manera eficiente (Vectorzied) para implementar el uso de las funciones de MATLAB (sin caja de herramientas)?
Necesito tanto el modo sliding como el distinct .

No necesito ningún relleno.

Gracias.

Solo puedo esperar que los chicos de Mathworks no nos demanden ni a ti ni a mí, ni a Stackoverflow por eso, tratando de crear implementaciones vectorizadas de sus funciones de caja de herramientas de IP, ya que han puesto precio a esa caja de herramientas. Pero en cualquier caso, olvidando esos problemas, aquí están las implementaciones.

Reemplazo de im2col con 'sliding' opción 'sliding'

No pude vectorizar esto hasta que me senté a escribir la solución a otro problema en Stackoverflow . Por lo tanto, recomendaría encarecidamente investigarlo también.

 function out = im2col_sliding(A,blocksize) nrows = blocksize(1); ncols = blocksize(2); %// Get sizes for later usages [m,n] = size(A); %// Start indices for each block start_ind = reshape(bsxfun(@plus,[1:m-nrows+1]',[0:n-ncols]*m),[],1); %//' %// Row indices lin_row = permute(bsxfun(@plus,start_ind,[0:nrows-1])',[1 3 2]); %//' %// Get linear indices based on row and col indices and get desired output out = A(reshape(bsxfun(@plus,lin_row,[0:ncols-1]*m),nrows*ncols,[])); return; 

Reemplazo de im2col con 'distinct' opción 'distinct'

 function out = im2col_distinct(A,blocksize) nrows = blocksize(1); ncols = blocksize(2); nele = nrows*ncols; row_ext = mod(size(A,1),nrows); col_ext = mod(size(A,2),ncols); padrowlen = (row_ext~=0)*(nrows - row_ext); padcollen = (col_ext~=0)*(ncols - col_ext); A1 = zeros(size(A,1)+padrowlen,size(A,2)+padcollen); A1(1:size(A,1),1:size(A,2)) = A; t1 = reshape(A1,nrows,size(A1,1)/nrows,[]); t2 = reshape(permute(t1,[1 3 2]),size(t1,1)*size(t1,3),[]); t3 = permute(reshape(t2,nele,size(t2,1)/nele,[]),[1 3 2]); out = reshape(t3,nele,[]); return; 

Algunas pruebas rápidas muestran que estas dos implementaciones, particularmente la que se sliding una para datos de entrada de tamaño pequeño a decente y distinct para todas las configuraciones de datos, funcionan mucho mejor que las implementaciones de funciones de MATLAB en términos de rendimiento en tiempo de ejecución.

Cómo utilizar

 With in-built MATLAB function - B = im2col(A,[nrows ncols],'sliding') With our custom function - B = im2col_sliding(A,[nrows ncols]) %// ------------------------------------ With in-built MATLAB function - B = im2col(A,[nrows ncols],'distinct') With our custom function - B = im2col_distinct(A,[nrows ncols]) 

Puedes hacer trampa mientras miras el paquete de imágenes de GNU Octave. Hay im2col y col2im como lenguaje de script implementado:

  • im2col
  • col2im

Por lo que veo, difiere más en estilo de comentario diferente (# en lugar de%) y estilo de cadena diferente (“en lugar de”). Si cambia esto y elimina la prueba afirmativa en la parte inferior, podría ser ejecutable ya. no, hazlo con el depurador.

Además, tenga en cuenta la licencia (GPLv3). ¡Es gratis, pero tus cambios tienen que ser gratis también!