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[] - block_size[] + sy = mtx_shape[] - block_size[] + # 如果设A为m×n的,对于[p q]的块划分,最后矩阵的行数为p×q,列数为(m−p+1)×(n−q+1)。 result = np.empty((block_size[] * block_size[], sx * sy)) # 沿着行移动,所以先保持列(i)不动,沿着行(j)走 for i in range(sy): for j in range(sx): result[:, i * sx + j] = mtx[j:j + block_size[], i:i + block_size[]].ravel(order='F') return result def col2im(mtx, image_size, block_size): p, q = block_size sx = image_size[] - p + sy = image_size[] - q + result = np.zeros(image_size) weight = np.zeros(image_size) # weight记录每个单元格的数字重复加了多少遍 col = # 沿着行移动,所以先保持列(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 += 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.]]
相关推荐
Canethui 2020-03-08
wanff0 2020-08-19
cuiguanjun 2020-07-26
Canethui 2020-05-31
Canethui 2020-05-30
cuiguanjun 2020-05-14
xiaoxue 2020-05-09
wanff0 2020-05-04
cuiguanjun 2020-04-08
cuiguanjun 2020-03-01
知识小屋 2019-12-19
GerwelsJI 2019-12-19
xiaoxue 2019-10-21
booksyhay 2019-09-08
wwwdownmacom 2011-08-26
tangjikede 2019-01-06
nogi 2018-11-04
bohu0 2012-04-16