博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python中如何实现im2col和col2im函数(sliding类型)
阅读量:7090 次
发布时间:2019-06-28

本文共 3076 字,大约阅读时间需要 10 分钟。

今天来说说im2col和col2im函数,这是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 resultdef 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.]]

转载于:https://www.cnblogs.com/theonegis/p/7648721.html

你可能感兴趣的文章
AV1挑起的Codec之战
查看>>
虚拟环境的配置
查看>>
.NET快速信息化系统开发框架 V3.2-Web版本“产品管理”事例编辑界面新增KindEditor复文本编辑控件...
查看>>
浅谈直播行业发展前景和发展方向
查看>>
2- OpenCV+TensorFlow 入门人工智能图像处理-opencv入门
查看>>
java.lang.Integer源码精读(一)
查看>>
Flink1.4 窗口触发器与Evictors
查看>>
几个与文本处理相关的Linux命令总结
查看>>
django模板详解(二)
查看>>
ASM概述
查看>>
手动删除数据库 oracle
查看>>
浅析ConcurrentHashMap
查看>>
html中header结构详解
查看>>
日常使用
查看>>
jQuery实现还能输入N字符
查看>>
su命令
查看>>
使用Wisdom RESTClient进行自动化测试,如何取消对返回的body内容的校验?对排除的JSON属性字段不做校验?...
查看>>
python开源项目及示例代码
查看>>
MySQL集群简介与配置详解
查看>>
linux命令:grub 文件详解及grub修复,系统常见故障修复
查看>>