В этом задании вы будете создавать алгоритм сжатия предварительного просмотра изображений. Его цель состоит в том, чтобы уменьшить произвольный файл изображения до изображения предварительного просмотра 4 КиБ, которое можно использовать для быстрой идентификации изображений с очень небольшой пропускной способностью.
Вы должны написать две программы (или одну комбинированную программу): компрессор и декомпрессор. Оба должны принимать файл или стандартный ввод в качестве входных данных и выводить их в файл или стандартный вывод. Компрессор должен принимать одно изображение в основном формате изображения без потерь (например, PNG, BMP, PPM) и выводить файл размером не более 4096 байт . Декомпрессор должен принимать любой файл, сгенерированный компрессором, и выводить изображение как можно ближе к входу. Обратите внимание, что для кодера / декодера нет ограничения по размеру исходного кода, поэтому вы можете проявить изобретательность в своем алгоритме.
Ограничения:
Без обмана'. Ваши программы не могут использовать скрытые входы, хранить данные в Интернете и т. Д. Вам также запрещается включать функции / данные, относящиеся только к набору изображений для оценки.
Для библиотек / инструментов / встроенных модулей вы которые разрешено использовать общие операции обработки изображения (масштабирование, размытие, цветовое пространство преобразования, и т.д.), но не изображения декодирования / кодирования / сжатия операций (для ввода компрессора и декомпрессора выход за исключением). Общее сжатие / декомпрессия также не разрешено . Предполагается, что вы реализуете собственное сжатие для этой задачи.
Размеры изображения, выводимого декомпрессором, должны точно соответствовать размерам исходного файла, переданного компрессору. Вы можете предположить, что размеры изображения не превышают 2 16 в любом направлении.
Ваш компрессор должен работать на обычном потребительском ПК менее чем за 5 минут, а декомпрессор должен работать менее чем за 10 секунд для любого изображения в наборе ниже.
счет
Чтобы помочь быстрой проверке и визуальному сравнению, включите альбом с изображениями без потерь тестового корпуса после сжатия, используя свой ответ.
Ваш компрессор будет протестирован с использованием следующего набора изображений :
Вы можете скачать все изображения в виде zip-файла здесь .
Ваша оценка будет средним индексом структурного сходства вашего компрессора на всех изображениях. Мы будем использовать открытый исходный код dssim
для этой задачи. Он легко собирается из исходного кода или, если вы используете Ubuntu, у него также есть PPA. Желательно, чтобы вы набрали собственный ответ, но если вы не знаете, как создавать приложения на C и не запускаете Debian / Ubuntu, вы можете позволить кому-то другому заняться за вас. dssim
ожидает ввода / вывода в формате PNG, поэтому сначала преобразуйте вывод в формат PNG, если вы выводите в другом формате.
Чтобы сделать скоринг безболезненным, вот быстрый вспомогательный скрипт Python, использование python score.py corpus_dir compressed_dir
:
import glob, sys, os, subprocess
scores = []
for img in sorted(os.listdir(sys.argv[1])):
ref, preview = (os.path.join(sys.argv[i], img) for i in (1, 2))
sys.stdout.write("Comparing {} to {}... ".format(ref, preview))
out = subprocess.check_output(["dssim", ref, preview]).decode("utf-8").split()[0]
print(out)
scores.append(float(out))
print("Average score: {:.6f}".format(sum(scores) / len(scores)))
Самый низкий балл побеждает.
You may assume that the image dimensions do not exceed 2^32 in either direction.
Разве это не немного чрезмерно? Это означает, что я должен использовать до 16 байтов для хранения пары (x, y) координат. Немногие файлы изображений имеют размеры более 2 ^ 16 (65536) пикселей в любом направлении, и 2 ^ 11 достаточно для всех изображений в корпусе.2^16
.Ответы:
Python с PIL, оценка 0.094218
Компрессор:
декомпрессор:
Оба сценария принимают входные данные через аргументы командной строки в виде двух каталогов (входной и выходной) и преобразуют все изображения во входном каталоге.
Идея состоит в том, чтобы найти размер, который подходит под 4 КиБ и имеет то же соотношение сторон, что и оригинал, и использовать фильтр Ланцоша, чтобы получить максимально высокое качество изображения с пониженной дискретизацией.
Imgur альбом сжатых изображений, после изменения размера до исходного размера
Вывод сценария оценки:
источник
Java (ваниль, должна работать с Java 1.5+), оценка 0,672
Он не дает особенно хороших результатов dssim, но, на мой взгляд, он создает более дружественные для человека изображения ...
Альбом: http://imgur.com/a/yL31U
Вывод сценария оценки:
Цепочка сжатия:
Чтобы распаковать, надуть, а затем прочитать индексы блоков и вывести соответствующий патч в выходной файл, а затем изменить размер до исходных размеров.
К сожалению, код слишком велик для стекового потока, поэтому его можно найти по адресу https://gist.github.com/anonymous/989ab8a1bb6ec14f6ea9.
Бежать:
При первом запуске этого приложения необходимые файлы будут сгенерированы и сохранены в каталоге, соответствующем рабочему каталогу выполнения. Это может занять несколько минут. Для последующих исполнений этот шаг выполнять не нужно.
источник