亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Numpy 將 uint16 解包為 1-5-5-5 位塊

Numpy 將 uint16 解包為 1-5-5-5 位塊

哆啦的時光機 2023-03-30 10:06:33
我正在嘗試使用 numpy 將二進制字符串轉換為 Python 中的圖像,但我很難找到一種使用非常規位分布處理它的好方法(據我所知)。這些是如何轉換以及轉換什么的細節。16 位紋理圖塊 (256*256)。每個 bitu16 代表一個像素,其顏色的形式為 ARGB,MSB-to-LSB: 1 位透明度5 位紅色通道 5 位綠色通道 5 位藍色通道Numpy 并不真正支持任何 1 位或 5 位的東西。我嘗試使用不同的 argb 通道設置 np.dtype 但沒有任何運氣。unpackbits 似乎不適用于 uint16 所以在那種情況下我可能不得不將它分成 2 個 uint8dt = np.dtype([('a', np.bool_), ('r', np.half), ('g', np.half), ('b', np.half)])data = data.read(131072)dataFromBuffer = np.frombuffer(data, dtype=dt)img  = dataFromBuffer.reshape(256, 256)
查看完整描述

2 回答

?
米琪卡哇伊

TA貢獻1998條經驗 獲得超6個贊

在這種情況下,您對缺乏 bit numpy 位級別支持是正確的??梢园慈缦路绞教幚砦坏母呒墸ǖδ埽┓椒ǎ?/p>


image_16_bit = 123 # A 16bit integer.


bits = '{:016b}'.format(image_16_bit) 


transparency = int(bits[0], 2)

red_channel = int(bits[1:6], 2)

green_channel = int(bits[6:11], 2)

blue_channel = int(bits[11:], 2)


print(transparency, red_channel, green_channel, blue_channel) # 0 0 3 27

您可以對所有整數運行此操作,然后收集各個通道值。最后,您可以將其轉換為一個 numpy 數組,以將您的圖像作為一個 numpy 數組。


查看完整回答
反對 回復 2023-03-30
?
幕布斯7119047

TA貢獻1794條經驗 獲得超8個贊

以下是如何使您的方法奏效:


# make small example

x = np.random.randint(0,1<<16,size=(5,5),dtype=np.uint16)


# set up dtype

dt = np.dtype([*zip('argb',(bool,*3*(np.uint8,)))])


# bit of bit twiddling


def unpack_argb(x):

    out = np.empty(x.shape,dt)

    for i,ch in enumerate(reversed('argb')):

        out[ch] = (x>>(5*i))&31

    return out


def pack_argb(x):

    out = x['a'].astype(np.uint16)

    for ch in 'rgb':

        out <<= 5

        out += x[ch]&31

    return out


# check round trip

np.all(x == pack_argb(unpack_argb(x)))

# True

更新:


def argb16_to_rgba32(x):

    out = np.empty(x.shape+(4,),np.uint8)

    out[...,3] = (x>>8)&0x80

    out[...,0] = (x>>7)&0xf8

    out[...,1] = (x>>2)&0xf8

    out[...,2] = (x<<3)&0xf8

    return out


def rgba32_to_argb16(x):

    x16 = x.astype(np.uint16)&0xf8

    out = (x16[...,3]&0x80)<<8

    out += x16[...,0]<<7

    out += x16[...,1]<<2

    out += x16[...,2]>>3

    return out


查看完整回答
反對 回復 2023-03-30
  • 2 回答
  • 0 關注
  • 235 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號