首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >“im2ol”和“col2im”的有效实现

“im2ol”和“col2im”的有效实现
EN

Stack Overflow用户
提问于 2014-08-22 14:23:37
回答 2查看 8K关注 0票数 9

在处理图像时,MATLAB的im2colcol2im是实现图像矢量化的重要功能。

然而,他们需要MATLAB的图像处理工具箱。

我的问题是,是否有一种高效(Vectorzied)方法来实现使用MATLAB的函数(没有工具箱)?

我需要slidingdistinct模式。

我不需要填充物。

谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-08-22 19:59:19

我只能希望Mathworks的人不要因为这个问题起诉你、我或Stackoverflow,而是试图创建他们的IP工具箱函数的矢量化实现,因为他们已经对这个工具箱进行了定价。但是无论如何,忘记这些问题,这里是实现。

im2col 'sliding' 选项替换

直到我坐下来编写关于堆栈溢出的另一个问题的解决,我才能将它矢量化。因此,我强烈鼓励也研究这一问题。

代码语言:javascript
复制
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;

im2col 'distinct' 选项替换

代码语言:javascript
复制
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;

一些快速测试表明,在运行时性能方面,这两种实现--特别是用于小到适当大小的输入数据的sliding实现和所有数据的distinct实现--在运行时性能方面都远远优于内置的MATLAB函数实现。

如何使用

代码语言:javascript
复制
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])
票数 18
EN

Stack Overflow用户

发布于 2014-08-22 15:56:12

您可以在查看GNU 图像包时作弊。有im2col和col2im作为脚本语言实现:

  • im2col
  • col2im

据我所见,它在不同的注释样式(#而不是%)和不同的字符串样式(“而不是')中差别最大。如果您更改了它并删除底部的断言测试,它可能已经可以运行。如果没有,请与调试器一起检查它。

此外,要注意许可证(GPLv3)。这是免费的,但你的变化也必须是免费的!

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25449279

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档