20151203

Створюємо стереограми2

Программа CreSter | Для создания стерео-картинок используя два графических файла

Автор: Багаев Д.
Год: 2001
Вес в архиве: 753 КБ (771 396 байт) | Как работать с данным форматом читайте в "Архиватор RAR"

Описание:Программа CreSter предназначена для создания стерео-картинок используя два графических файла - чёрно-белую BMP-шку (в дальнейшем просто исходный объём - ИО) и длинную, "худую" полоску тоже в формате BMP, но уже в цвете - текстуру (я привык называть её Background - БГ). Так вот, вводите имена этих файлов в специальные окошки и программа выполняет трансформацию их в одну - стерео-картинку.




Для того, чтобы программа работала правильно (вообще работала), важно правильно использовать её возможности. Как я уже говорил, ИО должен быть в формате BMP и иметь 256 цветов. Ниже приведён пример такого ИО (подправленного в другой формат для INTERNET-а), сделанного в Photoshop-е (он ставит палитру, о которой читайте дальше, подходящую для программы).




Так вот о палитре - она чёрно-белая, т.е. чем светлее точка, тем её номер должен быть больше. Это нужно для простоты создания картинок. Чем светлее точка, тем она будет ближе в стерео эффекте т.е. после трансформации слово WOW будет казаться приближенным на дальнем фоне.

Также для создания стерео-картинок необходим и другой графический файл - БГ. Собственно из размноженного БГ и получается требуемое изображение (как именно это происходит, ну в смысле алгоритм преобразования БГ и ИО в одну - стерео, читайте ниже). Он, как и ИО, должен иметь формат BMP и 256 цветов, но уже с произвольной палитрой.




Ниже представлена картинка, получившаяся в результате работы моей программы. Если вы посмотрите на неё, как на стерео-картинку (о том как смотреть такого рода картинки, читайте ниже), то увидите надпись WOW как на ч-б картинке, представленной выше.





Алгоритм построения стереограмм




Алгоритм построения стерео-картинок достаточно прост, несмотря на то, что мне пришлось потратить чуть меньше недели на его понятие. Просто мне до этого никто не рассказывал его, а перед моим лицом была только готовая картинка из книжки. Ну да ладно - не буду оправдываться, а лучше избавлю вас от страданий :-).

Начнём...

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

Теперь приступим к самому главному.

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

А если попробовать обмануть глаза (мозг)?

Именно это и происходит, когда смотришь такую картинку. Ведь есть и ещё одно свойство глаз.

А как глаза находят точку, в которой надо "пересечь лучи"?

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

На стерео-картинке такими фрагментами являются пиксели, а точнее их цвета. Давайте взглянем на картинку, которую я специально нарисовал по этому случаю.




Представьте, что это вы :-).

Вид сверху.

О чём я и говорил - точка c находится ближе точки d. Мозг это понимает сравнивая углы AcB и AdB. Не зря я упомянул и о том, что в глазах немного разные картинки, и что мозг меняет углы для нахождения похожих участков. Так как точка d одна, а глаза два, то в каждом глазе она и будет являться тем фрагментом, в котором надо пересечь "лучи", т.е. в одном глазе её изображение будет похоже и на изображение её же в другом глазе - ну это логично (это же одна и таже точка).

Теперь попробуем обмануть мозг.

Поставим перед собой картинку, которую следует превратить в стерео.

Как надо расставить на ней точки, чтобы "надурить глаз"?

Обратите внимание на точки a b и e g. Чтобы глаз увидел подобные участки (точки), они должны быть одинаковы (хотя иногда и это правило можно обойти, но это довольно сложно сделать, хотя вполне реально, ведь мозг ищет подобные фрагменты не только по цвету, но и по форме).

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

Получается, что чем ближе друг к другу расположены одинаковые точки (или целые фрагменты), тем они кажутся нам ближе в пространстве. Ещё раз взгляните на рисунок, и посмотрите, где пересекают лучи лист бумаги, где в последствии они сами пересекутся и какое при этом будет расстояние точек пересечения лучей с бумагой.

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

Теперь посмотрим, как строит картинки моя программа.

Для простоты обозначим "исходный объём" за ИО, а Background за БГ. Прежде всего надо создать поле для рисования (сдвига точек для образования стерео). Роль такого поля будет выполнять рисунок, получившийся в результате размножения БГ. Таким образом мы получим уже стерео-картинку, но только с задним (самым удалённым) фоном.

Сразу скажу, что ширину БГ я буду называть периодом. Начнём...

Сдвигать (почему сдвигать - вы позже поймёте) можно с любой стороны, а можно от центра (советую вам именно так и делать), но для простоты объяснения будем это делать слева на право. На счёт ограничений - ИО должен быть в формате BMP 256 цветов, причём с чёрно-белой палитрой (её очень хорошо ставит PHOTOSHOP), БГ также должен быть в формате BMP и иметь 256 цветов, но уже с произвольной палитрой. Обработаем одну точку ИО. Не зря БГ должен иметь ч-б палитру, т.к. это нужно для алгоритма построения - чем светлее точка, тем её номер должен быть больше. Так вот читаем точку из ИО.

Запоминаем её номер (для простоты назовём его буквой Н). Затем обращаемся к строке рисунка размноженного БГ.

Начинаем сдвиг: первую точку, соответствующую положению той же точки в ИО, не трогаем, а точку, взятую через период, сдвигаем влево на Н точек. Затем сдвигаем точку, взятую через два периода на Н точек, через три и т.д. до конца строки.

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

Собственно всё...

Проделываем эту операцию со следующими точками, тем самым получаем стерео-строку.

Проделываем тоже самое с точками в следующей строке и так далее.

Получаем стерео-картинку!!!

Правда есть пара нюансов, без которых у вас получится не "рулезная" картинка. Это мои ноухау...

Дерзайте!

Немає коментарів:

Дописати коментар