О спиралях
Прежде всего, посмотрим на источник вдохновения, который я случайно нашёл в Интернете:

Рисунок 1. Фотография «An infinity of Mega Pixels». Источник
Каким преобразованиям подвергся этот снимок? Что нужно сделать с обычной фотографией, чтобы получить это? Какое должно быть исходное фото? — Эти вопросы я задавал себе в течение часа. Пока, наконец, меня не озарило: на фотографии отсутствует объектив фотоаппарата! А что вместо него? Вместо него... эээ... вся остальная фотография.
Т.е. исходное изображение можно представить в виде кольца с вырезанной в середине дыркой. Форма дырки может быть любой. Кроме того, любой может быть форма внешней границы. Например, это может быть всё оставшееся изображение. В качестве примера возьмём кольцо, изображённое на рисунке 2:

Рисунок 2. Кольцо. Отсутствующая область показана «шахматной доской»
Теперь, когда мы знаем, как выглядел исходный снимок (это была обычная фотография с вырезанным объективом), мы можем понять, что нужно сделать с фотографией, чтобы она выглядела так, как на рисунке 1: нужно разрезать кольцо в каком-нибудь месте, и намотать его внутрь в спираль, бесконечно повторяя. Но делать это нужно с умом. Прежде всего, нужно подобрать такое преобразование координат, чтобы радиусы остались перпендикулярными периметру. Если этого не сделать, то будут сильные геометрические искажения. Немного поупражнявшись с компле́ксными числами, можно прийти к выводу, что периметры и радиусы должны превратиться в два взаимно-ортогональных семейства логарифмических спиралей. Иного не дано!
Так может выглядеть один виток спирали после разрезания кольца:

Рисунок 3. Кольцо, закрученное в один виток спирали.
Изображения различаются скоростью убывания радиуса спирали
На самом деле, на рисунке 3 изображён один виток результирующей спирали. В этот виток попало чуть больше одного витка исходного кольца: это видно по красной точке. Именно при такой скорости «продвижения вдоль кольца» мы получаем конформное отображение, сохраняющее углы.
Осталось сделать совсем малое: бесконечно продлить изображение спирали в обе стороны. При этом считая, что более мелкие витки визуально находятся, например, за более крупными. Подобрав скорость убывания радиуса так, чтобы внешняя часть витка состыковалась с внутренней частью предыдущего витка, получим:

Рисунок 4. Кольцо, закрученное в бесконечную спираль
Уже лучше. Отсюда видно, кстати, что «радиусы» — не прямые линии, а тоже логарифмические спирали, в каждой точке перпендикулярные «диаметрам».
Теперь нужно сделать то же, но с настоящей фотографией. Нужно лишь найти кольцо! Оглянувшись вокруг себя, я увидел много колец. Но одно из них мне понравилось больше всего — это жена Алина:

Рисунок 5. Фотография для обработки: жена с картиной в руках.
Обои на стене поели кролики
Чем не кольцо? Осталось лишь вырезать дырку (изображение специально расширено, чтобы было видно кольцо, образованное непрозрачной областью):

Рисунок 6. Фотография с вырезанной дыркой
Важное замечание: дырку лучше всего вырезать с помощью инструмента Extract в программе Adobe Photoshop. Другой способ не позволит получить качественное изображение! Как бы тщательно вы не сделали выделение вдоль края дырки, после удаления внутренности у вас останется старый переход цветов в бывший цвет дырки по краям. В отличие от простого выделения, инструмент Extract кроме удаления лишних пикселов (плавного ухода в прозрачность), позволяет пересчитать цвет изображения на границе, убрав плавный переход в цвет фона. «После такого пересчёта изображение может быть наложено на фон другого цвета» — так написано в справке Adobe Photoshop. И это абсолютно верно! «Фоном другого цвета» в нашем случае будет являться само изображение.
Разрезая кольцо и бесконечно его наматывая, можно получить желаемый результат:
Изображение, показанное на рисунке 7, намотано от наблюдателя. Намотка на наблюдателя тоже может дать интересные результаты:

