【问题标题】:Converting raw bytes to image将原始字节转换为图像
【发布时间】:2018-12-21 06:23:58
【问题描述】:

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

【问题讨论】:

  • 请分享文件!
  • 是的,很抱歉我现在添加了它
  • 很抱歉,这些文件看起来都不像合理的图像......它们具有正确的大小,适合每像素 8 位的灰度 320x240 图像,但没有任何可识别形状的相似之处或将对象制作成 JPEG 或 PNG。
  • 图像 T5 似乎比其他所有图像都亮得多...
  • hkalasua.wordpress.com/2017/09/11/ov7670-arduino-sd 这是我遵循的指南,但不同之处在于他的脚本需要一个包含 76800 列的文件,我找不到任何可以做到这一点的十六进制编辑器

标签: python image


【解决方案1】:

您无需编写任何 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

【讨论】:

  • 非常感谢,是的,相机代码或相机本身似乎存在根本问题,所以我会继续努力,但至少有了这个,我可以轻松看到我的进步和故障排除谢谢你
【解决方案2】:
for i in range(0,76800):

是一个硬编码的值,因为columnvector[0][i] 没有那么多值,所以你会得到IndexError: list index out of range.

考虑一下为什么需要将范围设置为 0-76800,或者该值是否可以从 len() 动态获取。

【讨论】:

  • 我不确定 len() 是什么,但代码的问题是它最初只用于一行和 76800 列,而我的文件有 4800 行和 16 列
【解决方案3】:

从二进制文件制作图像的另一种简单方法是将其转换为NetPBM 图像。

由于您的文件是 320x240 和 8 位二进制灰度,您只需在其中创建包含该信息的标题并附加您的二进制文件:

printf "P5\n320 240\n255\n" >  image.pgm
cat T1                      >> image.pgm

您现在可以使用fehPhotoshopGIMP 或许多其他图像查看器打开image.pgm

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-06
    • 2016-04-11
    • 2019-11-08
    • 2013-03-20
    • 2013-11-10
    • 2014-10-01
    • 2022-01-09
    • 1970-01-01
    相关资源
    最近更新 更多