Opencv显示黑色图像后numpy矢量化



我试图使用np的矢量化,但imshow显示黑色图像,如果我正确理解矢量化,它应该是白色的。我认为问题是输出类型,但我不能让它工作。

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)

From the 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')

相关内容

  • 没有找到相关文章

最新更新