Рисунок 8. Спираль, намотанная на наблюдателя. Оригинальное изображение
Программа
Ну а теперь самое главное — моя программа.
Её можно скачать отсюда: Spiral.zip (167 Кбайт, скачано 638 раз). Вполне может глючить. Найдёте ошибку — пиши́те.
Программа достаточно мощная. Она может закручивать изображения в две стороны (по- и против часовой стрелки), а также к наблюдателю и от наблюдателя. Программа способна работать с 16-ти битным цветом (внутреннее представление цвета — всегда 32 бита на канал, HDR, учитывается динамический диапазон исходной фотографии при смешении цветов) и 16-битной прозрачностью. Имеется хорошая интерполяция (на уровне бикубической), а также адаптивный антиалиасинг. Программа вполне может обработать бесконечное число витков за конечное время благодаря специальным алгоритмам упрощения и отсечения. Кроме того, поддерживается работа на многоядерных процессорах.
Исходное изображение — обязательно PNG с прозрачностью (альфа-канал) с глубиной цвета 8 или 16 бит на канал. PNG может быть как Interlaced, так и сплошной. Я целый день потратил на добавление поддержки 16-битных PNG в библиотеку, в которой изначально такой поддержки не было.
Подготавливаете исходное изображение, как описано выше, перетаскиваете мышкой на значёк программы. Программа запускается и спрашивает у вас несколько параметров:
xc— координата x центра будущей спирали в исходном изображении. Вы должны указать точку, находящуюся в пределах дырки. К этой точке будет «стремиться» изображение. Например, если точка находится выше центра дырки, то каждый виток будет шире внизу и у́же вверху. Если же, например, снизу каждого витка у вас появилась нежелательная «пустая» область, то центр спирали нужно сместить вниз.yc— координата y центра спирали в исходном изображении.kRho— во сколько раз следующий виток меньше предыдущего. В примерах выше я использовалkRho, не сильно отличающийся от 0.5. Если это число отрицательное, то намотка будет вестись к наблюдателю. В этом случае дырка в изображении не обязательна (см. рисунок 8).kPhi— во сколько раз виток спирали будет длиннее, чем виток оптимальной длины. При оптимальной длине искажения минимальны, однако изображение «разворачивается» при уходе вдаль. Чтобы этого избежать, можно ввестиkPhiчуть больше единицы (программа подсказывает значениеkPhi, нужное для получения параллельных линий).Result image width— ширина результирующего изображения (целое число пикселов)Result image height— высота результирующего изображения (целое число пикселов)Color toning factor— динамический диапазон исходного изображения. Если изображение снято при ярком слепящем свете, то этот коэффициент можно сделать больше единицы, например, 3.0. Для спокойных пасмурных световых условий подойдёт значение 1.0. Этот коэффициент используется для правильного наложения теней (если вы решите сделать исходный файл с тенями, отбрасываемыми на прозрачность), а также правильной обработки бликов и антиалиасинга.High-quality processing: вводите «y» или «n» в зависимости от того, хотите ли вы, чтобы программа работала очень долго, но произвела качественную картинку, или же в два раза быстрее, но картинка будет менее качественной.
_spiral» к имени исходного файла.
Пример
Картинки с кружками, приведённые выше — для демонстрации. В них прозрачность убрана и показана при помощи шахматной доски.
Программе же нужна такая картинка: с прозрачностью, с дыркой внутри (при намотке на наблюдателя дырка внутри не нужна) и (возможно) по краям:

Рисунок 9. Образец исходного файла
Затем вводим параметры в программу...
SAn Spiral 1.01 Beta. Copyright (C) 2008 Sukhinov Anton E-mail: #########@GMail.com Enter xc (spiral center in the source image): 232 Enter yc (spiral center in the source image): 232 Enter kRho (0.0<kRho<1.0): 0.4 Enter kPhi (...): 1.0 Enter result image width: 464 Enter result image height: 464 Enter color toning factor (default: 1.0): 1.0 Use high-quality processing? (y/n): y Loading D:\ring.png... Processing: Scanning image... Remapping using 2 processor kernels... Done in 4 seconds. Saving D:\ring_Spiral.png... The program finished successfully. Press [Enter] to exit...
...и получаем результат (со спиралевидной дыркой):

