从字节文件中查找拜耳模式格式
Find Bayer pattern format from a byte file
我遇到了一个问题,我想知道是否有更多经验的人会注意到我做错了什么:
我有一个 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 及其属性
还有什么可以尝试转换它的想法吗?还是有其他方法可以找到拜耳格式?
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 图像超出了我的回答范围。
结果:
我遇到了一个问题,我想知道是否有更多经验的人会注意到我做错了什么:
我有一个 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 及其属性
还有什么可以尝试转换它的想法吗?还是有其他方法可以找到拜耳格式?
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 图像超出了我的回答范围。
结果: