RGB转Bayer,一个小数点引发的血案

前几天写了一个RGB数据转Bayer格式的函数,经过测试功能正常。后来把这个函数用到一个数据库构建中,结果数据库出来的结果一直是一张黑图,追查了好几个小时,总算把这只虫子找出来了,原来是一个整数后面的小数点作祟。

原始功能正常的函数如下:


def rgb2raw(img):
    B = img[:, :, 0]
    G = img[:, :, 1]
    R = img[:, :, 2]

    raw = np.zeros_like(B)
    Row, Col = raw.shape

    raw[0:Row:2, 0:Col:2] = R[0:Row:2, 0:Col:2]
    raw[0:Row:2, 1:Col:2] = G[0:Row:2, 1:Col:2]
    raw[1:Row:2, 0:Col:2] = G[1:Row:2, 0:Col:2]
    raw[1:Row:2, 1:Col:2] = B[1:Row:2, 1:Col:2]

    raw = raw * 65535.0 / 255.0
    raw = raw.astype(np.uint16)

    return raw

集成到数据库中出现异常的函数如下:


def rgb2raw(img, bitdepth=16):
    B = img[:, :, 0]
    G = img[:, :, 1]
    R = img[:, :, 2]

    raw = np.zeros_like(B)
    Row, Col = raw.shape

    raw[0:Row:2, 0:Col:2] = R[0:Row:2, 0:Col:2]
    raw[0:Row:2, 1:Col:2] = G[0:Row:2, 1:Col:2]
    raw[1:Row:2, 0:Col:2] = G[1:Row:2, 0:Col:2]
    raw[1:Row:2, 1:Col:2] = B[1:Row:2, 1:Col:2]

    raw = raw * (2**bitdepth-1) / 255.0
    raw = raw.astype(np.uint16)

    return raw

由于考虑到可能需要覆盖不同比特位宽的raw域,因此,在集成到数据库中的时候,加了一个bitdepth的参数,就是这一参数,导致了后面所有的错误。

让我们试着输出raw = raw * 65535.0 / 255.0的结果:

可以看到,转换成raw域后,数据都是0~65535之间的整数。

让我们再来看看 raw = raw * 65535 / 255.0的结果:

输出数据都变成了256,显然是不对的。

将原来的实现方式替换到数据库中,问题解决。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值