【问题标题】:Find Bayer pattern format from a byte file从字节文件中查找拜耳模式格式
【发布时间】:2021-09-03 10:52:17
【问题描述】:

我正在为一个问题苦苦挣扎,我想知道是否有更多经验的人可能会注意到我做错了什么:

我有一个 6,266,880 字节的二进制文件,其中包含以未知 Bayer pattern 保存的图像。

关于图像,我知道它的格式是 2176x1920 像素,并且它的 bit_per_pixel = 12。

我想知道哪一种是用于保存图像的拜耳格式
我想用 cv2 库为拜耳输入提供的所有转换选项将其转换为 cv2.cvtColor(src, cv2.COLOR_BayerGR2BGR),它们是:

  cv::COLOR_BayerBG2BGR
  cv::COLOR_BayerGB2BGR 
  cv::COLOR_BayerRG2BGR
  cv::COLOR_BayerGR2BGR 

直到我找到提供“干净”图像作为输出的那个。

但是,我总是像这样弄脏东西:

这是我正在使用的代码:

import numpy as np
import matplotlib.pyplot as plt
import cv2

pixels = np.fromfile("0000.raw", dtype = 'uint8')

""" CONVERT THE BYTE STREAM, EVERY PIXEL HAS 12 BIT, SO BYTE HAS TO BE SPLITTED AND PUTTED IN A UINT16 VARIABLE"""
data = pixels
data1 = data.astype(np.uint16)
data1[::3] = data1[::3]*256 + data1[1::3] // 16
data1[1::3] = (data[1::3] & 0x0f)*16 + data[2::3]
result = np.ravel(data1.reshape(-1,3)[:,:2]) 


img = result.reshape(2176, 1920)
convertedImage = cv2.demosaicing(img_scaled, cv2.COLOR_BayerGR2BGR) 
cv2.imshow("tmp", convertedImage) 
cv2.waitKey(0) 

另外, Here 有 10 个相同图像的样本保存为原始文件,每个样本都有一个带有属性的 json

还有什么可以尝试转换它的想法吗?还是有其他方法可以找到拜耳格式?

【问题讨论】:

    标签: python image numpy opencv cv2


    【解决方案1】:

    12 位被打包:每 3 个字节应用打包 2(12 位)像素。
    我设法通过反复试验来解压像素。

    代码如下:

    import numpy as np
    import cv2
    
    cols, rows = 1920, 2176
    
    pixels = np.fromfile("0000.raw", np.uint8)
    
    """ CONVERT THE BYTE STREAM, EVERY PIXEL HAS 12 BIT, SO BYTE HAS TO BE SPLITTED AND PUTTED IN A UINT16 VARIABLE"""
    data = pixels
    data1 = data.astype(np.uint16)
    
    result = np.zeros(data.size*2//3, np.uint16)
    
    # 12 bits packing: ######## ######## ########
    #                  | 8bits| | 4 | 4  |  8   |
    #                  |  lsb | |msb|lsb |  msb |
    #                  <-----------><----------->
    #                     12 bits       12 bits
    
    result[0::2] = ((data1[1::3] & 15) << 8) | data1[0::3]
    result[1::2] = (data1[1::3] >> 4) | (data1[2::3] << 4)
    bayer_im = np.reshape(result, (rows, cols))
    
    bgr = cv2.cvtColor(bayer_im, cv2.COLOR_BayerBG2BGR)
    cv2.imshow('bgr', bgr*16)
    
    # "White balance":
    bgr[:, :, 0] = np.minimum(bgr[:, :, 0].astype(np.float32)*1.8, 4095).astype(np.uint16)
    bgr[:, :, 2] = np.minimum(bgr[:, :, 2].astype(np.float32)*1.67, 4095).astype(np.uint16)
    
    cv2.imshow('bayer_im', bayer_im*16)
    cv2.imshow('bgr WB', bgr*16)
    cv2.waitKey()
    cv2.destroyAllWindows()
    

    • cv2.COLOR_BayerBG2BGR 提供最佳结果。
    • 我放大了蓝色和红色通道(简单的“白平衡”)。
    • 图像由两幅图像组成 - 顶部曝光度高,底部曝光度低。它的目的是通过组合两个图像来获得一个 HDR 帧。
      生成 HDR 图像超出了我的回答范围。

    结果:

    【讨论】:

    • 哇!这很棒!非常感谢。如果您有时间,我有几个以下问题您能解释一下为什么在imshow 中您将图像乘以 16?而且,当您从拜仁模式转换时,是否需要白平衡?最后一个问题,你在脚本中修改哪个参数来改变图像的曝光?
    • cv2.imshow 不支持正确显示 12 位范围(当范围为 [0, 4095] 时)。当类型为 np.uint8 时,假定范围为 [0, 255](255 为白色)。当类型为np.uint16时,范围假定为[0, 65535](65535为白色)。我们希望 4095 是白色的,所以我们需要乘以(大约)16。没有它,显示的图像会很暗。
    • 我使用简单的白平衡来获得更好的结果(没有它,图像是绿色的)。白平衡和去马赛克不是直接耦合的。它们是原始图像处理的两个不同阶段。调整亮度和对比度也是原始图像处理的一个阶段。很抱歉,我不会教你原始图像处理的所有阶段。
    • 这已经是很多信息了!再次感谢
    猜你喜欢
    • 1970-01-01
    • 2021-12-26
    • 2021-12-27
    • 2019-06-28
    • 1970-01-01
    • 1970-01-01
    • 2011-01-23
    • 2021-09-06
    • 2017-02-18
    相关资源
    最近更新 更多