首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用Python优化Bayer16 -> RGB

用Python优化Bayer16 -> RGB
EN

Stack Overflow用户
提问于 2016-09-01 23:16:08
回答 2查看 2.1K关注 0票数 0

我正在读取一个给我提供Bayer16格式(GRGB)的照相机,我用python编写了以下代码,将其从bayer16修改为bayer8,然后使用OpenCV将其转换为RGB:

代码语言:javascript
运行
复制
def _convert_GRGB_to_RGB(self, bayer16_image):
  bayer8_image = bytearray()
  # Convert bayer16 to bayer 8
  for i in range(0, len(bayer16_image), 2):
    data_byte = (bayer16_image[i] & 0xF0) >> 4
    data_byte |= (bayer16_image[i+1] & 0x0F) << 4
    bayer8_image.append(data_byte)
  bayer8_image = numpy.frombuffer(bayer8_image, dtype=numpy.uint8).reshape((720, 1280))
  # Use OpenCV to convert Bayer GRGB to RGB
  return cv2.cvtColor(bayer8_image, cv2.COLOR_BayerGR2RGB)

在做了一些计时之后,for循环占用了大部分的运行时间,并且效率极低(虽然我认为它没有分配任何空间,除非numpy为非常编辑做一个副本)。我想知道如何整体地改进这个函数,特别是for循环(因为它是这个函数中最慢的部分,按数量级计算)。

如果我要使用Bayer16,有谁有关于如何改进这个-> RGB转换的技巧和建议呢?

编辑:

我找到了一个使用numpy数组的解决方案,它使我的代码变得非常快:

代码语言:javascript
运行
复制
def _convert_GRGB_to_RGB(self, data_bytes):
  even = numpy.frombuffer(data_bytes[0::2], dtype=numpy.uint8)
  odd = numpy.frombuffer(data_bytes[1::2], dtype=numpy.uint8)
  # Convert bayer16 to bayer8
  even = numpy.right_shift(even, 4)
  odd = numpy.left_shift(odd, 4)
  bayer8_image = numpy.bitwise_or(even, odd).reshape((720, 1280))
  # Use OpenCV to convert Bayer GRGB to RGB
  return cv2.cvtColor(bayer8_image, cv2.COLOR_BayerGR2RGB)

这个解决方案满足了我的需要,但如果有人有任何建议,我很想听到他们!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-09-02 06:27:13

您可以在代码中使用标准的python操作符,也可以通过不对data_bytes切片(假设它是bytes而不是numpy数组)来加快速度。

代码语言:javascript
运行
复制
def _convert_GRGB_to_RGB(self, data_bytes):
    data_bytes = numpy.frombuffer(data_bytes, dtype=numpy.uint8)
    even = data_bytes[0::2]
    odd = data_bytes[1::2]
    # Convert bayer16 to bayer8
    bayer8_image = (even >> 4) | (odd << 4)
    bayer8_image = bayer8_image.reshape((720, 1280))
    # Use OpenCV to convert Bayer GRGB to RGB
    return cv2.cvtColor(bayer8_image, cv2.COLOR_BayerGR2RGB)
票数 0
EN

Stack Overflow用户

发布于 2016-09-02 09:05:52

据猜测,您的颜色问题如下-您的GRBG数据如下所示:

代码语言:javascript
运行
复制
G0 B1 G2 ...
R0 G1 R2

其中数字表示uint16索引。OpenCV需要给它们编号

代码语言:javascript
运行
复制
G0 B0 G1 R1 ...
R6 G6 R7 G7

您可以通过一些仔细的整形和转置来修复这个问题:

代码语言:javascript
运行
复制
data_bytes = np.frombuffer(data_bytes, dtype=np.uint8)
data = data.reshape(height / 2, width, 2) # a pair for each uint16
data = data.transpose((0, 2, 1))  #move the G/RB axis to be adjacent to the height axis
data = data.reshape(height, width)  # collapse it

示例

代码语言:javascript
运行
复制
# manually constructed by hand
sample = ''.join([
    'grbGgRbGgRbg'
    'grBGGRBGGRbg'
    'grBgGrBgGrbg'
])
width = height = 6
data = np.array(list(sample))

data = (data
    .reshape(height / 2, width, 2)
    .transpose((0, 2, 1))
    .reshape(height, width)
)

# easy way to view the output
>>> data.view((np.str_,6))
array([['gbgbgb'],
       ['rGRGRg'],
       ['gBGBGb'],
       ['rGRGRg'],
       ['gBGBGb'],
       ['rgrgrg']], 
      dtype='<U6')
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39282179

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档