Пока то-сё, пока народ не врубается и полон скептицизма, самое время добавить процессу немножко наглядности, а заодно дать пощупать руками игрушку (правда, пока что виртуальную).
Вкратце содержание предыдущих серий: 1. Очень хочется сделать такую штуку, которая изображение с камеры, закреплённой на очках над переносицей, отдаёт на тактильную матрицу. 2. Слепой человек воспринимает картинку кожей, и по ней ориентируется в окружающем пространстве. Таким образом, он получает орган чувств, функционально аналогичный зрению одним глазом. 3. ТТХ такого зрения, конечно, далеки от того, что так бездарно используем мы, зрячие. И разрешение не то, и восприятие градаций не такое глубокое. Правда, есть ненулевой шанс, что штуку получится сделать цветной (и это легко будет выяснить в ходе первых же экспериментов с тактильным пикселем), но сильно на это закладываться нет смысла.
Предлагаю сегодня поиграться с разными вариантами обработки изображений. Это нам сразу наглядно даст представление об информативности того, что будет подаваться на матрицу. То есть позволит получить ответ, например, на вопрос типа «насколько оно всё будет иметь смысл, если получится сделать только матрицу с разрешением 48×32 с четырьмя градациями по яркости?»
Сразу подумалось, что при изготовлении тактильной матрицы никто нас не заставляет размещать щекочущие элементы стандартным квадратно-гнездовым способом, то есть вот так:
Со многих точек зрения, в том числе и технологических, лучше разместить пиксели гексагонально, то есть так:
Более плотное покрытие, более гладкое воздействие, лучше обеспечивается гибкость матрицы. Алгоритмы обработки усложняются не принципиально, а кое-где так и вообще упрощаются.
Поскольку наши экраны, на которые нужно выводить результат обработки, построены именно по квадратно-гнездовому принципу, для визуализации пришлось увеличивать картинку вдвое и немножко сжульничать с геометрией. Для вывода картинок в этом посте изображения сформированы вот так:
То есть при выводе гексагональной картинки 48×32 будет получаться картинка 95×64. 95 потому что в зазубренных краях полпикселя я буду отрезать.
Варианты обработки: 1. Разрешение 150×100, в цвете, 10 градаций по каждому каналу, применён «наколеночный» алгоритм тоновой коррекции, который я назвал «Локальная гистограмма». 2. 75×50, без цвета, 10 градаций, «Локальная гистограмма». 3. 75×50, без цвета, 10 градаций, коррекция «Глобальная гистограмма». 4. 75×50, без цвета, 10 градаций, без коррекции. 5. 48×32, без цвета, 10 градаций, «Локальная гистограмма». 6. 48×32, без цвета, 4 градации, «Локальная гистограмма». 7. 48×32, без цвета, 2 градации, «Локальная гистограмма».
Понеслась:
Исходная картинка 1-й вариант 2-й, 3-й и 4-й 5, 6 и 7
1.
Не мог отказать себе в удовольствии использовать эту картинку. История этой картинки - здесь.
2.
3.
4.
5.
6.
Основная заморочка, она же «фишка» - это алгоритмы тоновой коррекции, то есть способы, которыми 256 исходных уровней яркости укладываются в заданное количество градаций. Варианты: Без коррекции. Просто чисто арифметически методом простого пересчёта приводим одно количество уровней к другому. Например, если хотим получить 4 градации, то яркости от 0 до 63 превращаются в 0, от 64 до 127 - в 85, от 127 до 191 - в 171, а от 192 до 256 - в 256. При этом если картинка в основном тёмная, то она превращается в жирные чёрные пятна. Глоб. гистограмма. По данным картинки строится гистограмма (подсчитывается, сколько имеется пикселей каждого уровня яркости), потом границы, по которым мы разделяем результирующие градации, подбираются таким образом, чтобы в каждую кубышку по возможности попало примерно одинаковое количество пикселей. Лок. гистограмма. В дополнение к алгоритму глобальной гистограммы делается коррекция яркости пикселя на основании данных его окружения. Если вокруг пикселя в основном более тёмные пиксели, то данный пиксель получает плюс один к номеру его уровня. Если в основном светлее, то минус один. Таким образом повышаем локальный контраст и получаем то, что на картинке появляются ранее потерянные детали. Расплачиваемся шумностью результата. Этот алгоритм, конечно, так себе. Первое, что пришло в голову и легко получилось реализовалось. В реальном устройстве нужно будет, конечно, применить что-нибудь более интеллектуальное, например, на основе билинейной фильтрации. Вообще, тема «tone mapping» весьма обширна, и, потратив дополнительно хотя бы человекомесяц, можно добиться результатов, которые будут гораздо лучше того, что у меня здесь сделано «на коленке».
Для того, чтобы нагенерить эти картинки, я слепил маленькую программку на HTML5 + javascript. Под спойлером - исходник. Если есть желание самим поковыряться, то: 1. Сохраните содержимое спойлера в текстовый файл с расширением "html". 2. Откройте любым современным браузером (я проверял на Хроме-41 и IE-11). 3. Кнопочкой «Выберите файл» откройте какой вам нравится файл с жёсткого диска. 4. Играйтесь с параметрами, наблюдайте результат. 5. Если есть на то желание, можете дописать в прогу что-нибудь своё интересное. Открытые исходники к этому располагают.