Гималайская (Гималайская) улица в Варшаве, Польша - это короткая (чуть менее 1 км) улица, на которой нечего предложить, кроме кучи гаражей. Мой друг @bartekchlebek рассказал мне об этом месте. Он и его девушка наткнулись на него во время прогулки по городу. Он пригласил меня на похожую прогулку и был взволнован, чтобы поехать туда снова. Когда мы наконец поехали, я понял почему. Что действительно интересно в этом месте, так это то, что почти каждая дверь гаража окрашена в свой цвет.

Каждый хозяин выбирал понравившийся цвет. Совершенно очевидно, что не было никаких коллективных усилий для сохранения какой-либо визуальной согласованности. Это скорее конкурс красоты.
Также предельно ясно, какие гаражи используются, а какие нет. Некоторые из них аккуратные, другие явно запущены.

Я не проводил обширных исследований истории этого места, но выяснил, что оно каким-то образом связано с находящимся поблизости аэропортом Бабице и имеет военное прошлое.

Фотосессия

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

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

В итоге я сфотографировал 135 гаражей, это даже не половина того, что там есть. Я не хотел использовать гаражи с деревянными дверями. Также некоторые гаражи с металлическими дверьми расположены так, что всегда создают резкие тени.
В любом случае… легкая часть закончилась. Пришло время написать программу.

Кстати ... Я не разработчик программного обеспечения. Я решил изучить Action Script 3 и приобрел некоторые навыки буквально за несколько мгновений до того, как технология умерла. Я до сих пор использую Flash для создания некоторых инструментов для своих личных проектов.

Сортировка цветов

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

В тот же момент я понял, что много лет назад изучал, как работает Magic Wand в фотошопе, и поделился им с группой пользователей. Я знал, что могу использовать эти знания для создания своего алгоритма сортировки.

Волшебная палочка выбирает область пикселей, цвет которой похож на выбранный пиксель. Сходство выбранных цветов описывается свойством Tolerance.

Я поискал в Google свой пост с описанием математики, лежащей в основе этого инструмента, и нашел его. Он был размещен в мае 2005 года.

Я узнал, что разница в цвете измеряется для каждого канала.

var dR:int = r0 - r1
var dG:int = g0 - g1
var dB:int = b0 - b1

Затем Magic Wand суммирует абстрактные значения наименьшего и наибольшего различий. Затем значение сравнивается с числом, заданным как Допуск. Если он меньше, цвет достаточно похож, чтобы его можно было выбрать.

Это было здорово. Я мог сравнить два цвета и описать их сходство одним числом. Чем меньше число, тем более похожи цвета.

var similarity:int = Math.abs(Math.Min([dR,dG,dB])) + Math.abs(Math.Max([dR,dG,dB]))

Поэтому я использовал это уравнение для построения метода сортировки. Он перемещает цвета один за другим из исходного массива в целевой массив по их сходству. Он всегда фокусируется на последнем цвете в целевом массиве для поиска наиболее похожего в исходном массиве. Полагаю, это алгоритм ближайшего соседа?

Так или иначе. Я был очень доволен результатами.

Одна вещь, о которой я не подумал, - это то, что для данного массива цветов мой метод будет давать разные результаты в зависимости от цвета, с которого он начинается.

Сначала я хотел исправить эту проблему и потратил некоторое время на изменение алгоритма, чтобы всегда производить один и тот же порядок. Это сработало, но результат меня не устроил. Я вернулся к усовершенствованию метода, но тут меня осенило:

Почему я пытаюсь получить только одно изображение, когда у меня может быть 135 уникальных изображений?

Я остановился. Метод сортировки был выполнен.

Какого цвета гаражные ворота?

Следующим шагом было извлечение цвета из фотографий. Я имею в виду. Мне нужно было только одно значение HEX для каждой фотографии.

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

Я потратил весь день на ручную обрезку и настройку геометрии фотографий.
Как только они были подготовлены, я запустил свой скрипт, который извлек цвета и создал массив объектов, ссылающихся на BitmapData, а также на связанные с ним значения R, G, B, H, S, V и HEX.

Окончательные изображения

Итак, у меня был метод извлечения цветов, у меня был алгоритм сортировки. Пришло время заставить их работать и создать окончательные изображения. Я использовал асинхронный кодировщик png Ли Берроуза. Это спасло мне жизнь, так как стандартный кодировщик не смог обработать такое огромное растровое изображение.

Так что я просто сидел и смотрел, как картинки падают на мой жесткий диск, пока работает сценарий.

Несмотря на то, что я был творчески и эмоционально вовлечен во все аспекты этого дурацкого проекта, я был странно поражен. Я стал первым потребителем собственного искусства. Как будто я только что наткнулся на галерею и ничего не ожидал.

Я люблю их всех. Решил напечатать цифру 57.

Это все, что я хотел сказать о Гималайской улице. Сейчас. Я планирую снимать еще и создать еще одну партию из 200+ и 300+ фотографий.

Если у кого-то из вас двоих, кто дочитал его до конца, возникнет вопрос, не стесняйтесь оставлять комментарий (или, наверное, напишите мне в твиттере)