2013-01-08 46 views
1

我正在嘗試使用np的向量大小,但是imshow正在顯示黑色圖像,如果我正確理解向量化,它應該是白色。我認爲問題是輸出類型,但我不能讓它工作。opencv在numpy之後顯示黑色圖像vectorize

import numpy as np 
import cv2 
class Test(): 
    def run(self):   
     arr = np.zeros((25,25)) 
     arr[:]=255 
     cv2.imshow('white',arr) 
     flatarr = np.reshape(arr,25*25) 
     vfunc = np.vectorize(self.func) 
     #vfunc = np.vectorize(self.func,otypes=[np.int])#same effect 
     flatres = vfunc(flatarr) 
     shouldbewhite = np.reshape(flatres,(25,25)) 
     cv2.imshow('shouldbewhite',shouldbewhite)   
    def func(self,a): 
     return 255 
cv2.namedWindow('white',0) 
cv2.namedWindow('shouldbewhite',0) 
a = Test() 
a.run() 
cv2.waitKey(0) 
+0

更換第一陣列作爲一個側面說明,你不需要壓扁(重塑)的陣列中使用的量化。例如,這個工作原理是:vectorize(lambda x:x + 1)([[1,2],[3,4]])== array([[2,3],[4,5]]) –

+0

哇!你是對的!這非常有用。謝謝 –

回答

4

docs

imshow顯示指定窗口中的圖像的功能。如果 窗口是使用CV_WINDOW_AUTOSIZE標誌創建的,則圖像將以其原始大小顯示爲 。否則,圖像將被縮放以適合窗口的 。該功能可以根據圖像的深度縮放圖像:

  • 如果圖像是8位無符號,則按原樣顯示。
  • 如果圖像是16位無符號或32位整數,則將像素除以256.也就是說,將值範圍[0,255 * 256]映射到[0,255]。
  • 如果圖像是32位浮點,像素值乘以255. 是,值範圍[0,1]被映射到[0,255]。

如果您運行下面的代碼:

class Test(): 
    def run(self):   
     arr = np.zeros((25,25)) 
     arr[:]=255 
     print arr.dtype 
     flatarr = np.reshape(arr,25*25) 
     vfunc = np.vectorize(self.func) 
     flatres = vfunc(flatarr) 
     print flatres.dtype 
     shouldbewhite = np.reshape(flatres,(25,25)) 
     print shouldbewhite.dtype 
    def func(self,a): 
     return 255 

你會得到這樣的:

float64 
int32 
int32 

所以你的第二個案例是除以256,它是整數除法,它舍入爲0.試用

vfunc = np.vectorize(self.func,otypes=[np.uint8]) 

,你可能還需要考慮與

arr = np.zeros((25,25), dtype='uint8') 
+0

謝謝!它正在工作 –