python - 从字节文件中查找拜耳模式格式

标签 python image numpy opencv

我正在解决一个问题,我想知道有更多经验的人是否会注意到我做错了什么:

我有一个 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 

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

但是,我总是弄脏这样的东西:
Img after cv2 conversion

这是我正在使用的代码:

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 及其属性

知道还有什么可以尝试转换它吗?或者还有其他方法可以找到拜耳格式吗?

最佳答案

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 给出最佳结果。
  • 我放大了蓝色和红色 channel (简单的“白平衡”)。
  • 该图像由两幅图像组成 - 顶部为高曝光,底部为低曝光。其目的是通过组合两个图像来获得 HDR 帧。
    生成 HDR 图像超出了我的回答范围。

结果:
enter image description here

关于python - 从字节文件中查找拜耳模式格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68039594/

相关文章:

javascript - 在 Javascript 中上传多个有大小限制的文件

python - 如何在 python-webkit 中设置用户代理

css - 按窗口高度缩放响应式图像

node.js - Azure Functions,缩略图尺寸大于原始图像

html - 使图像不可点击/不可拖动

python - OneHotEncoder 之前和之后的不同结果

python - 机器学习: Converting bash script into Python

python - 安装TA-lib问题

python - 如何将形状为(带、行、列)的数组重新整形为(行、列、带)?

python - 带有组合生成器的 Numpy : How does one speed up Combinations?