2

npのvectorizeを使用しようとしていますが、imshowは、vectorizeを正しく理解していれば、白いはずの黒い画像を表示しています。問題はoutputtypeだと思いますが、動作させることができません。

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)
4

1 に答える 1

5

ドキュメントから:

関数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

したがって、2番目のケースは256で除算され、整数除算であるため、0に丸められます。試してみてください

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

また、最初の配列を次のように置き換えることを検討することもできます。

arr = np.zeros((25,25), dtype='uint8')
于 2013-01-08T21:33:50.957 に答える