Эксперимент с голографическим кодированием/декодированием цветных изображений

image

Однажды я был поражён одним из удивительных свойств голограммы, которое заключается в том, что разбив голографический снимок объекта на осколки, по каждому из осколков можно восстановить изображение всего объекта, правда с несколько ухудшенным качеством. Прочитав топик «Эксперимент с голографическим кодированием и декодированием информации» товарища eresik я непременно сам захотел реализовать подобную цифровую голограмму. Взяв за основу его алгоритм, я запустил Delphi и принялся за дело. Наконец, немного повозившись с коэффициентами, я стал получать адекватные чёрно-белые картины похожие на те, которые получал eresik. При затирании части голограммы, как ни удивительно, исходное изображение восстанавливалось! Так каким же образом это может происходить? Я попытаюсь рассказать, как можно наглядно объяснить это свойство голограммы, не вдаваясь в физику и математику.

Рассмотрим исходный объект, который представляет собой изображение с единственной белой точкой и полученную на его основе голограмму рядом:

imageimage

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

Результат восстановленного по голограмме изображения:
image

Да… и взяв, например, не белую, а серую точку (меньшей яркости) мы получим соответственно те же волны только серого цвета (меньшей интенсивности). Т.е. по голограмме мы можем восстановить не только положение точки, но и её яркость. Теперь отколем от имеющейся голограммы примерно половину. Внимательно посмотрим на оставшуюся часть:

image

Становится понятно, что даже по этому куску мы можем понять, откуда расходятся волны, и соответственно можем определить положение исходной точки.

Восстановленное из осколка голограммы изображение:
image

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

image

По этой картине мы так же можем с лёгкостью определить положение наших точек. Снова отколем определённую часть голограммы и по оставшемуся осколку опять же можно определить, где примерно располагаются точки.

imageimage

Таким образом, каждая точка голограммы в определённой мере содержит информацию о целом объекте.

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

image

Однако в ней содержится достаточно информации, чтобы восстановить исходное изображение такого качества:

image

В этом случае можно видеть, что восстановленное изображение становится зашумлено больше чем в случае одной или двух точек и едва ли можно будет использовать в качестве исходного изображения что-то кроме нескольких контрастных точек. Как писал eresik есть две причины сильных шумов. Первая из них заключается в том, что яркости точек округляются до целых в диапазоне 0..255. Но как оказалось в ходе экспериментов этот фактор не играет решающей роли. Главным образом уровень шумов определяется разрешающей способностью фотопластинки. В изображениях приведённых выше использовалось разрешение исходной картинки 16x16 и фотопластинки 256x256 пикселей, что неплохо, однако длинна волны W в угоду наглядности была выбрана слишком большой = 2. Благодаря этому волны были хорошо видны, но не использовался весь потенциал разрешающей способности фотопластинки. Выбрав меньшую длину волны W=0,1 можно существенно снизить уровень шумов.

Оригинал, голограмма и восстановленное изображение при W=0,1:
imageimageimage

Однако для конечного разрешения фотопластинки существует предел минимальной длины волны, переходя который начинает проявляться сильный шум.

Голограмма и восстановленное изображение для W=0,003:
image image

Я немного усовершенствовал алгоритм товарища eresik добавив обработку цветных изображений. Подобно получению настоящей голограммы на фотопластинке экспонируются интерференции волн трёх разных длин соответствующих красному, зелёному и синему свету. Так же теперь разрешение голограммы может быть отличным от разрешения исходного изображения.
В начале топика вы могли видеть пример восстановления цветной картинки 16x16 с фотопластинок 192x192, 128x128, 64x64 и длинами волн WR=0,03; WG=0,029; WB=0,028. Ниже представлен случай восстановления исходного изображения 32x32 для фотопластинки 192x192 с теми же параметрами:

image

Т.о видно, что в зависимости от выбранного разрешения мы получаем при декодировании изображения разного качества.

И, на конец, вы можете сами попробовать программу в действии, использовать различные входные данные, менять разрешение, длины волн. Программа позволяет загружать bmp файлы в качестве исходных изображений, вносить в них изменения, затирать/зашумлять голограмму, а так же вычислять степень отличия восстановленного изображения от исходного на основе яркости пикселей. Различие в 100% означает, что восстановленное изображение инвертировано по отношению к исходному.

Скрин программы с неудачной попыткой перекодировать Хабр:
image

