有效的实现`im2col`和`col2im`
在处理图像时,MATLAB的im2col
和col2im
对于MATLAB中的vector化非常重要。
然而他们需要MATLAB的image processing工具箱。
我的问题是,是否有一个有效的(Vectorzied)方法来实现使用MATLAB的function(没有工具箱)?
我需要sliding
和distinct
模式。
我不需要任何填充。
谢谢。
我只能希望Mathworks的人不要起诉你或我或Stackoverflow
,试图创build他们的IP工具箱function的vector化实现,因为他们已经把价格放在那个工具箱上。 但无论如何,忘记这些问题,这里是实现。
用'sliding'
选项replaceim2col
直到我坐下来解决Stackoverflow上的另一个问题时,我无法对此进行vector化。 所以,我也强烈鼓励对此进行研究。
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;
用'distinct'
选项replaceim2col
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;
一些快速testing显示,这两个实现特别是sliding
一个用于小到适当大小的input数据,并且在运行时性能方面,所有数据大小都不同于内置的MATLAB函数实现。
如何使用
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])
你可以在GNU Octave 图像包的时候作弊。 有im2col和col2im作为脚本语言实现:
- im2col
- col2im
据我所知,它在不同的评论风格(#而不是%)和不同的string风格(“而不是”)上有很大的不同,如果你改变它并删除底部的asserttesting,它可能已经可以运行。不是,用debugging器通过它。
此外,请注意许可证(GPLv3)。 它是免费的,但你的变化也必须是免费的!