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

一般来说:

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

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

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

测试代码:

  1. if __name__ == '__main__':
  2. mtx = np.around(np.random.rand(5, 5) * 100)
  3. print('原始矩阵:')
  4. print(mtx)
  5. a1 = im2col(mtx, (2, 3))
  6. print('im2col(分块大小2x3):')
  7. print(a1)
  8. b1 = col2im(a1, (5, 5), (2, 3))
  9. print('col2im复原:')
  10. print(b1)
  11. a2 = im2col(mtx, (3, 3))
  12. print('im2col(分块大小3x3):')
  13. print(a2)
  14. b2 = col2im(a2, (5, 5), (3, 3))
  15. print('col2im复原:')
  16. print(b2)

运行结果:

  1. 原始矩阵:
  2. [[ 48. 38. 38. 59. 38.]
  3. [ 38. 11. 25. 52. 44.]
  4. [ 60. 69. 49. 93. 66.]
  5. [ 88. 8. 47. 14. 47.]
  6. [ 96. 37. 56. 86. 54.]]
  7. im2col(分块大小2x3):
  8. [[ 48. 38. 60. 88. 38. 11. 69. 8. 38. 25. 49. 47.]
  9. [ 38. 60. 88. 96. 11. 69. 8. 37. 25. 49. 47. 56.]
  10. [ 38. 11. 69. 8. 38. 25. 49. 47. 59. 52. 93. 14.]
  11. [ 11. 69. 8. 37. 25. 49. 47. 56. 52. 93. 14. 86.]
  12. [ 38. 25. 49. 47. 59. 52. 93. 14. 38. 44. 66. 47.]
  13. [ 25. 49. 47. 56. 52. 93. 14. 86. 44. 66. 47. 54.]]
  14. col2im复原:
  15. [[ 48. 38. 38. 59. 38.]
  16. [ 38. 11. 25. 52. 44.]
  17. [ 60. 69. 49. 93. 66.]
  18. [ 88. 8. 47. 14. 47.]
  19. [ 96. 37. 56. 86. 54.]]
  20. im2col(分块大小3x3):
  21. [[ 48. 38. 60. 38. 11. 69. 38. 25. 49.]
  22. [ 38. 60. 88. 11. 69. 8. 25. 49. 47.]
  23. [ 60. 88. 96. 69. 8. 37. 49. 47. 56.]
  24. [ 38. 11. 69. 38. 25. 49. 59. 52. 93.]
  25. [ 11. 69. 8. 25. 49. 47. 52. 93. 14.]
  26. [ 69. 8. 37. 49. 47. 56. 93. 14. 86.]
  27. [ 38. 25. 49. 59. 52. 93. 38. 44. 66.]
  28. [ 25. 49. 47. 52. 93. 14. 44. 66. 47.]
  29. [ 49. 47. 56. 93. 14. 86. 66. 47. 54.]]
  30. col2im复原:
  31. [[ 48. 38. 38. 59. 38.]
  32. [ 38. 11. 25. 52. 44.]
  33. [ 60. 69. 49. 93. 66.]
  34. [ 88. 8. 47. 14. 47.]
  35. [ 96. 37. 56. 86. 54.]]

Python中如何实现im2col和col2im函数(sliding类型)的更多相关文章

  1. Python实现im2col和col2im函数

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

  2. 【python】dir(__builtins__)查看python中所用BIF(内置函数)

    dir(__builtins__)查看python中所用BIF(内置函数)

  3. python中lambda,map,reduce,filter,zip函数

    函数式编程 函数式编程(Functional Programming)或者函数程序设计,又称泛函编程,是一种编程范型,它将计算机运算视为数学上的函数计算,并且避免使用程序状态以及易变对象.简单来讲,函 ...

  4. 【转】Python 中map、reduce、filter函数

    转自:http://www.blogjava.net/vagasnail/articles/301140.html?opt=admin 介绍下Python 中 map,reduce,和filter 内 ...

  5. python中列表和字典常用方法和函数

    Python列表函数&方法 Python包含以下函数: 序号 函数 1 cmp(list1, list2)比较两个列表的元素 2 len(list)列表元素个数 3 max(list)返回列表 ...

  6. python中通过字符串名来调用函数

    强调:eval()函数功能虽然强大,但是也很危险,这个方法需要慎重使用. 利用python中的内置函数 eval() ,函数说明: def eval(*args, **kwargs): # real ...

  7. python中的文件读写(open()函数、with open('file_directory','r') as f:、read()函数等)

    python中也有文件读写,通过调用内置的读写函数.可以完成文件的打开/关闭.读.写入.追加等功能. open()函数 open()函数为python中的打开文件函数,使用方式为: f = open( ...

  8. python中的作用域以及内置函数globals()-全局变量、locals()-局部变量

    在python中,函数会创建一个自己的作用域,也称为为命名空间.这意味着在函数内部访问某个变量时,函数会优先在自己的命名空间中寻找. 通过内置函数globals()返回的是python解释器能知道的变 ...

  9. Python中几个必须知道的函数

    Python中自带了几个比较有意思的函数,一般在面试或者笔试基础的时候会问到,其中3个就是map.filter.reduce函数. 1.map(function, iterable) 它第一个要传的元 ...

随机推荐

  1. Android 面试题之编程

    1.排序 package cn.java.suanfa; public class SuanFa { public static void main(String[] args) { int[] ar ...

  2. VS Code 常用插件列表

    插件列表 Auto Close Tag 自动闭合HTML标签 Auto Rename Tag 修改HTML标签时,自动修改匹配的标签 Bookmarks 添加行书签 Can I Use HTML5.C ...

  3. 【星云测试】开发者测试(3)-采用精准测试工具对springcloud微服务应用进行穿透测试

    1.微服务简介 微服务英文名称Microservice,Microservice架构模式就是将整个Web应用组织为一系列小的Web服务.这些小的Web服务可以独立地编译及部署,并通过各自暴露的API接 ...

  4. C++练习 | 运算符重载练习(字符串相关)

    #include <iostream> #include <cmath> #include <cstring> #include <string> #i ...

  5. 19-3-7Python中小数据池、数据类型的补充、set集合

    一.小数据池(了解) “id”    获取内存地址 “==”  比较等号两端的值是否相等 “is”    身份运算:判断的是两个对象的内存地址是否相同. 代码块:一个文件就是一个代码块.(函数.类都是 ...

  6. MySQL学习【第十二篇事务中的锁与隔离级别】

    一.事务中的锁 1.啥是锁? 顾名思义,锁就是锁定的意思 2.锁的作用是什么? 在事务ACID的过程中,‘锁’和‘隔离级别’一起来实现‘I’隔离性的作用 3.锁的种类 共享锁:保证在多事务工作期间,数 ...

  7. MySQL高级函数case的使用技巧----与sum结合实现分段统计

    case 函数 CASE WHEN condition1 THEN result1 WHEN condition2 THEN result2 ... WHEN conditionN THEN resu ...

  8. Red Hat 7.5 Yum Replacement

    This system is not registered with an entitlement server. You can use subscription-manager to regist ...

  9. 结对编程总结by黄柏欣李斌

    在十一国庆期间(当然,还有国庆之前的几天),我们进行了一个结对编程的项目.对我受益良多,在伙伴面前发现自己的渺小,在知识面前,始终输给这浩瀚的海洋,及时发现了自己的不足,这次项目,对我来说就相当于一个 ...

  10. mybatis中SQL语句运用总结

    union 连接查询  连接两个表后会过滤掉重复的值 <resultMap id="BaseResultMap" type="com.sprucetec.pay.e ...