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


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

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

    1. def rgb2raw(img):
    2. B = img[:, :, 0]
    3. G = img[:, :, 1]
    4. R = img[:, :, 2]
    5. raw = np.zeros_like(B)
    6. Row, Col = raw.shape
    7. raw[0:Row:2, 0:Col:2] = R[0:Row:2, 0:Col:2]
    8. raw[0:Row:2, 1:Col:2] = G[0:Row:2, 1:Col:2]
    9. raw[1:Row:2, 0:Col:2] = G[1:Row:2, 0:Col:2]
    10. raw[1:Row:2, 1:Col:2] = B[1:Row:2, 1:Col:2]
    11. raw = raw * 65535.0 / 255.0
    12. raw = raw.astype(np.uint16)
    13. return raw

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

    1. def rgb2raw(img, bitdepth=16):
    2. B = img[:, :, 0]
    3. G = img[:, :, 1]
    4. R = img[:, :, 2]
    5. raw = np.zeros_like(B)
    6. Row, Col = raw.shape
    7. raw[0:Row:2, 0:Col:2] = R[0:Row:2, 0:Col:2]
    8. raw[0:Row:2, 1:Col:2] = G[0:Row:2, 1:Col:2]
    9. raw[1:Row:2, 0:Col:2] = G[1:Row:2, 0:Col:2]
    10. raw[1:Row:2, 1:Col:2] = B[1:Row:2, 1:Col:2]
    11. raw = raw * (2**bitdepth-1) / 255.0
    12. raw = raw.astype(np.uint16)
    13. return raw

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

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

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

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

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

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

     

  • 相关阅读:
    js中数组的遍历的几种方法
    MVP模式根模块
    java基础特别问题
    Flink学习第九天——Flink里面核心Source Sink对接 Kafka Connetor实战
    QT常见概念-1
    指令寻址方式(重点记忆)
    PTA 7-88 组合成最小的三位数
    3_docker部署mysql主主备份
    数据结构-查找算法以及查找结构
    go语言中的协程和Java中线程以及进程的区别
  • 原文地址:https://blog.csdn.net/DeliaPu/article/details/134425899