[英]Optimizing Bayer16 -> RGB in Python
我正在阅读一台给我Bayer16格式(GRGB)的照相机,我在python中编写了以下代码,将其从bayer16修改为bayer8,然后使用OpenCV将其转换为RGB:
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循环(因为它是此功能中最慢的部分,数量级高)。
如果我要使用Python,是否有人有关于如何改善Bayer16-> RGB转换的提示和建议?
编辑:
我找到了一个使用numpy数组的解决方案,该解决方案使我的代码变得非常快:
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)
这个解决方案可以满足我的需求,但是如果有人有任何建议,我很想听到他们的建议!
您可以在numpy化的代码中使用标准的python运算符,而且不对data_bytes进行切片也可以提高速度(假设它是bytes
而不是numpy数组)
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)
推测一下,您的颜色问题如下-您的GRBG
数据是这样输入的:
G0 B1 G2 ...
R0 G1 R2
数字代表uint16索引。 OpenCV需要对它们进行编号
G0 B0 G1 R1 ...
R6 G6 R7 G7
您可以通过一些仔细的调整和转置来解决此问题:
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
例
# 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')
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.