![image](https://habrastorage.org/getpro/habr/post_images/d39/e07/125/d39e07125c29ee94b8d95f4e7442c71b.jpg)
Однажды я был поражён одним из удивительных свойств голограммы, которое заключается в том, что разбив голографический снимок объекта на осколки, по каждому из осколков можно восстановить изображение всего объекта, правда с несколько ухудшенным качеством. Прочитав топик «Эксперимент с голографическим кодированием и декодированием информации» товарища eresik я непременно сам захотел реализовать подобную цифровую голограмму. Взяв за основу его алгоритм, я запустил Delphi и принялся за дело. Наконец, немного повозившись с коэффициентами, я стал получать адекватные чёрно-белые картины похожие на те, которые получал eresik. При затирании части голограммы, как ни удивительно, исходное изображение восстанавливалось! Так каким же образом это может происходить? Я попытаюсь рассказать, как можно наглядно объяснить это свойство голограммы, не вдаваясь в физику и математику.
Рассмотрим исходный объект, который представляет собой изображение с единственной белой точкой и полученную на его основе голограмму рядом:
![image](https://habrastorage.org/getpro/habr/post_images/146/32e/d63/14632ed63458b4b6ccffd658e9d557c0.jpg)
![image](https://habrastorage.org/getpro/habr/post_images/b9b/f42/86d/b9bf4286deb07fc40901eb01a9a0f1f0.jpg)
Как видно, полученная голограмма представляет собой волны, расходящиеся из этой точки. И в отсутствии исходного изображения по этим волнам можно восстановить расположение источника этих волн — нашу белую точку.
Результат восстановленного по голограмме изображения:
![image](https://habrastorage.org/getpro/habr/post_images/75f/cb0/4d8/75fcb04d89d2ee4e23510cd3e811008c.jpg)
Да… и взяв, например, не белую, а серую точку (меньшей яркости) мы получим соответственно те же волны только серого цвета (меньшей интенсивности). Т.е. по голограмме мы можем восстановить не только положение точки, но и её яркость. Теперь отколем от имеющейся голограммы примерно половину. Внимательно посмотрим на оставшуюся часть:
![image](https://habrastorage.org/getpro/habr/post_images/72b/240/494/72b24049498811682bc4b9252437aee0.jpg)
Становится понятно, что даже по этому куску мы можем понять, откуда расходятся волны, и соответственно можем определить положение исходной точки.
Восстановленное из осколка голограммы изображение:
![image](https://habrastorage.org/getpro/habr/post_images/b9c/e35/ead/b9ce35ead7c14f9c5753caac811141da.jpg)
Далее раскалывая голограмму на более мелкие части в каждой из них у нас остаётся всё меньше информации о полной конфигурации волн и нам будет всё труднее точно локализовать исходную точку.
Теперь возьмём за исходное — изображение с двумя точками и построим голограмму. В этом случае на голограмме мы будем наблюдать волны расходящиеся от одной и от другой точки. Эти волны будут накладываться друг на друга, и общая картина будет представлять собой сумму этих волн.
![image](https://habrastorage.org/getpro/habr/post_images/0ca/587/b4a/0ca587b4a7731ca72d36e526353683d6.jpg)
По этой картине мы так же можем с лёгкостью определить положение наших точек. Снова отколем определённую часть голограммы и по оставшемуся осколку опять же можно определить, где примерно располагаются точки.
![image](https://habrastorage.org/getpro/habr/post_images/42c/727/611/42c727611f5456a487620fcede4c3dd0.jpg)
![image](https://habrastorage.org/getpro/habr/post_images/ef0/b28/12a/ef0b2812aa310e0ad873c2e10f7c4943.jpg)
Таким образом, каждая точка голограммы в определённой мере содержит информацию о целом объекте.
Добавляя к исходному изображению всё больше точек, мы будем видеть всё более сложные интерференционные картины. Визуально уже очень сложно определить вид исходного изображения, к примеру, такой голограммы:
![image](https://habrastorage.org/getpro/habr/post_images/671/a9d/703/671a9d703700790077d188a69c49ae84.jpg)
Однако в ней содержится достаточно информации, чтобы восстановить исходное изображение такого качества:
![image](https://habrastorage.org/getpro/habr/post_images/0d1/edc/b29/0d1edcb299e164fa6b81268f4b455947.jpg)
В этом случае можно видеть, что восстановленное изображение становится зашумлено больше чем в случае одной или двух точек и едва ли можно будет использовать в качестве исходного изображения что-то кроме нескольких контрастных точек. Как писал eresik есть две причины сильных шумов. Первая из них заключается в том, что яркости точек округляются до целых в диапазоне 0..255. Но как оказалось в ходе экспериментов этот фактор не играет решающей роли. Главным образом уровень шумов определяется разрешающей способностью фотопластинки. В изображениях приведённых выше использовалось разрешение исходной картинки 16x16 и фотопластинки 256x256 пикселей, что неплохо, однако длинна волны W в угоду наглядности была выбрана слишком большой = 2. Благодаря этому волны были хорошо видны, но не использовался весь потенциал разрешающей способности фотопластинки. Выбрав меньшую длину волны W=0,1 можно существенно снизить уровень шумов.
Оригинал, голограмма и восстановленное изображение при W=0,1:
![image](https://habrastorage.org/getpro/habr/post_images/426/ffb/1c5/426ffb1c59e0091e64a6981ef9861484.jpg)
![image](https://habrastorage.org/getpro/habr/post_images/343/088/520/3430885206b1ec7f4b72f81b0efb8ace.jpg)
![image](https://habrastorage.org/getpro/habr/post_images/66c/5a3/d13/66c5a3d13fe8c61124ff48fe2d6f5046.jpg)
Однако для конечного разрешения фотопластинки существует предел минимальной длины волны, переходя который начинает проявляться сильный шум.
Голограмма и восстановленное изображение для W=0,003:
![image](https://habrastorage.org/getpro/habr/post_images/e9b/a7b/9cc/e9ba7b9cc99f9835138461befb1a3f14.jpg)
![image](https://habrastorage.org/getpro/habr/post_images/28a/569/9e1/28a5699e15c533e951e809204839699e.jpg)
Я немного усовершенствовал алгоритм товарища eresik добавив обработку цветных изображений. Подобно получению настоящей голограммы на фотопластинке экспонируются интерференции волн трёх разных длин соответствующих красному, зелёному и синему свету. Так же теперь разрешение голограммы может быть отличным от разрешения исходного изображения.
В начале топика вы могли видеть пример восстановления цветной картинки 16x16 с фотопластинок 192x192, 128x128, 64x64 и длинами волн WR=0,03; WG=0,029; WB=0,028. Ниже представлен случай восстановления исходного изображения 32x32 для фотопластинки 192x192 с теми же параметрами:
![image](https://habrastorage.org/getpro/habr/post_images/f6b/3c7/df9/f6b3c7df9fa1797cce71150bd96d2e9d.jpg)
Т.о видно, что в зависимости от выбранного разрешения мы получаем при декодировании изображения разного качества.
И, на конец, вы можете сами попробовать программу в действии, использовать различные входные данные, менять разрешение, длины волн. Программа позволяет загружать bmp файлы в качестве исходных изображений, вносить в них изменения, затирать/зашумлять голограмму, а так же вычислять степень отличия восстановленного изображения от исходного на основе яркости пикселей. Различие в 100% означает, что восстановленное изображение инвертировано по отношению к исходному.
Скрин программы с неудачной попыткой перекодировать Хабр:
![image](https://habrastorage.org/getpro/habr/post_images/b0a/257/aa7/b0a257aa74e15f13206488f7ad0631d1.jpg)
Программа
Исходный код