Dalam tantangan ini, Anda akan membuat algoritma kompresi pratinjau gambar. Tujuannya adalah untuk mengurangi file gambar sewenang-wenang menjadi gambar pratinjau 4 KiB, yang dapat digunakan untuk dengan cepat mengidentifikasi gambar dengan bandwidth yang sangat sedikit.
Anda harus menulis dua program (atau satu program gabungan): kompresor dan dekompresor. Keduanya harus mengambil file atau stdin sebagai input, dan output ke file atau stdout. Kompresor harus menerima satu gambar dalam format gambar utama lossless pilihan (mis. PNG, BMP, PPM), dan menghasilkan file paling banyak 4.096 byte . Dekompresor harus menerima file apa pun yang dihasilkan oleh kompresor, dan mengeluarkan gambar sedekat mungkin ke input. Perhatikan bahwa tidak ada batasan ukuran kode sumber untuk enkoder / decoder, sehingga Anda dapat kreatif dalam algoritme Anda.
Pembatasan:
Tidak 'curang'. Program-program Anda mungkin tidak menggunakan input tersembunyi, menyimpan data di internet, dll. Anda juga dilarang memasukkan fitur / data yang hanya berkaitan dengan set gambar penilaian.
Untuk perpustakaan / tools / built-in Anda yang diperbolehkan untuk menggunakan generik operasi pengolahan citra (scaling, mengaburkan, warna ruang transformasi, dll), tetapi tidak gambar decoding / encoding / kompresi operasi (kecuali untuk masukan kompresor dan output decompressor). Kompresi / dekompresi generik juga tidak diizinkan . Ini dimaksudkan agar Anda menerapkan kompresi Anda sendiri untuk tantangan ini.
Dimensi output gambar oleh dekompresor harus persis sama dengan yang ada pada file asli yang diberikan ke kompresor. Anda dapat mengasumsikan bahwa dimensi gambar tidak melebihi 2 16 di kedua arah.
Kompresor Anda harus dijalankan pada PC konsumen rata-rata dalam waktu kurang dari 5 menit, dan dekompresor harus berjalan dalam waktu di bawah 10 detik untuk gambar apa pun dalam set di bawah ini.
Mencetak gol
Untuk membantu verifikasi cepat dan perbandingan visual, harap sertakan album gambar lossless test corpus setelah kompresi menggunakan jawaban Anda.
Kompresor Anda akan diuji menggunakan kumpulan gambar berikut :
Anda dapat mengunduh semua gambar dalam file zip di sini .
Skor Anda akan menjadi indeks kesamaan struktural rata-rata untuk kompresor Anda di semua gambar. Kami akan menggunakan sumber terbuka dssim
untuk tantangan ini. Itu mudah dibangun dari sumber, atau jika Anda berada di Ubuntu itu juga memiliki PPA. Lebih disukai jika Anda skor jawaban Anda sendiri, tetapi jika Anda tidak tahu bagaimana membangun aplikasi C dan Anda tidak menjalankan Debian / Ubuntu, Anda dapat membiarkan orang lain mencetak skor untuk Anda. dssim
mengharapkan input / output dalam PNG, jadi konversikan output Anda ke PNG terlebih dahulu jika Anda output dalam format yang berbeda.
Untuk membuat skor tidak menyakitkan, berikut ini skrip Python penolong cepat, penggunaan 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)))
Skor terendah menang.
You may assume that the image dimensions do not exceed 2^32 in either direction.
Bukankah ini sedikit berlebihan? Ini berarti saya harus menggunakan hingga 16 byte untuk menyimpan sepasang koordinat (x, y). Beberapa file gambar memiliki dimensi lebih dari 2 ^ 16 (65536) piksel di kedua arah, dan 2 ^ 11 cukup untuk semua gambar di dalam corpus.2^16
.Jawaban:
Python dengan PIL, skor 0,094218
Kompresor:
Dekompresor:
Kedua skrip mengambil input melalui argumen baris perintah, sebagai dua direktori (input dan output), dan mengonversi semua gambar di direktori input.
Idenya adalah untuk menemukan ukuran yang pas di bawah 4 KiB dan memiliki rasio aspek yang sama seperti aslinya, dan menggunakan filter Lanczos untuk mendapatkan kualitas terbaik dari gambar downsampled mungkin.
Imgur album gambar terkompresi, setelah mengubah ukuran ke dimensi asli
Mencetak keluaran skrip:
sumber
Java (vanilla, harus bekerja dengan java 1.5+), skor 0.672
Ini tidak menghasilkan skor DSSIM yang sangat baik tetapi, bagi saya itu menghasilkan gambar yang lebih ramah manusia ...
Album: http://imgur.com/a/yL31U
Mencetak keluaran skrip:
Rantai kompresi:
Untuk mendekompres, mengembang dan kemudian membaca indeks blok dan output tambalan yang sesuai ke file output, kemudian mengubah ukuran ke dimensi asli.
Sayangnya kode ini terlalu besar untuk stackoverflow sehingga dapat ditemukan di https://gist.github.com/anonymous/989ab8a1bb6ec14f6ea9
Untuk berlari:
Pertama kali aplikasi ini dijalankan, file-file yang diperlukan akan dihasilkan dan disimpan dalam direktori relatif terhadap eksekusi yang berfungsi dir. Ini mungkin memakan waktu beberapa menit. Untuk eksekusi selanjutnya, langkah ini tidak perlu dilakukan.
sumber