【问题标题】:opencv show black image after numpy vectorizenumpy矢量化后opencv显示黑色图像
【发布时间】:2013-01-08 21:04:51
【问题描述】:

我正在尝试使用 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)

【问题讨论】:

  • 附带说明,您无需展平(重塑)数组即可使用矢量化。例如这工作vectorize(lambda x : x + 1)([[1, 2], [3, 4]]) == array([[2, 3], [4, 5]])
  • 哇!你说的对!这非常有用。谢谢

标签: python opencv numpy


【解决方案1】:

来自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')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-06
    • 2020-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多