В этом задании вы будете создавать алгоритм сжатия предварительного просмотра изображений. Его цель состоит в том, чтобы уменьшить произвольный файл изображения до изображения предварительного просмотра 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
.