首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从字节文件中查找拜耳模式格式

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

Stack Overflow用户
提问于 2021-06-18 17:56:22
回答 1查看 959关注 0票数 2

我有点纠结于一个问题,我想知道是否有更多经验的人会注意到我做错了什么:

我有一个6,266,880字节的二进制文件,其中包含一个用未知的拜耳模式保存的图像。

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

我想知道哪一种是用于保存图像的拜耳格式。

我认为使用cv2.cvtColor(src, cv2.COLOR_BayerGR2BGR)库为拜耳输入提供的所有转换选项来转换它,这些选项是:

代码语言:javascript
复制
  cv::COLOR_BayerBG2BGR
  cv::COLOR_BayerGB2BGR 
  cv::COLOR_BayerRG2BGR
  cv::COLOR_BayerGR2BGR 

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

然而,我总是弄到这样肮脏的东西:

下面是我使用的代码:

代码语言:javascript
复制
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) 

另外,这里有10个保存为原始文件的相同映像的示例,每个示例都有一个json及其属性。

你知道还有什么可以改变它的吗?还是有其他方法可以找到拜耳格式?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-06-19 13:46:33

12位被打包:每3个字节应用压缩2 (12位)像素。

我设法通过反复尝试解压像素。

以下是代码:

代码语言:javascript
复制
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图像超出了我回答的范围。

结果:

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68039594

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档