簡體   English   中英

將 8 位值轉換為 4 位值並在 python 中的一個字節中保存 2 個 4 位值的快速且節能的方法

[英]fast and power efficient way to convert 8bit values to 4bit values and save 2 4bit values in one byte in python

我想在udp上制作一個視頻stream節目,用opencv,我想通過將255個顏色值轉換為16個顏色值來進行壓縮,因為它可以節省一半的流量而且質量也不錯。 我知道如何將 255 個值轉換為 16 個值:

opencvimg = numpy.multiply(opencvimg//16,16)

但我不知道將兩個值放入 1 個字節以節省流量的有效方法。 它必須高效,因為我希望它在 rpi 上運行(github.com/Open-ATS-Github 上的完整代碼)。

我想你的意思是:

import numpy as np

# Make synthetic data
x = np.arange(256, dtype=np.uint8)

# Take pairs of elements shifted by 4 bits and OR together
d2by4 = (x[::2] & 0xf0) | (x[1::2] >> 4)

In [16]: d2by4.dtype
Out[16]: dtype('uint8')

In [21]: d2by4
Out[21]: 
array([  0,   0,   0,   0,   0,   0,   0,   0,  17,  17,  17,  17,  17,
        17,  17,  17,  34,  34,  34,  34,  34,  34,  34,  34,  51,  51,
        51,  51,  51,  51,  51,  51,  68,  68,  68,  68,  68,  68,  68,
        68,  85,  85,  85,  85,  85,  85,  85,  85, 102, 102, 102, 102,
       102, 102, 102, 102, 119, 119, 119, 119, 119, 119, 119, 119, 136,
       136, 136, 136, 136, 136, 136, 136, 153, 153, 153, 153, 153, 153,
       153, 153, 170, 170, 170, 170, 170, 170, 170, 170, 187, 187, 187,
       187, 187, 187, 187, 187, 204, 204, 204, 204, 204, 204, 204, 204,
       221, 221, 221, 221, 221, 221, 221, 221, 238, 238, 238, 238, 238,
       238, 238, 238, 255, 255, 255, 255, 255, 255, 255, 255], dtype=uint8)

這就是說...... “從第一個開始取 x 的每個第二個元素的高半字節,並將它與從第二x開始的x的每個第二個元素的高半字節右移 4 位。”

有一個不涉及顯式算法的解決方案:您可以構建一個 256 x 256 條目的完整查找表,給出一對輸入字節的打包結果。

如果這樣的表格看起來大得不合理,請認為您正在處理更大的圖像。

使用平面向量還是使用矩陣更好,以及緩存效果是否會破壞工作效果是一個實驗問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM