Python實現im2col和col2im函式
今天來說說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函式
今天來說說im2col和col2im函式,這是MATLAB中兩個內建函式,經常用於數字影象處理中。其中im2col函式在《MATLAB中的im2col函式》一文中已經進行了簡單的介紹。 一般來說: 如是將影象分割成塊的時候用的im2col引數為'distinct',那麼用col2im函式時引數也是'dist
劍指offer66題--Java實現,c++實現和python實現 20.包含min函式的棧
題目描述 定義棧的資料結構,請在該型別中實現一個能夠得到棧中所含最小元素的min函式(時間複雜度應為O(1))。 C++ class Solution { public: void push(int value) { datestack.push(value);
python實現棧和隊列
隊列 tac class sta python實現 body ret none != class Node:#節點類 next = None#節點指針指向下一個 def __init__(self,data): self.data=data----
python實現城市和省份字典(根據城市判斷屬於哪個省份)
lam ret pandas csv style .data 一份 輸出 以及 首先,在網上拿到一份數據,省份和城市的對應表: 第一張圖是省份以及對應的ID 第二張圖是省份和城市,以及分別對應的ID 基本的思路是:實現一個字典,省份作為鍵,省份包含的城市作為
解釋python中join()和split()函式
join能讓我們將指定字元新增至字串中 a=','.join('123456') print(a) print(type(a)) #1,2,3,4,5,6 #<class 'str'> split()能讓我們用指定字元分割字串 a='1,2,3,4
用Python實現stack和queue
棧的實現 class Stack(object): """棧""" def __init__(self): self.__list = [] def push(self, item): """新增一個新的元素item到棧頂"""
Python實現Windows和Linux之間互相傳輸檔案(資料夾)的方法
專案中需要從Windows系統傳輸ISO檔案到Linux測試系統,然後再Linux測試系統裡安裝這個ISO檔案。所以就需要實現如何把檔案從Windows系統傳輸到Linux系統中。 在專案中使用了pscp.exe這個工具,只要按照pscp.exe的使用說明操作即可。只要進入pscp.exe的安裝位置
python中sort和sorted函式小結
L.sort(cmp=None, key=None, reverse=False) sorted(iterable, cmp=None, key=None, reverse=False) 這樣看,sorted函式只比sort函式多一個iterable引數,其餘沒什麼不同,it
python實現lower_bound和upper_bound
由於對於二分法一直都不是很熟悉,這裡就用C++中的lower_bound和upper_bound練練手。這裡用python實現 lower_bound和upper_bound本質上用的就是二分法,lower_bound查詢有序陣列的第一個小於等於目標數的,upper_bound查詢有序陣列第一個大於等於目標
python列表練習-用python實現棧和佇列
1.棧的工作原理:先進後出 入棧 出棧 棧頂元素 棧的長度 棧是否為空 stack = [] info = """ 棧操作 1.入棧 2.出棧 3.棧頂元素 4.棧的長度 5.棧是否為空 """ while True:
Python裝飾器和偏函式
裝飾器概念 裝飾器是一個閉包,即輸入一個函式型別的引數並返回一個替代的函式。可以用於拓展原來函式功能,使用python裝飾器的好處就是在不用更改原函式的程式碼前提下給函式增加新的功能。 格式 def outer(func): def inner(*args, *
python實現徑向基核函式
1、生成資料集(雙月資料集) class moon_data_class(object): def __init__(self,N,d,r,w): self.N=N self.w=w self.d=d
Python常用關鍵字和常用函式總結(不定期更新)
1.print('') #可以直接列印字串&列表裡的所有資料,python2.x中print “” 無需加括號 2.轉換字串:str() #將字元轉義成字串 3.字串: (1)string.title() #將字串轉義成標題(單詞首字母大寫) (2)字
Python實現RGB和Lab顏色空間互轉
在網上找了一圈,只找到C++版本的,有個python版本的只有RGB轉Lab,只好自己寫了。C++版本傳送門,這裡把原理已經寫的很清楚了,我只是比葫蘆畫瓢的寫個python版本,沒做任何優化。只有一點需要小心,opencv讀取的影象格式是[b,g,r],剩下的就
51微控制器實現scanf和printf函式
最開始學習C語言時,使用printf和scanf進行格式化輸入輸出十分方便。 學習微控制器有很長時間了,之前要再螢幕上顯示一個變數或者通過串列埠傳出一些變數值觀測的話,需要進行一系列的取餘取整運算,很是麻煩。 最近又研究了一下keil中針對printf和scanf的實現機理,做了一些改動,實現了標準格式化輸
python實現並繪製 sigmoid函式,tanh函式,ReLU函式,PReLU函式
python實現並繪製 sigmoid函式,tanh函式,ReLU函式,PReLU函式 # -*- coding:utf-8 -*- from matplotlib import pyplot as plt import numpy as np import mpl_toolkits.axisartist
python實現列表排序sort函式,要求支援任意型別元素的排序,也支援降序
def list_sort(lt, key=None, reverse=True): a = len(lt) for i in range(a-1): for j in range(a-1-i): if key:
python學習--max和reduce函式
問題: 我有這樣的一個列表: 1 ['a.b.c.d11u.e.f.g', 'e.f88.g', 'caa3.z.brr', 'z.48.ff.ee'] 需要找節點最多的一個(節點間由.分割) 看似簡單的工作,要用 Pythonic 的方法來做,還是
python實現插入和氣泡排序
開始學習python,看到函式一章,練習之餘,寫了兩個排序小函式 def select_sort(n): for i in range(len(n)): for j in
Python中range和xrange函式的異同
range 函式說明:range([start,] stop[, step]),根據start與stop指定的範圍以及step設定的步長,生成一個序列。range示例: >>> range(5)[0,1,2,3,4]>>> ran