gol*_*enk 6 python arrays opencv tuples numpy
我试图找到一种有效的方法,从元组(每4个条目对应一个像素的R,G,B,alpha)转换为NumPy数组(用于OpenCV).
更具体地说,我使用pywin32来获取窗口的客户区位图.这以元组的形式返回,其中前四个元素属于第一个像素的RGB-alpha通道,然后是第二个像素的下四个,依此类推.元组本身只包含整数数据(即它不包含任何维度,但我确实有这些信息).从这个元组我想创建NumPy 3D数组(宽x高x通道).目前,我只是创建一个零数组,然后遍历元组中的每个条目并将其放入NumPy数组中.我正在使用下面的代码执行此操作.而且我希望有一种更有效的方法可以做到这一点,我只是没想到.有什么建议?非常感谢!
码:
bitmapBits = dataBitmap.GetBitmapBits(False) #Gets the tuple.
clientImage = numpy.zeros((height, width, 4), numpy.uint8)
iter_channel = 0
iter_x = 0
iter_y = 0
for bit in bitmapBits:
clientImage[iter_y, iter_x, iter_channel] = bit
iter_channel += 1
if iter_channel == 4:
iter_channel = 0
iter_x += 1
if iter_x == width:
iter_x = 0
iter_y += 1
if iter_y == height:
iter_y = 0
Run Code Online (Sandbox Code Playgroud)
与上面的Bill类似,但可能更快:
clientImage = np.asarray(bitmapBits, dtype=np.uint8).reshape(height, width, 4)
Run Code Online (Sandbox Code Playgroud)
array根据文档:"一个数组,任何暴露数组接口的对象,一个__array__方法返回数组的对象,或任何(嵌套)序列."
asarray还需要做一些事情:"以任何可以转换为数组的形式输入数据.这包括列表,元组列表,元组,元组元组,列表元组和ndarray." 它直接需要元组:)
为什么不做一些像
import numpy as np
clientImage = np.array(list(bitmapBits), np.uint8).reshape(height, width, 4)
Run Code Online (Sandbox Code Playgroud)
例如,('Ri', 'Gi', 'Bi', 'ai')设为与像素对应的颜色元组i.如果你有这些的大元组,你可以这样做:
In [9]: x = ['R1', 'G1', 'B1', 'a1', 'R2', 'G2', 'B2', 'a2', 'R3', 'G3', 'B3', 'a3', 'R4', 'G4', 'B4', 'a4']
In [10]: np.array(x).reshape(2, 2, 4)
Out[10]:
array([[['R1', 'G1', 'B1', 'a1'],
['R2', 'G2', 'B2', 'a2']],
[['R3', 'G3', 'B3', 'a3'],
['R4', 'G4', 'B4', 'a4']]],
dtype='|S2')
Run Code Online (Sandbox Code Playgroud)
每片[:,:,i]为i in [0,4)给你的每个通道:
In [15]: np.array(x).reshape(2, 2, 4)[:,:,0]
Out[15]:
array([['R1', 'R2'],
['R3', 'R4']],
dtype='|S2')
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8048 次 |
| 最近记录: |