Python中如何实现im2col和col2im函数(sliding类型)
今天来说说im2col和col2im函数,这是MATLAB中两个内置函数,经常用于数字图像处理中。其中im2col函数在《MATLAB中的im2col函数》一文中已经进行了简单的介绍。
一般来说:
- 如是将图像分割成块的时候用的im2col参数为'distinct',那么用col2im函数时参数也是'distinct',即可将转换后的数组复原。
- 如果将图像分割成块的时候用的im2col参数为'sliding',我目前还不知道MATLAB中使用内置函数是如何复原的。
今天,来看看Python中是如何实现这两个函数的(sliding类型)。
- 对于im2col的实现,我们沿着原始矩阵逐行计算,将得到的新的子矩阵展开成列,放置在列块矩阵中。
- 对于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.]]
Python中如何实现im2col和col2im函数(sliding类型)的更多相关文章
- Python实现im2col和col2im函数
今天来说说im2col和col2im函数,这是MATLAB中两个内置函数,经常用于数字图像处理中.其中im2col函数在<MATLAB中的im2col函数>一文中已经进行了简单的介绍. 一 ...
- 【python】dir(__builtins__)查看python中所用BIF(内置函数)
dir(__builtins__)查看python中所用BIF(内置函数)
- python中lambda,map,reduce,filter,zip函数
函数式编程 函数式编程(Functional Programming)或者函数程序设计,又称泛函编程,是一种编程范型,它将计算机运算视为数学上的函数计算,并且避免使用程序状态以及易变对象.简单来讲,函 ...
- 【转】Python 中map、reduce、filter函数
转自:http://www.blogjava.net/vagasnail/articles/301140.html?opt=admin 介绍下Python 中 map,reduce,和filter 内 ...
- python中列表和字典常用方法和函数
Python列表函数&方法 Python包含以下函数: 序号 函数 1 cmp(list1, list2)比较两个列表的元素 2 len(list)列表元素个数 3 max(list)返回列表 ...
- python中通过字符串名来调用函数
强调:eval()函数功能虽然强大,但是也很危险,这个方法需要慎重使用. 利用python中的内置函数 eval() ,函数说明: def eval(*args, **kwargs): # real ...
- python中的文件读写(open()函数、with open('file_directory','r') as f:、read()函数等)
python中也有文件读写,通过调用内置的读写函数.可以完成文件的打开/关闭.读.写入.追加等功能. open()函数 open()函数为python中的打开文件函数,使用方式为: f = open( ...
- python中的作用域以及内置函数globals()-全局变量、locals()-局部变量
在python中,函数会创建一个自己的作用域,也称为为命名空间.这意味着在函数内部访问某个变量时,函数会优先在自己的命名空间中寻找. 通过内置函数globals()返回的是python解释器能知道的变 ...
- Python中几个必须知道的函数
Python中自带了几个比较有意思的函数,一般在面试或者笔试基础的时候会问到,其中3个就是map.filter.reduce函数. 1.map(function, iterable) 它第一个要传的元 ...
随机推荐
- 使用Fiddler监控来自手机客户端的请求
环境配置组成: 1 手机 2 安装Fiddler的PC 设置要点: 1 手机和PC应在同一个局域网内 我的做法是:PC安装WIFI热点,手机连接热点上网 PC的IP是192.168.95.1 手机的 ...
- 【星云测试】开发者测试(3)-采用精准测试工具对springcloud微服务应用进行穿透测试
1.微服务简介 微服务英文名称Microservice,Microservice架构模式就是将整个Web应用组织为一系列小的Web服务.这些小的Web服务可以独立地编译及部署,并通过各自暴露的API接 ...
- alter修改表
alter修改表的基础语句,语法如下: ALTER TABLE table_name ADD column_name|MODIFY column_name| DROP COLUMN column_na ...
- 手机版的百度map封装,使用gps定位
代码如下,包自己引 包参考 一个百度MAP导航的基础封装 使用的是浏览器调用gps定位 修改了标注的大小 效果如图: 代码...... <!DOCTYPE html> <html&g ...
- linux系统基础之--目录结构(基于centos7.4 1708)
- 第五章 C程序结构
一.数值类型 1.实数常量的表示:3.5(双精度),3.5f(单精度),3.5L(长双精度) 2.整数常量:char字符常量(‘a’,‘b’,‘0’)当做一个整型常量参加运算 3.数字字符与英文字母字 ...
- Delphi Android USB Interface with the G2
来源:http://www.bverhue.nl/g2dev/?p=65 Delphi Android USB Interface with the G2 Leave a reply I first ...
- 网站sql注入漏洞修复方案之metinfo 6.1.0系列
近日,我们SINE安全对metinfo进行网站安全检测发现,metinfo米拓建站系统存在高危的sql注入漏洞,攻击者可以利用该漏洞对网站的代码进行sql注入攻击,伪造恶意的sql非法语句,对网站的数 ...
- 20155323 2016-2017-2 《Java程序设计》第4周学习总结
20155323 2016-2017-2 <Java程序设计>第4周学习总结 教材学习内容总结 继承的目的:继承是为了多态,能够采用父类引用指向子类对象,这样可以让代码更灵活.继承之后可以 ...
- 20155332 实验二 Java面向对象程序设计
目录 一.单元测试和TDD 任务一:实现百分制成绩转成"优.良.中.及格.不及格"五级制成绩的功能 任务二:以TDD的方式研究学习StringBuffer 二.面向对象三要素:封装 ...