首页 > 解决方案 > 将原始字节转换为图像

问题描述

我有一个包含 240x320 图像的文件,但它的字节格式我在十六进制编辑器中打开它,得到了类似于 16 列 4800 原始数组的东西。

我对此完全陌生,这就是为什么我遇到麻烦我曾尝试使用 python 脚本,但它在第 17 行出现错误,在 data = columnvector[0][i] 中:

IndexError:列表索引超出范围。

我尝试了 java 代码,但这也是一个错误,我想尝试一些 c# 代码,但我找到的代码都没有解释如何将我的文件提供给代码。这是python代码

import csv
import sys
import binascii
csv.field_size_limit(500 * 1024 * 1024)

columnvector = []
with open('T1.csv', 'r') as csvfile:
    csvreader = csv.reader(csvfile,delimiter=' ', quotechar='|')
    for row in csvreader:
        columnvector.append(row)
headers =['42','4D','36','84','03','00','00','00','00','00','36','00','00','00','28','00','00','00',
'40','01','00','00','F0','00','00','00','01','00','18','00','00','00','00','00','00','84','03','00','C5','00',
'00','00','C5','00','00','00','00','00','00','00','00','00','00','00']

hexArray=[]
for i in range(0,76800):
    data = columnvector[0][i]
    hexArray.extend([data,data,data])

with open('T1.txt', 'wb') as f:
    f.write(binascii.unhexlify(''.join(headers)))
    f.write(binascii.unhexlify(''.join(hexArray)))

我想使用任何方法将文件转换为图像,老实说,我不在乎使用哪种方法,只要它能完成工作。

这是一些文件 https://github.com/Mu-A/OV7670-files/tree/Help

标签: pythonimage

解决方案


您可以在不编写任何 Python 的情况下将二进制数据制作成图像,只需在终端中使用ImageMagick 。它包含在大多数 Linux 发行版中,可用于 macOS 和 Windows。

如果您的图像是 320x240,它应该是:

  • 320 * 240 字节长,如果是单通道(灰度),或者
  • 如果是 3 通道 RGB,则为 320 * 240 * 3。

由于您的图像是 76800,我假设它们是灰度的。

因此,在终端中,要将原始数据转换为 JPEG,请使用:

magick -depth 8 -size 320x240 gray:T1  result.jpg

或者,如果您使用的是ImageMagick版本 6 ,请使用:

convert -depth 8 -size 320x240 gray:T1  result.jpg

如果您想要具有自动对比度拉伸的 PNG,请使用:

magick -depth 8 -size 320x240 gray:T1 -auto-level result.png

不幸的是,您的图像都没有出现任何明智的结果。这里是 T1,例如:

在此处输入图像描述

直方图看起来确实有些合理:

在此处输入图像描述 在此处输入图像描述


我认为你有一些根本性的错误,所以我会尝试恢复到第一原则来调试它。我会将手电筒照射到窗户上,或者将相机对准窗户并保存一张名为的照片bright.dat,然后用一张黑卡盖住镜头并拍摄另一张名为dark.dat. 然后我会绘制数据的直方图,看看亮的是否在最右端,暗的是否在最左端。制作这样的直方图:

magick -depth 8 -size 320x240 Gray:bright.dat histogram:brightHist.png

和:

magick -depth 8 -size 320x240 Gray:dark.dat histogram:darkHist.png

推荐阅读