Декодирование двоичного файла из сканирования принтера

#python #python-3.x #printing #image-recognition #image-scanner

#python #python-3.x #печать #распознавание изображений #изображение-сканер

Вопрос:

Недавно я разработал собственный тип хранилища данных — набор черно-белых квадратов на напечатанном листе бумаги, который я могу отсканировать с помощью сканера. Для меня это имеет два основных преимущества:

  • Если бы у меня на жестком диске были важные фотографии, и они потерялись, я бы не смог их восстановить (скорее всего). Однако в моем проприетарном формате все данные являются физическими и, следовательно, не могут быть потеряны (если вы не похожи на меня и не склонны сильно ошибаться).)
  • Данные, хранящиеся на бумаге, не могут быть «украдены» хакерами и т.д.

Итак, я запрограммировал простой алгоритм, который берет ~2.5KiB файл и преобразует его в этот формат (каждый «бит» информации представляет собой блок пикселей 4×4):

 from PIL import Image, ImageDraw

im = Image.new("RGB",((160*4) 2, (128*4) 2), "white")
pix = im.load()
dw = ImageDraw.Draw(im)

dw.rectangle([0,0,160*4 1,128*4 1], outline=(0,0,255))

with open("program.exe", mode="rb") as f:
    l = list(f.read())
    # we now have the numerical binary!
    # time to convert each number into a bit!
    binary = ""
    temp = ""
    for a in l:
        temp = format(a, "#010b")[2:]
        binary  = temp
    idx = 0
    print(len(binary))

    for y in range(1, im.size[1]-1, 4):
        for x in range(1, im.size[0]-1, 4):
            ax = binary[idx]
            if ax == "1":
                for i in range(0, 4):
                    for j in range(0, 4):
                        pix[x j, y i] = (0,0,0)

            idx  = 1

im.show()
im.save("code.png")
  

Если вам интересно, program.exe это двоичный исполняемый файл, написанный на сборке x86, который просто печатает hello, world! на терминале.

Однако я не совсем понимаю, как (после сканирования) преобразовать отсканированное изображение обратно в машинный код и записать его в исполняемый файл. Кажется, что каждый раз на заднем плане изображения появляется какой-то нечеткий шум, который я, похоже, не могу удалить, и есть также тот факт, что изображение несколько искажено. Я попробовал библиотеку Python под названием pyzbar (и да, я знаю, что она предназначена для штрих-кодов и QR-кодов, но у меня была надежда, что она сможет распознать хотя бы что-то, но я хватался за соломинку, и на выходе ничего не вышло.

Кто-нибудь знает, как это сделать (например, распознавание изображений или что-то еще для чтения данных)?

Комментарии:

1. Вы, кажется, запутались. Физические элементы легко теряются, перемещаются не по месту, повреждаются или уничтожаются и, как правило, являются громоздкими и дорогостоящими для безопасного хранения, в то время как цифровые данные можно безопасно копировать в несколько местоположений. Используйте шифрование, если оно должно быть конфиденциальным.

2. О нет, я знаю. Это только для моих целей, и, как я уже описал, я часто размещаю что-то не так, но при определенных условиях бумага может храниться более 400 лет. Это скорее хранилище данных типа «возможно ли это сделать».

3. возможно, вам следует использовать модуль cv2 (OpenCV) — вы могли бы даже найти примеры, которые показывают, как распознавать прямоугольники или другие фигуры или даже шахматную доску.