SRGGB12格式RGGB转RGB:移除空值并调整输出矩阵维度
SRGGB12格式转RGB:去除空值并输出(3,2,2)矩阵
相机传感器输出为SRGGB12格式,现有测试代码将4x4的RGGB数组转换为(3,4,4)矩阵,但存在大量空条目。需要删除所有空值,使输出变为(3,2,2)矩阵,并调整给定的conver_rggb_to_rgb函数实现该需求。
原测试代码及输出
import numpy as np rggb = np.array([['R', 'G', 'R', 'G'], ['G', 'B', 'G', 'B'], ['R', 'G', 'R', 'G'], ['G', 'B', 'G', 'B']]) test2 = np.chararray((3, 4, 4)) test2[:] = '' test2[2,::2, ::2] = rggb[1::2, 1::2] # blue test2[1,1::2, ::2] = rggb[0::2, 1::2] # green test2[1,::2, 1::2] = rggb[1::2, 0::2] # green test2[0,1::2, 1::2] = rggb[0::2, 0::2] # red print(test2)
输出:
[[['' '' '' ''] ['' b'R' '' b'R'] ['' '' '' ''] ['' b'R' '' b'R']] [['' b'G' '' b'G'] [b'G' '' b'G' ''] ['' b'G' '' b'G'] [b'G' '' b'G' '']] [[b'B' '' b'B' ''] ['' '' '' ''] [b'B' '' b'B' ''] ['' '' '' '']]] (3, 4, 4)
待调整的原函数
def conver_rggb_to_rgb(rggb): ret_arr = np.zeros((rggb.shape[0]//2, rggb.shape[1]//2, 3)).astype(np.uint16) blue = rggb[1::2, 1::2] # blue green1 = rggb[0::2, 1::2] # green green2 = rggb[1::2, 0::2] # green red = rggb[0::2, 0::2] # red ret_arr[:,:,0] = red ret_arr[:,:,1] = (green1 + green2)/2 ret_arr[:,:,2] = blue return ret_arr
修改后的函数及说明
原函数的核心逻辑是对的,但需要调整输出维度顺序,直接生成无空值的紧凑(3,2,2)矩阵:
def conver_rggb_to_rgb(rggb): # 提取Bayer格式中各颜色通道的有效像素 red = rggb[0::2, 0::2] # R像素位于偶数行偶数列 green1 = rggb[0::2, 1::2] # G像素位于偶数行奇数列 green2 = rggb[1::2, 0::2] # G像素位于奇数行偶数列 blue = rggb[1::2, 1::2] # B像素位于奇数行奇数列 # 合并两个绿色通道取平均值,符合Bayer转RGB的标准处理 green = (green1 + green2) / 2 # 将单通道数组按通道维度堆叠,生成(3,2,2)格式的输出 ret_arr = np.stack([red, green, blue], axis=0).astype(np.uint16) return ret_arr
验证效果
用测试数组调用修改后的函数:
# 替换为实际SRGGB12数值(此处用字符示例,实际用uint16类型数值) rggb = np.array([[100, 150, 110, 160], [140, 200, 130, 190], [105, 155, 115, 165], [145, 205, 135, 195]]).astype(np.uint16) result = conver_rggb_to_rgb(rggb) print(result.shape) # 输出 (3, 2, 2) print(result)
关键改动说明
- 维度重构:使用
np.stack将(2,2)的单通道数组直接堆叠为(3,2,2)矩阵,完全避免空值,实现紧凑输出。 - 通道顺序:按
[red, green, blue]顺序堆叠,匹配需求的通道在前的格式。 - 类型兼容:保留
np.uint16类型,适配SRGGB12的12位无符号整数输出特性。
内容的提问来源于stack exchange,提问作者SkyImager
相关产品推荐
相关产品推荐

