Преобразование необработанных байтов в изображение - PullRequest
0 голосов
/ 20 декабря 2018

У меня есть файл, который содержит изображение 240x320, но в его байтовом формате я открыл его в шестнадцатеричном редакторе и получил что-то вроде массива 16 столбцов 4800 raw.

Я совершенно новичок в этом, поэтому я столкнулся с проблемой. Я попытался использовать скрипт на 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

Ответы [ 3 ]

0 голосов
/ 20 декабря 2018

Вы можете превратить двоичные данные в изображения без написания Python, просто используйте ImageMagick в Терминале.Он входит в большинство дистрибутивов Linux и доступен для macOS и Windows.

Если ваше изображение имеет размер 320x240, оно должно быть:

  • 320 * 240 байт, если используется один канал (в оттенках серого)или
  • 320 * 240 * 3, если 3-канальный RGB.

Поскольку ваши изображения 76800, я предполагаю, что они в оттенках серого.

Итак, вТерминал, чтобы превратить эти необработанные данные в JPEG, используйте:

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

или, если вы используете версию 6 из ImageMagick , используйте:

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

Если вы хотите PNG с автоматическим контрастным растяжением, используйте:

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

К сожалению, ни одно из ваших изображений не дает ничего разумного.Вот T1, например:

enter image description here

Гистограммы действительно выглядят несколько разумно:

enter image description here enter image description here


Я думаю, у вас что-то в корне не так, поэтому я попытаюсь вернуться к первым принципам, чтобы отладить это.Я хотел бы зажечь факел или направить камеру на окно и сохранить изображение с именем 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
0 голосов
/ 20 декабря 2018

Еще один простой способ сделать изображение из двоичного файла - это преобразовать его в NetPBM изображение.

Поскольку ваш файл имеет размер 320x240 и 8-битную двоичную шкалу серого, вам просто нужночтобы создать заголовок с этой информацией и добавить двоичный файл:

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

Теперь вы можете открыть image.pgm с помощью feh, Photoshop , GIMP или многие другие программы для просмотра изображений.

0 голосов
/ 20 декабря 2018
for i in range(0,76800):

- это жестко закодированное значение, и поскольку columnvector[0][i] не имеет такого количества значений, вы получите IndexError: list index out of range.

. Подумайте, почему вам нужно установить диапазон от 0-76800 или еслизначение может быть динамически получено из len() чего-либо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...