zoukankan      html  css  js  c++  java
  • Python实现im2col和col2im函数

    今天来说说im2col和col2im函数,这是MATLAB中两个内置函数,经常用于数字图像处理中。其中im2col函数在《MATLAB中的im2col函数》一文中已经进行了简单的介绍。

    一般来说:

    1. 如是将图像分割成块的时候用的im2col参数为'distinct',那么用col2im函数时参数也是'distinct',即可将转换后的数组复原。
    2. 如果将图像分割成块的时候用的im2col参数为'sliding',我目前还不知道MATLAB中使用内置函数是如何复原的。

    今天,来看看Python中是如何实现这两个函数的(sliding类型)。

    1. 对于im2col的实现,我们沿着原始矩阵逐行计算,将得到的新的子矩阵展开成列,放置在列块矩阵中。
    2. 对于col2im的实现,我们沿着列块矩阵逐行计算,将得到的行展成子矩阵,然后将子矩阵放置在最终结果对应的位置(每次当前值进行相加),同时记录每个位置的值放置的次数。最后,将当前位置的值除以放置的次数,即可得到结果(原始矩阵)。
    def im2col(mtx, block_size):
        mtx_shape = mtx.shape
        sx = mtx_shape[0] - block_size[0] + 1
        sy = mtx_shape[1] - block_size[1] + 1
        # 如果设A为m×n的,对于[p q]的块划分,最后矩阵的行数为p×q,列数为(m−p+1)×(n−q+1)。
        result = np.empty((block_size[0] * block_size[1], sx * sy))
        # 沿着行移动,所以先保持列(i)不动,沿着行(j)走
        for i in range(sy):
            for j in range(sx):
                result[:, i * sx + j] = mtx[j:j + block_size[0], i:i + block_size[1]].ravel(order='F')
        return result
    
    
    def col2im(mtx, image_size, block_size):
        p, q = block_size
        sx = image_size[0] - p + 1
        sy = image_size[1] - q + 1
        result = np.zeros(image_size)
        weight = np.zeros(image_size)  # weight记录每个单元格的数字重复加了多少遍
        col = 0
        # 沿着行移动,所以先保持列(i)不动,沿着行(j)走
        for i in range(sy):
            for j in range(sx):
                result[j:j + p, i:i + q] += mtx[:, col].reshape(block_size, order='F')
                weight[j:j + p, i:i + q] += np.ones(block_size)
                col += 1
        return result / weight

    测试代码:

    if __name__ == '__main__':
        mtx = np.around(np.random.rand(5, 5) * 100)
        print('原始矩阵:')
        print(mtx)
    
        a1 = im2col(mtx, (2, 3))
        print('im2col(分块大小2x3):')
        print(a1)
        b1 = col2im(a1, (5, 5), (2, 3))
        print('col2im复原:')
        print(b1)
    
        a2 = im2col(mtx, (3, 3))
        print('im2col(分块大小3x3):')
        print(a2)
        b2 = col2im(a2, (5, 5), (3, 3))
        print('col2im复原:')
        print(b2)

    运行结果:

    原始矩阵:
    [[ 48.  38.  38.  59.  38.]
     [ 38.  11.  25.  52.  44.]
     [ 60.  69.  49.  93.  66.]
     [ 88.   8.  47.  14.  47.]
     [ 96.  37.  56.  86.  54.]]
    im2col(分块大小2x3):
    [[ 48.  38.  60.  88.  38.  11.  69.   8.  38.  25.  49.  47.]
     [ 38.  60.  88.  96.  11.  69.   8.  37.  25.  49.  47.  56.]
     [ 38.  11.  69.   8.  38.  25.  49.  47.  59.  52.  93.  14.]
     [ 11.  69.   8.  37.  25.  49.  47.  56.  52.  93.  14.  86.]
     [ 38.  25.  49.  47.  59.  52.  93.  14.  38.  44.  66.  47.]
     [ 25.  49.  47.  56.  52.  93.  14.  86.  44.  66.  47.  54.]]
    col2im复原:
    [[ 48.  38.  38.  59.  38.]
     [ 38.  11.  25.  52.  44.]
     [ 60.  69.  49.  93.  66.]
     [ 88.   8.  47.  14.  47.]
     [ 96.  37.  56.  86.  54.]]
    im2col(分块大小3x3):
    [[ 48.  38.  60.  38.  11.  69.  38.  25.  49.]
     [ 38.  60.  88.  11.  69.   8.  25.  49.  47.]
     [ 60.  88.  96.  69.   8.  37.  49.  47.  56.]
     [ 38.  11.  69.  38.  25.  49.  59.  52.  93.]
     [ 11.  69.   8.  25.  49.  47.  52.  93.  14.]
     [ 69.   8.  37.  49.  47.  56.  93.  14.  86.]
     [ 38.  25.  49.  59.  52.  93.  38.  44.  66.]
     [ 25.  49.  47.  52.  93.  14.  44.  66.  47.]
     [ 49.  47.  56.  93.  14.  86.  66.  47.  54.]]
    col2im复原:
    [[ 48.  38.  38.  59.  38.]
     [ 38.  11.  25.  52.  44.]
     [ 60.  69.  49.  93.  66.]
     [ 88.   8.  47.  14.  47.]
     [ 96.  37.  56.  86.  54.]]

  • 相关阅读:
    [置顶] app后端设计--总目录
    Centos6.5 nginx+nginx-rtmp配置流媒体服务器
    利用nginx搭建RTMP视频点播、直播、HLS服务器
    如约而至:微信自用的移动端IM网络层跨平台组件库Mars已正式开源
    使用pngquant命令近乎无损压缩PNG图片大小减少70%左右
    字符型图片验证码识别完整过程及Python实现
    python PIL Image模块
    app后端设计(12)--图片的处理
    linux 下如何抓取HTTP流量包(httpry)
    EHcache缓存框架详解
  • 原文地址:https://www.cnblogs.com/hdk1993/p/8893944.html
Copyright © 2011-2022 走看看