numpy表示圖片詳解


我自己的一個體會,在學習機器學習和深度學習的過程里,包括閱讀模型源碼的過程里,一個比較大的阻礙是對numpy掌握的不熟,有的時候對矩陣的維度,矩陣中每個元素值的含義暈乎乎的.
本文就以一個2 x 2 x 3的三維矩陣為例,說明矩陣是如何表示圖像的.

3d array表示一個圖片.比如對ex = numpy.array([ [ [1, 2, 3], [4, 5, 6] ], [ [7, 8, 9], [0, 1, 2] ] ]),ex代表的維度是怎樣的?
其實類似於list of list.

  1. 先看最外層的list內有幾個list,可以看到有2個[],分別為[ [1, 2, 3], [4, 5, 6] ] 和 [ [7, 8, 9], [0, 1, 2] ],我們分別稱之為l1,l2 所以第一個維度是2
  2. 再看上述的l1,l2內有幾個list.以[ [1, 2, 3], [4, 5, 6] ]為例,有2個,分別為[1,2,3] 和 [4,5,6] 我們稱之為l3,l4 所以第二個維度是2
  3. 再看上述的l3,l4有幾個list.以[1,2,3]為例,可以看到已經不再有list了.內部是3個數.所以這是最后一個維度了,維度為3.

所以,我們現在就得出ex是一個2 X 2 X 3的矩陣.假設說它代表一副圖的話,代表的就是一個3通道的圖片,圖片尺寸為2 X 2.
即我們有4個像素點,第一個像素點的rgb值為(1,2,3) 第二個像素點rgb值為(4,5,6)..以此類推.

看一段對圖片做預處理的代碼.
在用opencv讀圖像時,是按bgr的順序讀的.

def prep_image(img, inp_dim):
    """
    Prepare image for inputting to the neural network. 
    
    Returns a Variable 
    """
    img = (letterbox_image(img, (inp_dim, inp_dim)))
    img = img[:,:,::-1].transpose((2,0,1)).copy()

重點看img = img[:,:,::-1].transpose((2,0,1)).copy().
::-1表示在這一維度做倒序.通過前面的分析知道第三個維度表示rgb,所以img[:,:,::-1]可以表示前兩個維度不變,第三個維度倒序,則此時bgr的表示變成了rgb. 此時矩陣代表的是h x w x c.我們想轉換成c x h x w. 原先的第0,1,2維度分別代表h,w,c. 則transpose((2,0,1))代表轉換成矩陣c x h x w.

結合下面測試代碼體會一下,看看每個元素此時表達什么含義.相信對用三維矩陣表達圖片應該不再有問題了.

import numpy
ex = numpy.array([ [ [1, 2, 3], [4, 5, 6] ], [ [7, 8, 9], [0, 1, 2] ] ])
#2 x 2 x 3

print(ex[0][0][0])
print(ex[0][0][1])
print(ex[0][0][2])

ex=ex[:,:,::-1]
print(ex)
print(ex[0][0][0])
print(ex[0][0][1])
print(ex[0][0][2])

print(ex.transpose((2,0,1)))

輸出如下:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM