实现MATLAB的col2im'滑动'在Python中

时间:2017-02-26 21:30:55

标签: python matlab numpy

matlab中的

col2imim2col函数对于图像处理很重要,但是通过谷歌搜索没有有效的python实现。

特别是我想使用numpy为python重写 col2im

我有一个矩阵,我想将其重新排列成块。

我发现的实现通过测试它们是不可靠的,它没有给出与matlab相同的结果。

对于im2col,以下实现工作正常

def im2col_sliding(A, size):  
    dy, dx = size  
    xsz = A.shape[1] - dx + 1
    ysz = A.shape[0] - dy + 1
    R = np.empty((xsz * ysz, dx * dy))

    for i in xrange(ysz):  
        for j in xrange(xsz):  
            R[i * xsz + j, :] = A[i:i + dy, j:j + dx].ravel()
    return R  

但相关的col2im是假的!

假设我有一个isze size(V)= 1 69169的矩阵V. 通过在matlab中运行:

X = col2im(V, [3 3], [265 265], 'sliding'); 

它给我的尺寸(X)是263 263

但是,在我为im2col发布的代码相关的python实现中,返回 size(263 2)而不是(263 263)的ndarray,并且值不正确

任何帮助

1 个答案:

答案 0 :(得分:4)

对于im2col 'sliding'版本,我们已经发布了here的高效实施。

对于col2im 'sliding'版本,它只是重塑 -

def col2im_sliding(B, block_size, image_size):
    m,n = block_size
    mm,nn = image_size
    return B.reshape(nn-n+1,mm-m+1).T 
      # Or simply B.reshape(nn-n+1,-1).T
      # Or B.reshape(mm-m+1,nn-n+1,order='F')

测试运行

MATLAB运行 -

>> arr = 1:15;
>> arr
arr =
     1   2   3   4   5   6   7   8   9  10  11  12  13  14  15
>> col2im(arr, [3,3], [7,5],'sliding')
ans =                
     1     6    11  %// (7-3+1, 5-3+1) shaped array
     2     7    12
     3     8    13
     4     9    14
     5    10    15

NumPy / Python运行 -

In [116]: arr
Out[116]: array([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15])

In [117]: col2im_sliding(arr, [3,3], [7,5])
Out[117]: 
array([[ 1,  6, 11],  # (7-3+1, 5-3+1) shaped array
       [ 2,  7, 12],
       [ 3,  8, 13],
       [ 4,  9, 14],
       [ 5, 10, 15]])