Если изображение состоит из 1000 слов, сколько изображения можно уместить 140 символами?
Примечание. Вот и все, ребята! Крайний срок награждения уже здесь, и после некоторых напряженных размышлений я решил, что запись Boojum едва вытеснил Сэма Хосевара. Я отправлю более подробные заметки, как только у меня будет возможность их написать. Конечно, каждый должен свободно предлагать решения и улучшать решения, за которые люди могут голосовать. Спасибо всем, кто прислал заявку; Мне все они понравились. Мне было очень весело бежать, и я надеюсь, что это было весело как для участников, так и для зрителей.
Я наткнулся на этот интересный пост о попытке сжатия изображений. в комментарий Twitter, и множество людей в этой ветке (а также ветку на Reddit) предлагали разные способы сделать это. Так что, я полагаю, это станет хорошей проблемой для кодирования; пусть люди вкладывают свои деньги туда, где есть их рот, и показывают, как их идеи о кодировании могут привести к более подробным деталям в ограниченном пространстве, которое у вас есть.
Я призываю вас придумать универсальную систему для кодирования изображений в 140-символьные сообщения Twitter и снова декодировать их в изображение. Вы можете использовать символы Unicode, так что вы получаете более 8 бит на символ. Однако даже с учетом символов Unicode вам придется сжимать изображения до очень небольшого объема; это, безусловно, будет сжатие с потерями, поэтому нужно будет делать субъективные суждения о том, насколько хорошо выглядит каждый результат.
Вот результат, который исходный автор, Quasimondo, получил из своей кодировки (изображение лицензировано под лицензией Creative Commons Attribution-Noncommercial):
Вы можете лучше?
Правила
- В вашей программе должно быть два режима: кодирование и декодирование.
- When encoding:
- Your program must take as input a graphic in any reasonable raster graphic format of your choice. We'll say that any raster format supported by ImageMagick counts as reasonable.
- Ваша программа должна выводить сообщение, которое может быть представлено 140 или менее кодовыми точками Unicode; 140 кодовых точек в диапазоне _1 _ – _ 2_, исключая несимвольные (
U+FFFE
,U+FFFF
,U+
nFFFE
,U+
nFFFF
, где n - _9 _ – _ 10_ шестнадцатеричный, диапазон _11 _ – _ 12_) и суррогатные кодовые точки (_13 _ – _ 14_). Он может быть выведен в любой разумной кодировке по вашему выбору; любая кодировка, поддерживаемая GNUiconv
, будет считаться разумной, а собственная кодировка вашей платформы или кодировка локали вероятно будет хорошим выбором. Дополнительные сведения см. В примечаниях к Unicode ниже.
- When decoding:
- Your program should take as input the output of your encoding mode.
- Ваша программа должна выводить изображение в любом разумном формате по вашему выбору, как определено выше, хотя для вывода векторные форматы также подходят.
- Выходное изображение должно быть приближенным к входному изображению; чем ближе вы сможете подойти к входному изображению, тем лучше.
- Процесс декодирования может не иметь доступа к любому другому выходу процесса кодирования, кроме выходных данных, указанных выше; то есть вы не можете куда-то загрузить изображение и вывести URL-адрес для загрузки процесса декодирования или что-нибудь в этом роде.
Для единообразия пользовательского интерфейса ваша программа должна вести себя следующим образом:
- Your program must be a script that can be set to executable on a platform with the appropriate interpreter, or a program that can be compiled into an executable.
- Ваша программа должна принимать в качестве первого аргумента
encode
илиdecode
для установки режима. Ваша программа должна принимать входные данные одним или несколькими из следующих способов (если вы реализуете тот, который принимает имена файлов, вы также можете читать и писать из stdin и stdout, если имена файлов отсутствуют):
Принимайте входные данные из стандартного входа и производите выходные данные из стандартного выхода.
my-program encode <input.png >output.txt my-program decode <output.txt >output.png
Принимайте входные данные из файла, названного во втором аргументе, и производите вывод в файле, названном в третьем аргументе.
my-program encode input.png output.txt my-program decode output.txt output.png
- For your solution, please post:
- Your code, in full, and/or a link to it hosted elsewhere (if it's very long, or requires many files to compile, or something).
- Объяснение того, как это работает, если это не сразу видно из кода или если код длинный и людям будет интересно резюме.
- Пример изображения с исходным изображением, сжатым текстом и декодированным изображением.
- Если вы основываете идею кого-то другого, пожалуйста, укажите их. Это нормально - пытаться усовершенствовать чью-то идею, но вы должны их приписать.
Методические рекомендации
В основном это правила, которые могут быть нарушены, предложения или критерии оценки:
- Aesthetics are important. I'll be judging, and suggest that other people judge, based on:
- How good the output image looks, and how much it looks like the original.
- Как красиво выглядит текст. Полностью случайная чепуха - это нормально, если у вас есть действительно умная схема сжатия, но я также хочу видеть ответы, которые превращают изображения в многоязычные стихи или что-то в этом роде. Обратите внимание, что автор оригинального решения решил использовать только китайские иероглифы, так как так оно выглядело лучше.
- Интересный код и умные алгоритмы - это всегда хорошо. Мне нравится короткий, по существу и ясный код, но действительно умные сложные алгоритмы тоже подходят, если они дают хорошие результаты.
- Скорость также важна, но не так важна, как то, насколько хорошо вы выполняете сжатие изображения. Я бы предпочел программу, которая может конвертировать изображение за десятые доли секунды, чем что-то, что будет запускать генетические алгоритмы в течение нескольких дней.
- Я предпочитаю более короткие решения более длинным, если они достаточно сопоставимы по качеству; краткость - это добродетель.
- Ваша программа должна быть реализована на языке, который имеет свободно доступную реализацию в Mac OS X, Linux или Windows. Я хотел бы иметь возможность запускать программы, но если у вас есть отличное решение, которое работает только под MATLAB или что-то в этом роде, это нормально.
- Your program should be as general as possible; it should work for as many different images as possible, though some may produce better results than others. In particular:
- Having a few images built into the program that it matches and writes a reference to, and then produces the matching image upon decoding, is fairly lame and will only cover a few images.
- Программа, которая может брать изображения простых плоских геометрических фигур и разлагать их на некоторый векторный примитив, довольно изящна, но если она не работает с изображениями сверх определенной сложности, она, вероятно, недостаточно универсальна.
- Программа, которая может делать изображения только с определенным фиксированным соотношением сторон, но хорошо с ними справляется, тоже подойдет, но не идеальна.
- Вы можете обнаружить, что черно-белое изображение может содержать больше информации в меньшем пространстве, чем цветное изображение. С другой стороны, это может ограничить типы изображений, к которым оно применимо; лица хорошо выглядят в черно-белом цвете, но абстрактный дизайн может не так хорошо выглядеть.
- Совершенно нормально, если выходное изображение меньше, чем входное, при примерно одинаковых пропорциях. Ничего страшного, если вам нужно увеличить изображение, чтобы сравнить его с оригиналом; важно то, как это выглядит.
- Ваша программа должна выдавать результат, который может пройти через Twitter и остаться невредимым. Это всего лишь рекомендация, а не правило, так как я не смог найти никакой документации по точному набору поддерживаемых символов, но вам, вероятно, следует избегать управляющих символов, забавных невидимых комбинирующих символов, символов частного использования и т.п.
Рубрика подсчета очков
В качестве общего руководства к тому, как я буду ранжировать решения при выборе принятого решения, скажем, что я, вероятно, буду оценивать решения по 25-балльной шкале (это очень грубо, и я не буду ничего оценивать напрямую, просто используя это как основная рекомендация):
- 15 points for how well the encoding scheme reproduces a wide range of input images. This is a subjective, aesthetic judgement
- 0 means that it doesn't work at all, it gives the same image back every time, or something
- 5 означает, что он может кодировать несколько изображений, хотя декодированная версия выглядит некрасиво и может вообще не работать с более сложными изображениями.
- 10 означает, что он работает с широким спектром изображений и создает приятные на вид изображения, которые иногда могут быть различимы.
- 15 означает, что он создает идеальные копии некоторых изображений и даже для более крупных и сложных изображений дает что-то узнаваемое. Или, возможно, он не делает изображения достаточно узнаваемыми, а создает красивые изображения, явно заимствованные из оригинала.
- 3 points for clever use of the Unicode character set
- 0 points for simply using the entire set of allowed characters
- 1 балл за использование ограниченного набора символов, безопасных для передачи через Twitter или в более разнообразных ситуациях.
- 2 балла за использование тематического подмножества символов, например, только идеограммы Хань или только символы с письмом справа налево
- 3 балла за то, чтобы сделать что-то действительно аккуратное, например, создать читаемый текст или использовать символы, похожие на изображение, о котором идет речь.
- 3 points for clever algorithmic approaches and code style
- 0 points for something that is 1000 lines of code only to scale the image down, treat it as 1 bit per pixel, and base64 encode that
- 1 балл за то, что использует стандартную технику кодирования, хорошо написано и кратко
- 2 балла за то, что вводит относительно новую технику кодирования или что на удивление коротко и чисто
- 3 балла за один лайнер, который на самом деле дает хорошие результаты, или что-то, что открывает новые горизонты в графическом кодировании (если это кажется низким количеством баллов для открытия нового пути, помните, что результат, такой хороший, скорее всего, будет иметь высокий балл за эстетику также)
- 2 балла за скорость. При прочих равных, быстрее - лучше, но все вышеперечисленные критерии важнее скорости.
- 1 балл за использование бесплатного программного обеспечения (с открытым исходным кодом), потому что я предпочитаю бесплатное программное обеспечение (обратите внимание, что C # по-прежнему будет иметь право на этот балл, пока он работает на Mono, аналогично код MATLAB будет иметь право, если он работает на GNU Octave)
- 1 балл за фактическое соблюдение всех правил. Эти правила стали немного большими и сложными, поэтому я, вероятно, приму в остальном хорошие ответы, в которых неверна одна маленькая деталь, но я дам дополнительный балл любому решению, которое действительно следует всем правилам.
Эталонные изображения
Некоторые люди просили предоставить несколько эталонных изображений. Вот несколько эталонных изображений, которые вы можете попробовать; Меньшие версии встроены сюда, все они ссылаются на большие версии изображения, если они вам нужны:
Приз
Я предлагаю вознаграждение в размере 500 респондентов (плюс 50, которое вводит StackOverflow) за решение, которое мне больше всего нравится, на основе вышеуказанных критериев. Конечно, я призываю всех остальных проголосовать за свои любимые решения и здесь.
Примечание о сроке
Этот конкурс будет длиться до тех пор, пока не закончится награда, около 18:00 в субботу, 30 мая. Я не могу сказать точное время, когда он закончится; это может быть где угодно с 17 до 19 часов. Я гарантирую, что просмотрю все заявки, присланные до 14:00, и сделаю все возможное, чтобы просмотреть все заявки до 16:00; если решения будут отправлены после этого, у меня не будет возможности подробно рассмотреть их, прежде чем я приму свое решение. Кроме того, чем раньше вы отправите заявку, тем больше у вас будет шансов, что голосование поможет мне выбрать лучшее решение, поэтому постарайтесь отправить заявку раньше, а не в срок.
Заметки Unicode
Также была некоторая путаница в том, какие именно символы Unicode разрешены. Диапазон возможных кодовых точек Unicode составляет от U+0000
до U+10FFFF
. Есть некоторые кодовые точки, которые нельзя использовать в качестве символов Unicode при любом открытом обмене данными; это несимволы и суррогатные кодовые точки. Несимволы определены в Unidode Standard 5.1.0 раздел 16.7 как значения U+FFFE
, U+FFFF
, U+
n FFFE
, U+
n FFFF
, где n - _28 _ – _ 29_ в шестнадцатеричном формате, а диапазон _30 _ – _ 31_. Эти значения предназначены для внутреннего использования в конкретных приложениях, и соответствующие приложения могут удалять эти символы из обрабатываемого ими текста. Суррогатные кодовые точки, определенные в стандарте Unicode 5.1.0, раздел 3.8 как _32 _ – _ 33_, используются для кодирования символов за пределами базовой многоязычной плоскости в UTF-16; таким образом, невозможно представить эти кодовые точки непосредственно в кодировке UTF-16, и недопустимо кодировать их в любой другой кодировке. Таким образом, для целей этого конкурса я разрешаю любую программу, которая кодирует изображения в последовательность, состоящую не более чем из 140 кодовых точек Unicode из диапазона _34 _ – _ 35_, за исключением всех несимволов и суррогатных пар, как определено выше.
Я предпочитаю решения, которые используют только назначенные символы, и даже лучшие, которые используют умные подмножества назначенных символов или делают что-то интересное с набором символов, который они используют. Список назначенных символов см. В базе данных символов Юникода; обратите внимание, что некоторые символы указаны напрямую, а некоторые указаны только как начало и конец диапазона. Также обратите внимание, что суррогатные кодовые точки перечислены в базе данных, но запрещены, как указано выше. Если вы хотите воспользоваться преимуществами определенных свойств символов, чтобы сделать выводимый вами текст более интересным, существует разновидность доступных баз данных символьной информации, таких как список именованных блоков кода и различные свойства символов.
Поскольку Twitter не указывает точный набор символов, который они поддерживают, я буду снисходительно относиться к решениям, которые на самом деле не работают с Twitter, потому что некоторые символы считаются дополнительными или некоторые символы удаляются. Желательно, но не обязательно, чтобы все закодированные выходные данные могли быть без повреждений переданы через Twitter или другую службу микроблогов, такую как identity.ca < / а>. Я видел документацию, в которой говорилось, что Twitter кодирует объекты ‹,› и &, и поэтому считает их как 4, 4 и 5 символов соответственно, но я не проверял это сам, и их счетчик символов JavaScript не кажется считать их таким образом.
Советы и ссылки
- Определение допустимых символов Unicode в правилах немного сложно. Может быть проще выбрать один блок символов, например унифицированные иероглифы CJK (U + 4E00 – U + 9FCF).
- Вы можете использовать существующие библиотеки изображений, например ImageMagick или Python Imaging Library для обработки изображений.
- Если вам нужна помощь в понимании набора символов Unicode и его различных кодировок, см. это краткое руководство или этот подробный FAQ по UTF-8 в Linux и Unix .
- Чем раньше вы представите свое решение, тем больше времени мне (и другим голосующим) придется на него изучить. Вы можете отредактировать свое решение, если улучшите его; Я основываю свою награду на самой последней версии, когда буду в последний раз просматривать решения.
- Если вам нужен простой формат изображения для синтаксического анализа и записи (и вы не хотите просто использовать существующий формат), я бы предложил использовать формат PPM. Это текстовый формат, с которым очень легко работать, и вы можете использовать ImageMagick для преобразования в него и обратно. .