Zaw*_*Lin 2 python 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)
Run Code Online (Sandbox Code Playgroud)
从文档:
函数 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
Run Code Online (Sandbox Code Playgroud)
你会得到类似的东西:
float64
int32
int32
Run Code Online (Sandbox Code Playgroud)
所以你的第二种情况除以 256,它是整数除法,它四舍五入为 0。试试
vfunc = np.vectorize(self.func,otypes=[np.uint8])
Run Code Online (Sandbox Code Playgroud)
并且您可能还想考虑将第一个数组替换为
arr = np.zeros((25,25), dtype='uint8')
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2011 次 |
| 最近记录: |