Разведите серое изображение в чисто черно-белое с помощью собственного алгоритма.
Рекомендации: вы должны придумать свой собственный новый алгоритм. Вы не можете использовать ранее существующие алгоритмы (например, Флойд-Штайнбург), но вы можете использовать общую технику. Ваша программа должна уметь читать изображение и создавать изображение того же размера. Это конкурс популярности, поэтому выигрывает тот, кто создает лучшие (наиболее близкие к оригиналу) и наиболее креативные (определяется голосами). Бонус, если код короткий, хотя в этом нет необходимости.
Вы можете использовать любое изображение в градациях серого в качестве входных данных, оно должно быть больше, чем 300x300. Любой формат файла в порядке.
Пример ввода:
Пример вывода:
Это довольно хорошая работа, но все еще видны линии и узоры.
Ответы:
Фортран
Хорошо, я использую малоизвестный формат изображения под названием FITS, который используется для астрономии. Это означает, что есть библиотека Фортрана для чтения и записи таких изображений. Кроме того, ImageMagick и Gimp могут читать и записывать изображения FITS.
Алгоритм, который я использую, основан на дизеринге «Sierra Lite», но с двумя улучшениями:
a) Я уменьшаю распространенную ошибку в 4/5 раз.
б) Я ввел случайное изменение в матрице диффузии, сохраняя ее сумму постоянной.
Вместе они почти полностью устраняют паттерны, показанные в примере с ОП.
Если у вас установлена библиотека CFITSIO, скомпилируйте
Имена файлов жестко запрограммированы (исправить это не удалось).
Код:
Пример вывода изображения щенка в постах OPs:
Пример вывода OPs:
источник
GraphicsMagick / ImageMagick
Заказал дизеринг:
Прежде чем жаловаться на то, что я использую «установленный алгоритм», прочитайте ChangeLog для GraphicsMagick и ImageMagick за апрель 2003 года, где вы увидите, что я реализовал алгоритм в этих приложениях. Кроме того, сочетание "-gamma .45455" с "-ordered-dither" является новым.
«-Gamma .45455» заботится о том, чтобы изображение было слишком светлым. Параметр "all" необходим только для GraphicsMagick.
Существует полосатость, потому что в изображении с упорядоченным сглаживанием 4х4 только 17 уровней. Появление полос может быть уменьшено с помощью упорядоченного сглаживания 8x8, который имеет 65 уровней.
Вот исходное изображение, упорядоченный выходной сигнал 4x4 и 8x8 и случайный порог:
Я предпочитаю версию с заказанным дизерингом, но для полноты включаю версию с произвольным порогом.
«10x90%» означает рендеринг пикселей с интенсивностью ниже 10 процентов в виде чистого черного и выше 90 процентов в виде чистого белого, чтобы избежать появления одиноких пятен в этих областях.
Вероятно, стоит отметить, что оба они настолько эффективны в использовании памяти, насколько это возможно. Также не происходит диффузии, поэтому они работают по одному пикселю за раз, даже при записи блоков упорядоченного дизеринга, и им не нужно ничего знать о соседних пикселях. ImageMagick и GraphicsMagick обрабатывают строки по очереди, но для этих методов это необязательно. Преобразования с упорядоченным дизерингом в реальном времени на моем старом компьютере x86_64 занимают менее 0,04 секунды.
источник
Я извиняюсь за стиль кода, я собрал это вместе, используя несколько библиотек, которые мы только что создали в моем java-классе, и у него плохой случай копирования-вставки и магических чисел. Алгоритм выбирает случайные прямоугольники на изображении и проверяет, больше ли средняя яркость на размытом изображении или исходном изображении. Затем он включает или выключает пиксель, чтобы приблизить яркость в линию, предпочтительно выбирая пиксели, которые больше отличаются от исходного изображения. Я думаю, что это делает лучше, выявляя тонкие детали, такие как волосы щенка, но изображение более шумное, потому что оно пытается выявить детали даже в тех областях, где их нет.
источник
Ghostscript (с небольшой помощью ImageMagick)
Далеко не мой «новый алгоритм», но, извините, не смог устоять перед ним.
Конечно, это работает лучше без сдержанности «того же размера».
источник
ДЖАВА
Вот мое представление. Снимает изображение в формате JPG, вычисляет яркость пикселей на пиксель (спасибо Бонану в этом вопросе SO) и затем сравнивает его со случайным шаблоном, чтобы узнать, будет ли полученный пиксель черным или белым. Самые темные пиксели всегда будут черными, а самые яркие пиксели будут всегда белыми, чтобы сохранить детали изображения.
Другие примеры:
Также работает с полноцветными изображениями:
источник
CJam
95 байт :)
Используется формат ASCII PGM (P2) без строки комментария для ввода и вывода.
Метод очень прост: он складывает квадраты размером 2 * 2 пикселя, преобразует их в диапазон 0..4, затем использует соответствующий шаблон из 4 битов для генерации 2 * 2 черно-белых пикселей.
Это также означает, что ширина и высота должны быть одинаковыми.
Образец:
И случайный алгоритм всего в 27 байтах:
Он использует тот же формат файла.
Образец:
И, наконец, смешанный подход: случайное дизеринг с уклоном в сторону шахматного рисунка; 44 байта:
Образец:
источник
Java (1.4+)
Я не уверен, что я заново изобретаю колесо, но думаю, что оно может быть уникальным ...
С ограниченными случайными последовательностями
Чистое случайное дизеринг
Изображение города из ответа Аверроэса
Алгоритм использует концепцию локализованной энергии светимости и нормализации, чтобы сохранить характеристики. Первоначальная версия затем использовала случайное дрожание, чтобы создать размытый вид на области с одинаковой яркостью. Однако это не было визуально привлекательным. Чтобы противостоять этому, ограниченный набор ограниченных случайных последовательностей отображается на исходную светимость входного пикселя, и выборки используются итеративно и многократно, давая размытый фон.
источник
питон
Идея заключается в следующем: изображение делится на
n x n
плитки. Мы рассчитываем средний цвет каждой из этих плиток. Затем мы сопоставляем цветовой диапазон0 - 255
с диапазоном,0 - n*n
который дает нам новое значениеv
. Затем мы окрашиваем все пиксели из этой плитки в черный и произвольно окрашиваемv
пиксели в этой плитке в белый цвет. Это далеко от оптимального, но все же дает нам узнаваемые результаты. В зависимости от разрешения, он обычно лучше всего работает приn=2
илиn=3
. В то время как внутриn=2
вы уже можете найти артефакты из «смоделированной глубины цвета», на случай, еслиn=3
она уже может стать несколько размытой. Я предположил, что изображения должны оставаться одинакового размера, но вы, конечно, также можете использовать этот метод и просто удвоить / утроить размер сгенерированного изображения, чтобы получить больше деталей.PS: я знаю, что немного опаздываю на вечеринку, я помню, что у меня не было никаких идей, когда начался вызов, но сейчас просто была эта мозговая волна =)
Полученные результаты:
n=2:
n=3:
источник
Давайте определим очень компактный, теоретический формат файла для этого вопроса, поскольку у любого из существующих форматов файлов слишком много накладных расходов, чтобы написать быстрый ответ.
Пусть первые четыре байта файла изображения определяют ширину и высоту изображения в пикселях соответственно:
следуют
w * h
байты значений оттенков серого от 0 до 255:Затем мы можем определить фрагмент кода в Python (145 байт), который возьмет это изображение и сделает:
который "сглаживается", возвращая белый или черный с вероятностью, равной значению серого этого пикселя.
Применительно к образцу изображения, это дает что-то вроде этого:
Это не слишком красиво, но выглядит очень похоже при уменьшении в предварительном просмотре, и для всего 145 байтов Python я не думаю, что вы можете стать намного лучше.
источник
кобра
Принимает 24-битный или 32-битный файл PNG / BMP (JPG производит вывод с некоторыми оттенками серого). Это также расширяемо для файлов, содержащих цвет.
Он использует оптимизированный по скорости ELA для сглаживания изображения в 3-битном цвете, который будет возвращаться как черно-белый, когда передается ваше тестовое изображение.
Я упоминал, что это действительно быстро?
источник
col
и оставление ееimage.setPixel(x,y,col)
до самого конца?Джава
Код низкого уровня с использованием PNGJ и добавлением шума плюс базовая диффузия. Эта реализация требует 8-битного источника PNG в оттенках серого.
(Добавить эту банку файл в путь сборки, если хотите попробовать).
В качестве бонуса: это чрезвычайно эффективно при использовании памяти (он хранит только три строки), поэтому его можно использовать для больших изображений.
источник
Джава
Просто простой алгоритм на основе RNG, плюс некоторая логика для работы с цветными изображениями. Имеет вероятность b установки любого данного пикселя в белый цвет, в противном случае устанавливает черный цвет; где b - исходная яркость этого пикселя.
Вот потенциальный результат для изображения собаки:
источник