Программа
Исходный код
Поделиться публикацией

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

    +53
    На самом деле не так уж удивительно, что в картинке 256x256 содержится достаточно избыточной информации, чтобы восстановить картинку 16х16 :)

    image
      +12
      Пожалуй, да, но больше удивляет то, что происходит это с разбитой стекляшкой и информация восстанавливается дневным светом.
        +1
        «Простая стекляшка» — это, наверняка, голограмма Денисюка, которая содержит фронт стоячей волны по всей толщине фоточувствительного материала.
        Соответственно, её можно смотреть со всех сторон и в дневном свете.
          +1
          Да, но если её разбить, каждый осколок в дневном свете будет осколком.
            +1
            В каждую точку попадает свет от всего предмета, поэтому (в пределах разрешающей способности фоточувствительного материала) в каждом маленьком кусочке и есть полное изображение.
            Более того, с разных углов мы видим действительно под разными углами.
              +2
              И это не как не противоречит факту, что осколок голограммы Денисюка, будет показывать в дневном свете только соответствующий кусок изображения, в него можно заглянуть под углом и увидеть чуть больше, да, но визуально это всё равно кусок, а не целое изображение.
              Уж поверьте человеку, который не один десяток пластинок разбил в процессе экспериментов :-)
                +1
                Да, каждый осколок — это изображение всего предмета, но с определённого ракурса.
                Я голограммы не бил, но делал в полукустарных условиях.
                  +2
                  А как вы их делаете? :) Или где берёте.
                    +1
                    Брать тут www.slavich.ru/?id=24\

                    В домашних условиях сделать фотопластинку можно, но это немного напряжно, тк коллойдная химия не так проста как может показаться на первый взгляд, и что бы получить действительно интересный фотоэмульсионный слой, бывает нужно создавать специальные физические условия.
                    Именно по этой причине, в СССР с фотоматериалами было плохо.
          0
          Не забывайте, что глограмма (сама фотопластинка) — чёрно-белая, т.е. правильная фраза, «на картинке 256x256 содержится достаточно информации, чтобы восстановить картинку 48x48)», что уже хоть немножко, но удивительнее :)
            0
            16*16*3 != 48*48
          0
          Но почему такого не происходит с голограммами на металлической плёнке, как те, что клеют на карты Visa?
            0
            Потому что это псевдоголограммы. На настоящих голограммах записано не изображение в привычном смысле, а фронт волны, который был в момент съемки от объекта. С этим и связана возможность восстановления изображения на кусочках.
              0
              А что значит «псевдо»? Принцип создания обычных голограмм мне известен, в чём отличие голограмм на плёнке?
                +2
                Не хочу показаться грубым, но если вы действительно понимаете как записываю настоящие голограммы, ваш вопрос излишен.
                То, что вы называете голограммой на карточках Visa, имитация 3D — изображения. С голограммой их объединяет только кем-то придуманное маркетинговое решение в названии. Отсюда простой вывод: не все, что выглядит трехмерным и называется голограммой — суть голограмма.
                  0
                  И к тем голограммам которые «на карточках Visa» — если не ошибаюсь данный алгоритм особого отношения не имеет. Эту «голограмму» нельзя осветить «белым светом», а как и в «настоящей» — только светом той же длины волны, что и при записи.
                    +1
                    Не хочу показаться грубым, но определение «имитация 3D — изображения» совершенно не передаёт физическую суть явления. Впрочем, в соседних комментариях мне уже ответили по сути.
                    +3
                    Это не псевдо, а вполне обычная «тонкая» голограмма.
                    helvar видимо подразумевает под «настоящей голограммой» — записанную на толстой пластинке, где интерференция происходит не только «в ширь», но и «в глубину». По сути и принципу — ничем не отличается.
                      0
                      Извиняюсь, не досмотрел. Думал helvar приравнял приведённую здесь голограмму, и «голограмму» на «наклейках» :)
                  0
                  Скажу больше, даже с голограммами Денисюка, это происходит тоже!
                  Другое дело что с осколка можно про экспонировать целую голограмму, проявить её и получить целое изображение с некоторой потерей чёткости.
                  0
                  Лучше проведите эксперимент с записью разных изображений на одну пластинку (освещая разными длинами волн), и восстанавливая по отдельности. Это придаст больше «магии» :)
                  А то я как-то в своём эксперименте забыл это сделать :)
                    0
                    Да, и ещё, может быть тоже влияет на качество, если почти «дословно» использовали мой исходник — я не уверен что правильно рассчитывал яркости пикселей. Надо заглянуть в учебник по физике.
                    Там получалось что рассчитывается «амплитуда» результирующей световой волны, а на пластинку вроде бы должна записывается «интенсивность» (если не ошибаюсь интенсивность=амплитуда^2, или наоборот? :) )
                      0
                      Последнее что вспомнилось — формула I=I1+I2+sqrt(I1*I2)*cos(Phase), где I — интенсивность.
                        0
                        Да интенсивность=амплитуда^2
                          0
                          Конечно, записывая вместо амплитуды интенсивность, качественно картина не поменяется, но уровень шумов становится ниже
                          0
                          Хотя… Я так понимаю «цветность» вы именно по такому принципу и добавили — используя разные длины волн для записи разных составляющих цвета.
                            0
                            Да, три длины волны на три канала
                          0
                          Автор, не мучайте людей, выложите файлы на нормальную шару, например ompldr.org/
                          Я так и не смог скачать, вместо архива мне подсовывают какой-то iMeshV10.exe, который то-ли троян, то-ли черт знает что.
                            0
                            Что за ужасный обменник вы мне порекомендовали. Вместо файла подсовывает картинку с рожей!
                            Чтобы не подсовывали трояна нужно жать на оранжевую кнопку в правом углу DOWNLOAD NOW
                              0
                              Нормальный обменник, только там .exe нельзя. Заливайте архивы и все будет в порядке. Большой плюс этого обменника в прямых ссылках и отсутствии троянов.
                                +1
                                Это ужасный обменник. Никогда никому его не рекомендуйте. Для определённого списка хостнеймов (habrahabr.ru там есть), которые могут появиться в поле Referer, оно отдаёт «рожу» (за что я когда-то поплатился здесь кармой).
                            –4
                            Очень хорошее исследование вопроса. Аффтар молодец! Все сделано очень наглядно, за что жирный плюс.
                              +2
                              Вообще, люди вон вручную вырезают эти «интерференционные линии», и ничё так получается
                              www.youtube.com/watch?v=XUy8lELWhJg

                              Можно сделать программу чтоб рассчитывала «что где вырезать» :)
                                +1
                                Программа для этого не нужна :) Нужны: картинка, кусок пластика и циркуль-измеритель.
                                www.youtube.com/watch?v=0uko9oixijg
                                  0
                                  К стати, раз уж пошла такая пьянка, то я в своё время делал голограммы с несколькими вокселями, рассчитывая интерференционную картину как и автор статьи.
                                  Потом я фотографировал её с экрана, на слайд и получалась голограмма вокселей :-)
                                    0
                                    А можно поподробней?
                                  0
                                  Нисколько не умаляя вашего исследования, все же хочу отметить, что перевод изображения в частотную область, то же ДКП, даст схожий эффект. Не в плане физической сущности, а в плане результата — у вас на выходе будет 2Д картинка, повредив часть которой вы по-прежнему сможете восстановить исходное изображение. Единственное что, я так понимаю, в случае с голограммой все равно какая ее часть будет повреждена? С ДКП-то такой фокус не пройдет, если убьете коэффициенты, отвечающие за нижние частоты, результат будет не слишком приятным…
                                    0
                                    QR-код размером 29*29, пропущенный через программу выглядит серой сеткой. Декодированный с очень большим цветным шумом, что я даже слабо вижу схожесть с оригиналом. Чёрное остаётся чёрным, а белый фон — имеет разный цвет.
                                    Зато телефон qr-код распознаёт.
                                      0
                                      Чёрно-белые изображения лучше прогонять установив одинаковую длину волны для красного, зелёного и синего канала. Тогда при декодировании будут только оттенки серого.
                                      +1
                                      спасибо за статью! реализовал данный алгоритм под OpenCV:
                                      image
                                        0

                                        Смотрел на картинки, долго думал, и только потом понял, что есть неточность. Реальная голограмма точки выглядит иначе — разбегающиеся волны становятся всё тоньше с увеличением расстояния от центра. (ссылка на википедию) Причём на больших расстояниях волны лучше вообще не рисовать, так как при размере "волны" меньше двух пикселей там будет мешающий шум и муаровые узоры.
                                        Впрочем, такой вариант будет работать иначе — по маленькому кусочку голограммы будет можно восстановить только часть изображения в некотором круге.

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

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