У цьому виклику ви створите алгоритм стиснення попереднього перегляду зображення. Його мета полягає в тому, щоб зменшити довільний файл зображення до попереднього зображення на 4 KiB, який можна використовувати для швидкого визначення зображень із дуже малою пропускною здатністю.
Ви повинні написати дві програми (або одну комбіновану програму): компресор і декомпресор. Обидва повинні приймати файл або stdin як вхідні дані та виводити їх у файл чи stdout. Компресор повинен приймати одне зображення у форматі обраного зображення без втрат (наприклад, 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
.