Эксперимент с голографическим кодированием и декодированием информации

    Захотелось мне как-то сделать кодирование информации основываясь на голографическом принципе. Захотелось не просто так, а для проверки кое-каких своих идей и теорий. Теории не подтвердились, идеи не реализовались. Но поскольку подобного алгоритма я «с наскока» не нашёл и пришлось придумывать его самому, основываясь на учебниках по физике, то решил поделиться им на хабре. Алгоритм, кстати, довольно простой.

    Итак, приступим.
    Как делается голограмма. В общем случае, луч света от когерентного источника света тем или иным образом делится на две части, одна из которых попадает напрямую на фотопластинку, а другая часть тоже попадает на фотопластинку, но после отражения от объекта, голограмму которого мы желаем получить. В результате, на фотопластинке фиксируется картина интерференции света напрямую пришедшего из источника, и света отражённого от объекта.
    Суть голографии в том, что в картине интерференции закодирована не только яркость той или иной точки объекта, но и расстояние до этой точки. Так получается потому что на фотопластинку приходят световые волны в разных фазах (а фаза зависит от расстояния до точки объекта), эти волны складываются в соответствии со своими фазами, за счёт чего собственно говоря и образуется картина интерференции.

    Восстанавливается изображение объекта просто осветив проявленную фотопластинку светом той же длины волны. Есть голограммы восстанавливаемые белым некогерентным светом, но их не рассматриваем.

    У голограмы есть интересные свойства.
    Например, восстановить полное изображение объекта можно по любому кусочку голографического снимка (с ухудшением качества изображения).
    Можно на одну фотопластинку записать изображения нескольких объектов, воспользовавшись источниками света с разной длиной волны. И восстановить изображение каждого объекта в отдельности осветив фотопластинку светом с той же длиной волны, который был использован для записи нужного объекта.

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

    Почему эта идея не реализовалась?
    Во-первых — звук не картинка, картинку мы видим сразу полностью, и автоматически выделяем знакомые детали. А звук слушаем последовательно, и любая зашумлённость сильно ухудшает восприятие. Тем более, что при голографическом кодировании зашумлённость появляется в виде накладывающихся на исходный звук свистов, шипений и т.п.
    Во-вторых сразу не учёл сложность алгоритма. Сложность алгоритма оценивается как O(n^2). Т.е. для кодирования (и декодирования) файла размером в 1 мегабайт требуется триллион (миллион миллионов) итераций, а при каждой итерации надо ещё и производить вычисления… Для примера, WAV-файл размером 10 килобайт (2-3 секунды звука) у меня кодировался около минуты (10 000 * 10 000 итераций = 100 млн. итераций). И ускорить алгоритм никак не получится. А для кодирования файла в 10 раз большего размера потребуется в 100 раз больше времени.
    И в третьих — для получения нормального голографического изображения требуется что бы объект был контрастным. А какая контрастность в звуковом файле? Почти случайный набор чисел.

    Но вернёмся к самому алгоритму, и его рабочей демонстрации.
    Кодирование и декодирование осуществляется одним и тем же алгоритмом, но при декодировании изменяется пара коэффициентов.
    Тестовый алгоритм обработки изображения был реализован на PHP, потому что «так быстрее» (для экспериментов с WAV-файлом использовался язык C).

    Исходно: матрица яркости пикселей исходного изображения (для кодирования или декодирования потребуется 2500*2500 = около 6 миллионов итераций, в моём случае — несколько секунд работы PHP)
    $data0[50][50];

    На выходе: матрица яркости пикселей «на фотопластинке»
    $data1[50][50];

    $W=0.1; //длина волны источника света

    //вычислим яркость каждой точки искомого изображения
    for($x1=0;$x1<50;$x1++)
    for($y1=0;$y1<50;$y1++) {

    //опорный свет - считаем, что источник света излучает свет с силой достаточной для освещения
    каждого пикселя с силой 256 единиц, но половину света мы отправили на объект, а половину света направили на фотопластинку (128 единиц).
    $px=128.0; //эта часть света уже достигла фотопластинки, минуя объект (д.б. =0 при декодировании)

    //яркость каждой точки искомого изображения - равна сумме света пришедшего ОТО ВСЕХ точек исходного изображения
    for($x0=0;$x0<50;$x0++)
    for($y0=0;$y0<50;$y0++) {

    //расстояние от точки (x0;y0) до точки (x1;y1) считаем что везде z=1, плоская голограмма
    $D=sqrt(1+($x0-$x1)*($x0-$x1)+($y0-$y1)*($y0-$y1));

    // Фаза волны достигшей этой точки
    $Phase=$D/$W;

    //доля света от очередной точки объекта (по поводу коэффициента 0.3 - будет написано далее)
    $obj_light=($data[$x0][$y0])*0.3;

    //суммируем свет от очередной точки (в соответствии с фазой световой волны пришедшей от этой точки)
    $px+=$obj_light*cos($Phase);

    }
    //волна оставляет пятно в любом случае, плюс она в этой точке или минус.
    $px=abs($px);

    //на выходе имеем - интенсивность света в точке (x1;y1)
    data1[$x1][$y1]=$px;
    }


    Коэффициент в этой строке $obj_light=($data[$x0][$y0])*0.3; подбирается. Хотя можно для него и формулу вывести, правда отдельно для случая кодирования и случая декодирования.

    Декодирование осуществляется этим же алгоритмом, только $px=128.0; изменяется на $px=0.0; (в данном случае, изображение восстанавливается только из отражённого света)

    Ну и результаты работы.
    Исходное изображение
    image



    Записанная голограмма и восстановленное по ней изображение
    image image



    Затёртая на 1/3 запись голограммы и восстановленное по ней изображение
    image image



    Затёртая более чем на 2/3 запись голограммы и восстановленное по ней изображение
    image image



    Для случая трёх точек и длины волны светового излучения W=1 пример есть тут.

    Есть две причины сильных шумов:
    1. В эксперименте яркости точек округляются до целых в диапазоне 0..255. Часть информации теряется в отбрасываемых дробных частях, да и диапазон, конечно маловат.
    2. Малая площадь голограммы, всего лишь 50 на 50 точек. Это намного меньше квадратного миллиметра настоящей голограммы. В реальности для получения голограммы используют фотоматериалы с разрешающей способностью 5000 линий/мм.


    Если нужна будет трёхмерность голограммы, то это не усложнит алгоритм, т.к. достаточно будет изменить формулу подсчёта расстояния D (сейчас голограмма плоская, координата Z всегда =1)

    Вот такой вот эксперимент.
    Поделиться публикацией

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

      0
      Т.е. Вы попробовали (или ты попробовал, не знаю как лучше) численно смоделировать (построить некую аппроксимацию) физического процесса состоящего в том, чтобы цифровую информацию преобразовать в аналоговый вид, там подвергнуть неким изменениям, затем преобразовать обратно в числовой вид. Я правильно понял?
        +1
        Не с первого раза понял что вы хотели сказать.

        Вообще получается что именно так. Исходная картинка — цифровая информация. Записанная голограмма — считай аналоговая. По крайней мере если бы была аналоговой, то качество восстановления исходного образа было бы гораздо лучше.
          0
          Если мы собираемся хранить звук, например, то у нас всегда есть два варианта, хранить его (на голограмме) в цифровом или аналоговом виде.

          Если хранить в цифровом, то надо на голограмму писать не яркость пикселя и уж точно не значение байта, а нули и единицы, возможно какую-то модуляцию предусмотреть. И «декодирование» (хотя ничего там не кодировалось бы) надо было бы совсем другим сделать, фактически нужно было бы квантование и дискретизация.

          Программа же скорее пытается хранить в аналоговом виде — интерференционная картина вполне согласуется с яркостью исходной картинки. Но программа очень далека от реальной аппроксимации такого физического эксперимента, нужны не целые числа, а вещественные как минимум. Численное моделирование на самом деле может оказаться сложнее, чем кажется, ведь требуется добиться более менее точных результатов.

          В общем эксперимент интересный, но проведён совершенно неправильно. Звук, я полагаю, при аналоговой передаче будет сильно искажён, интересно насколько. А в цифровом виде хранить, конечно, получится, но, наверное, не очень много данных. Нет возможности поставить реальный эксперимент, а не умозрительный?
            0
            Про численное моделирование, забыл добавить. Дело не только в типе данных (int -> double), дело в том, что надо смоделировать непрерывную плоскость, а не массив чисел. А в руках у нас только массивы. И от того, сколько будет элементов на мм (что-то вроде частоты дискретизации, только у нас два измерения), точность будет зависеть очень сильно.
          +1
          Или всё-таки я тупой. Я было подумал что цель реально записывать звук (или другую информацию) в физическую голограмму. А такой цели не было, была цель сделать алгоритм кодирования-декодирования цифровой информации под вдохновением от голографии? Если так, тогда мои комментарии выше мимо кассы.
            0
            Под кодированием подразумевается шифрование, сжатие или ещё что-то?
            Нет. Это слишком ресурсоёмкий для таких вещей алгоритм.
              0
              Да, может показаться, что подразумевается «шифрование», но обычно имеется ввиду всё-таки именно кодирование, т.е. представление (или процесс преобразования) какой-либо информации в каком-либо виде (например, удобном для хранения, передачи или обработки); ещё можно обозначить как представление информации (сигналов) в виде кодов.
              0
              Кроме того, насколько я понимаю, алгоритмы шифрования и сжатия всё-таки делаются не на коленке, а со строгим математическим обоснованием.
            0
            Не особо вник в код, но есть вопрос: вы написали, что шумы возникли изза того, что пришлось округлять значения в диапазоне 0..255, т.е. в вашем распоряжении был 1 байт на одну точку. А если использовать цветное RGB изображение, где вам предоставлено 3 байта на точку, это улучшило бы результат?
              0
              Улучшило бы.
              Но то что там три байта на точку не суть важно, в конце-концов округление производится лишь для того чтоб сохранить запись в виде изображения (а это не обязательно, можно просто сохранить числа в файл не округляя).

              Наверное не меньший (а может быть и больший) вклад вносит в шумы то, что «носитель информации» не аналоговый. В том смысле что слишком маленький размер записи голограммы (2500 точек, массив из 2500 однобайтовых чисел). В этом случае (наверное) вносит большие искажения то что запись голограммы «не бесконечна», мало длин волн укладывается на одну «фотопластинку».

              На реальной голограмме длина волны в миллионы (миллиарды?) раз меньше чем сама фотопластинка. Здесь — всего лишь в 50-500 раз.

              Правильнее было бы голограмму сделать побольше, это значительно улучшило бы результат.

              Ну… и ещё не проведён эксперимент с записью нескольких разных изображений на одну голограмму (каждое изображение записываем и воспроизводим используя свою длину волны).
              +1
              сейчас могу сказать полную чушь, но…

              «А какая контрастность в звуковом файле? Почти случайный набор чисел.» — преобразование Фурье не просто так придумали, соно(спектро?)грамма прекрасно показывает контрастность и яркость. если вы возьмете и будете хранить результаты покадрово для каждого момента, или даже хитро вычтете несущественные результаты для уха и придумаете как потом это обратно собрать в wav и хранить поудобнее — у вас получится один из видов mpeg кодирования.
                +1
                Честно сказать даже мельком видел что есть некие «голограммы Фурье», но не вникал что это такое. (вычислить косинус всё-таки проще, чем делать преобразование фурье :) )
                  0
                  это да, но быстрое преобразование Фурье (БПФ) реализовали на всех, наверное, языках. а обратное преобразование вообще отличается только знаком. так что можно взять чью нибудь реализацию и попробовать сделать что-нибудь духе такого же эксперимента. так же можно использовать оконное преобразование, ограничив область выполнения преобразования нужными для слуха частотами.

                  вообщем тема для труЪ-матан guys. я увы таковым не являюсь, просто интересовался темой когда-то.
                    0
                    «вообщем тема для труЪ-матан guys»
                    Наверное. Если вникнуть, то получилось (насколько я понял), так называемое косинусное преобразование со страшными формулами.
                    Но всё делалось на основании одной страницы учебника по физике, и паре нестрашных формул :)
                      0
                      Почитал быстренько про Фурье. В этом случае нельзя записать на одну «пластинку» несколько изображений.
                      Кроме того разные части голограммы Фурье содержат разную информацию об объекте (какая-то ВЧ составляющие, какая-то НЧ)
                      В реализованном примере — информация об изображении «размазывается» поравномернее, этого и хотелось.

                      Хочу попытаться использовать голограмму в генетическом алгоритме в качестве представления генома. Скорее всего ничего хорошего не выйдет, но «а вдруг» :)
                • НЛО прилетело и опубликовало эту надпись здесь
                  • НЛО прилетело и опубликовало эту надпись здесь
                    • НЛО прилетело и опубликовало эту надпись здесь
                        0
                        Я не очень понимаю, какой алгоритм он создал. Можете объяснить, как это понимаете Вы?
                          +1
                          Ну что за дурная привычка — мешать хвалить :)
                            0
                            Я уже сам понял, наконец, о чём речь.
                      +3
                      Какая ж это научная работа.
                      Обыкновенное моделирование.
                      • НЛО прилетело и опубликовало эту надпись здесь
                      0
                      как насчет изображения посложнее?
                        +1
                        хреново :)
                          +1
                          Хотя… Какие-то контуры таки выделяются. При должном воображении угадать можно :)
                          0
                          Голограмма — штука толстая, и на том живёт. Цифровая голограмма как минимум многослойной должна бы быть, кажись.
                            0
                            Их там куча видов. Тонкие тоже бывают.
                            Толстую голограмму сложно смоделировать. Там уже дифракция работает.
                              0
                              хм… надо мне подучить матчасть. Думал, без дифракции голограммы и не бывает…

                              И в ВП вон, слово «дифракция» упоминается четырежды в рамках необъяснённой, но явно ключевой характеристики «относительная дифракционная эффективность»
                            0
                            Задачи подобного типа, по крайне мере для изображений, изучены более чем хорошо. Они вообще допускают и аналитические решения. То есть вначале рассматривается псевдонепрерывное изображение — например набор точек — дельта-функций в нужных местах. Потом находят решение в аналитическом виде, возможно в виде ряда — и вот его уже дискретизируют. На практике очень много ограничений накладывается, в связи со сложностью изготовления таких фотопластинок. Часто ограничение настолько сурово — что фотопластинка должна быть вообще бинарной.
                            Большое количество работ этому в свое время было посвящено в журнале «Компьютерная оптика».
                              0
                              На одном из мероприятий для стартаперов в Питере видел команду, разработавшую технологию передачи информации по оптоволокну с использованием, насколько я понял, как раз голографических принципов. На момент выступления ребята уже имели соглашения о намерениях с МТС и ещё с кем-то и находились в стадии разработки работающего прототипа.
                                0
                                В цифровом виде всё это дело нереально обрабатывать быстро.
                                А вот аналоговую схемку-микросхемку может быть и можно сделать.
                                  0
                                  Вообще-то тут несколько простых операций, причём независимых друг от друга, это можно хорошо параллелить, думаю на видеокарте оно должно побыстрее считаться, хотя все-равно, даже порядок-другой скорости здесь вряд-ли что-то даст.
                                    0
                                    Параллелить можно, но на порядки всё равно не ускоришь.
                                +1
                                Воистину, идеи витают в воздухе. Недели 4 назад написал себе на бумажке «попробовать сжатие звука голографическим методом». Вы меня немного даже шокировали :)

                                По теме: 1) я думаю, что надо кодировать не весь файл, а микроблоки. Недавно один мой знакомый опубликовал статью как раз о том, как «размазывать» звуковую информацию по временному окну. Задача данная важна, например, при радиосвязи. Из-за переотражения с последующей интерференцией в определённых местах пространства сигнал может иметь низкую амплитуду. Одно из решений — две антенны (например, милиция ставит две разнесённых антенны на машине), чтобы не терять сигнал. Другое решение как раз — «размывать» информацию. Понятно, что никого не интересует в таком применении минутный файл. Временное окно гораздо меньше.

                                2) Я совсем поверхностно знаком с голографией, поэтому для меня математически не очевидно, что изображение должно иметь высокий контраст. Но если это так, можно и правда использовать БПФ. Ну и шкалу побольше взять можно (2 байта, например, а не один).

                                3) Я не уверен, что Ваш алгоритм голографии самый лучший (что аналогии проведены верно, и что модель построена оптимальным образом), тут надо думать.

                                4) Можно попробовать применить какое-то сглаживание к голограмме (непонятно).

                                5) Мне кажется, при размере изображения A x A, голограмма должна быть как минимум 2A x 2A или больше. Чисто из соображений теоремы Котельникова (хотя она тут не очень применима формально, по сути всё равно увеличение числа отсчётов в 2 раза быть должно).

                                Надо будет всё же сесть и попробовать.
                                  0
                                  2. Со студенчества косо смотрю на БПФ (хотя понимаю что мощная штука). Будем считать это моим «комплексом» :) Плюс, повторюсь, голограмма Фурье позволяет запись только только 1 образа на пластинку (минус к магии). А продемонстрированная «классическая» голограмма позволяет записать много разных изображений на одну пластинку и они не будут мешать одно другому (плюс к магии)
                                  3. Он ещё и не совсем корректный. В частности сложение интенсивностей (не амплитуды) колебаний
                                  должно происходить не по формуле I=I1+I2*cos(fi), а по формуле I=I1+I2+2*sqrt(I1*I2)*cos(fi). Ну и ещё там есть пара нюансов.
                                  5. Теорема Котельникова, наверное, действительно не имеет прямого отношения. Тут важнее сколько интерференционных полос помещается на пластинку, но прямой зависимости от размеров исходного изображения наверное нет.
                                  Но, конечно, чем больше размер голограммы, тем лучше. В приведённом примере 50 на 50 точек — это намного меньше квадратного миллиметра «настоящей» голограммы. Реальная разрешающая способность фотоматериалов используемых для голографии — 5000 линий/мм.

                                  Скорее всего цифровое моделирование классической голографии тупиковый путь (долгий в плане вычислений). А вот подумать — можно ли собрать аналоговую схему завязанную на голографию, наверное имеет смысл. Плату расширения для компьютера такую сделать например (зачем-то :) )
                                  +1
                                  Я в качестве хобби занимался распознаванием речи. Так вот речь и музыку (до 11 кГц) пропускал через фильтр аналогичный фильтру в улитке уха. У меня было 100 очень низкодобротных фильтров на весь диапазон. Дискретизация по времени всего 30Гц. Обратным процессом восстанавливал в звук, на слух разницы между оригиналом и восстановленным почти нет.

                                  Так вот, то что я кодировал, выводил в виде изображений (100 точек по вертикале в развёртке по числу фильтров). Картинки очень чёткие. А музыка на пианино вообще чистые линии как у Вас в примере буква Z.

                                  Вам надо делать предобработку звука, а потом сохранять полученное изображение.

                                  PS. Тем, кто занимаются моделированием нейронов и памяти, тоже будет интересен Ваш опыт.
                                    0
                                    Кстати, если изображение состоит из простых и чётких элементов, то это сильно ускоряет алгоритм, т.к. можно не учитывать «чёрные» точки исходного изображения.
                                      0
                                      Аналогично для векторной графики, алгоритм разгоняется, т.к. есть возможность обходить только точки отразившие свет.
                                    0
                                    что-то мне это напомнило…

                                    Fractal compression is a lossy compression method for digital images, based on fractals. The method is best suited for textures and natural images, relying on the fact that parts of an image often resemble other parts of the same image. Fractal algorithms convert these parts into mathematical data called «fractal codes» which are used to recreate the encoded image. (Wikipedia)

                                    а также

                                    Wavelet compression is a form of data compression well suited for image compression (sometimes also video compression and audio compression). Notable implementations are JPEG 2000 for still images, and REDCODE, the BBC's Dirac, and Ogg Tarkin for video. The goal is to store image data in as little space as possible in a file. Wavelet compression can be either lossless or lossy. (Wikipedia)
                                      0
                                      Ну, к компрессии это особого отношения наверное не имеет. Есть более «гуманные» методы (в т.ч. приведённые вами).
                                      Кстати, немножко не в тему — когда-то мне попался файл какого-то экзотического формата, как оказалось — сжатый как раз «фрактальной компрессией». Некоторое время потратил на поиски вьювера чтоб посмотреть этот файл. Открывался файл наверное минут 20, но когда открылся, меня очень поразило соотношение размера изображения и размера файла (в смысле — ну очень сильно сжато, и довольно качественный результат)
                                      0
                                      1. Получается, за 4 часа 1 мегабайт звука можно же закодировать было? Почему не попробовал?))
                                      2. Чтобы не было шумов и свистов, кодировать надо спектральную картину звука.
                                      3. В модели было бы неплохо добавить уменьшение сигнала от расстояния.

                                      За статью спасибо, я тоже думал над этим вопросом, но не получалось, потому что казалось, что фотопластина хранит больше параметров, а теперь понятнее стало, хоть и не до конца.

                                      Я себе, в общем, как-то немного по-другому представлял голографию:

                                      ru-neuroscience.livejournal.com/63907.html
                                        0
                                        1. 10 килобайт — 1 минута, 1 час = 10 килобайт *100, т.е. выполнялось бы в 100*100 раз дольше, т.е. 170 часов.
                                        2. это голограмма Фурье, уже писал про неё в комментариях.
                                          0
                                          1 час = 10 килобайт * 100 — в смысле 1 мегабайт = 10 килобайт* 100.
                                          0
                                          3. Изначально так и было, но вроде бы ничего особого это не давало. В данном случае считаем, что объект настолько далеко от фотопластинки, что расстояние не сильно уменьшает сигнал (в определённый момент времени звезда тоже наверное ближе к одной точке земли, чем к другой, но на яркость это считай не влияет).
                                          0
                                          Решил привести несколько ссылок из журнала, о котором сказал выше:
                                          1. Синтез цифровых галограмм
                                          2. Здесь про схему Д. Габора
                                            0
                                            1. Там про «Радужные голограммы», это те которые видимы в обычном свете (те которые на разных «защитных наклейках» используют).
                                            2. А вот это интересно, там как раз про минимизацию шумов (выбор оптимальных параметров)
                                            0
                                            > по поводу коэффициента 0.3 — будет написано далее
                                            > Коэффициент в этой строке $obj_light=($data[$x0][$y0])*0.3; подбирается. Хотя можно для него и формулу вывести, правда отдельно для случая кодирования и случая декодирования.

                                            Уважаемый автор статьи, очень хотелось бы подробнее узнать про этот коефициент и если возможно, сбросить формулы (или источник), чтобы понять как его подбирать. Спасибо.

                                            Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                            Самое читаемое