Implementazione efficiente di `im2col` e` col2im`

im2col e col2im di MATLAB sono funzioni molto importanti per la vettorizzazione in MATLAB quando si tratta di immagini.
Tuttavia richiedono l’Image Processing Toolbox di MATLAB.

La mia domanda è, c’è un modo efficace (Vectorzied) per implementare l’uso delle funzioni di MATLAB (senza strumenti)?
Ho bisogno sia della modalità sliding che distinct .

Non ho bisogno di alcuna imbottitura.

Grazie.

    Posso solo sperare che i ragazzi di Mathworks non facciano causa a voi oa me o Stackoverflow per questo, cercando di creare implementazioni vettorializzate delle loro funzioni di toolbox IP, dato che hanno messo il prezzo su quella cassetta degli attrezzi. Ma in ogni caso, dimenticando questi problemi, ecco le implementazioni.

    Sostituzione per im2col con opzione 'sliding'

    Non ero in grado di vettorializzare questo fino a quando non mi sono seduto per scrivere la soluzione ad un altro problema su Stackoverflow . Quindi, incoraggerei vivamente anche a esaminarlo.

     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; 

    Sostituzione per im2col con opzione '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; 

    Alcuni test rapidi mostrano che entrambe queste implementazioni, in particolare quella sliding per dati di input di dimensioni da piccole a decenti e distinct per tutti i dati, offrono prestazioni migliori rispetto alle implementazioni di funzioni MATLAB integrate in termini di prestazioni di runtime.

    Come usare

     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]) 

    Puoi imbrogliare mentre guardi al pacchetto di immagini GNU Octave. Ci sono im2col e col2im come linguaggio di script implementato:

    • im2col
    • col2im

    Per quanto vedo, differisce di più nel diverso stile di commento (# invece di%) e nello stile di stringa differente (“invece di”). Se si modifica questo e si rimuove il test di asserzione in basso, potrebbe essere già eseguibile. no, passa attraverso il debugger.

    Inoltre, sii consapevole della licenza (GPLv3). È gratuito, ma i tuoi cambiamenti devono essere gratuiti!