Рисунок 10. Результат обработки файла с рисунка 9
Другие программы
Конечно же, моя программа — не единственная. Существуют другие программы, позволяющие получить похожие картинки:

18 отзывов на запись «О спиралях»
Автор: Александр. Дата: 19-го октября 2008 г. Время: 01:50.
Антон, у меня возникло несколько вопросов при работе с Вашей программой
Возникает ошибка при работе:
Error: Source image must have RGBa format
Не могли бы вы объяснить, что мне нужно исправить, для того чтобы программа заработала, и ещё: где регулировать глубину цвета изображения в формате .png.
Заранее спасибо!
Автор: admin. Дата: 27-го ноября 2008 г. Время: 00:50.
Добрый день!
Эта ошибка означает, что у тебя либо не цветное изображение, либо альфа-канала (прозрачности) нет. Ведь без альфа-канала невозможно сделать дырку в изображении.
В Фотошопе проще всего сделать так:
Автор: Андрей Устюжанин. Дата: 6-го апреля 2009 г. Время: 21:29.
Только сегодня увидел в Сети «спиральные» картинки, и уже попробовал сделать такую-же. Всё отлично получилось. Огромное спасибо автору!!! Вот благодаря таким талантам и становишься горд за Россию.
Автор: Sannis. Дата: 30-го мая 2009 г. Время: 00:25.
А при какой ошибке выводится сообщение
?
Автор: Антон. Дата: 30-го мая 2009 г. Время: 22:03.
К сожалению, программа понимает только .png-файлы.
Автор: Sannis. Дата: 1-го июня 2009 г. Время: 01:15.
Спасибо, после прочтения содержательной части замечание про формат файла не заметил
Побежал пробовать
Автор: VEPWOOTTLAP. Дата: 15-го октября 2009 г. Время: 05:35.
Hi People
How are you doing?
Автор: Egor. Дата: 2-го февраля 2010 г. Время: 22:59.
пишет:
Error: Floating point division by zero
в чем проблемма?
Автор: Антон. Дата: 2-го февраля 2010 г. Время: 23:24.
Интересно. Скажите, какие параметры вы вводите программе, и какие размеры исходного изображения?
Автор: Lena. Дата: 10-го февраля 2010 г. Время: 12:55.
Никак не могу скачать саму програмку! Сохраняет в html и все!((((((
Подскажите что неправильно делаю!!!
Автор: Антон. Дата: 10-го февраля 2010 г. Время: 20:59.
Это ошибка сайта. Буду искать причину…
Автор: Антон. Дата: 10-го февраля 2010 г. Время: 22:11.
Вроде бы исправил.
Автор: Lena. Дата: 11-го февраля 2010 г. Время: 00:04.
Спасибо! Скачалась! Вот только теперь надо с RGB разобраться! Не все изображения хочет читать!)
Автор: Lazer. Дата: 4-го апреля 2010 г. Время: 15:22.
Обои на сте не по ели кро ли ки
Автор: GDL. Дата: 27-го апреля 2010 г. Время: 12:23.
Молодец автор:) хорошая программа, все работает все получается, мне нравится. Спасибо!
Автор: Анастасия. Дата: 27-го апреля 2010 г. Время: 14:24.
Error: you must specify one file name in the command-line
Press [Enter] to exit…
что делать?
Автор: Олег. Дата: 12-го июля 2010 г. Время: 14:47.
Насколько понимаю английский, программа выдаёт ошибку, что центральные и соседние с ними пиксели должны быть пустыми. Хотя я пробовал и квадрат и круг, вводил координаты центра точно. Правда у меня в центре не как у вас в примере квадратики, а белое место, ластиком же стираю. Может маловато изображение или «дырка» в центре? У меня 420х420 пкс изображение
Автор: Tweets that mention О спиралях | Image Processing -- Topsy.com. Дата: 15-го ноября 2010 г. Время: 16:05.
[...] This post was mentioned on Twitter by Kles4enko Andrey, Julia. Julia said: @likimoki http://iproc.ru/image-processing/spirals/ глянь, что я только что нашла!!! Классно?
[...]