Bu meydan okumada, bir görüntü önizleme sıkıştırma algoritması oluşturacaksınız. Amacı, çok az bant genişliğine sahip görüntüleri hızlı bir şekilde tanımlamak için kullanılabilen rastgele bir görüntü dosyasını 4 KiB önizleme görüntüsüne indirmektir.
İki program yazmalısınız (veya bir birleşik program): bir kompresör ve bir dekompresör. Her ikisi de bir dosyayı almak veya girdi olarak stdin almak ve bir dosyaya veya stdout'a çıktı almak zorundadır. Kompresör, bir ana kayıpsız görüntü seçim biçiminde (örneğin PNG, BMP, PPM) bir görüntüyü kabul etmeli ve en fazla 4096 baytlık bir dosya çıkarmalıdır . Dekompresör, kompresör tarafından oluşturulan herhangi bir dosyayı kabul etmeli ve girdiye mümkün olduğu kadar yakın bir görüntü çıkarmalıdır. Kodlayıcı / kod çözücü için kaynak kod boyutu sınırı olmadığını unutmayın, böylece algoritmada yaratıcı olabilirsiniz.
Kısıtlamalar:
Hile yok'. Programlarınız gizli girişleri kullanmayabilir, internette veri depolamaya vb. İzin vermeyebilir. Yalnızca puanlama görüntüleri grubuyla ilgili özellikleri / verileri eklemeniz de yasaktır.
Kütüphaneler / araç / Ankastre için, olan kullanmasına izin jenerik (ölçekleme, bulanık, renk uzayı dönüşümü, vs) görüntü işleme operasyonları, ama değil görüntü çözme / kodlama / sıkıştırma (kompresör giriş ve çıkış açıcı hariç) işlemleri. Genel sıkıştırma / açma işlemine de izin verilmez . Bu zorluk için kendi sıkıştırmanızı uygulamanız amaçlanmıştır.
Dekompresör tarafından çıkarılan görüntünün boyutları tam olarak kompresöre verilen orijinal dosyanınkilerle aynı olmalıdır. Görüntü boyutlarının her iki yönde 2 16'yı geçmediğini varsayabilirsiniz .
Kompresörünüz ortalama bir tüketici PC'sinde 5 dakikadan daha az bir sürede çalışmalı ve dekompresör aşağıdaki setteki herhangi bir görüntü için 10 saniyenin altında çalışmalıdır.
puanlama
Hızlı doğrulama ve görsel karşılaştırmaya yardımcı olmak için lütfen cevabınızı kullanarak sıkıştırma sonrasında test corpus'un kayıpsız bir resim albümünü ekleyin.
Kompresörünüz aşağıdaki görüntü koruyucusu kullanılarak test edilecektir :
Sen bir zip dosyası tüm görüntüleri indirebilirsiniz burada .
Puanınız tüm görüntülerde kompresörünüzün ortalama yapısal benzerlik endeksi olacaktır. dssim
Bu sorunu çözmek için açık kaynağı kullanacağız . Kolayca kaynaktan inşa edilir veya Ubuntu'daysanız PPA'sı da vardır. Kendi cevabınızı puanlarsanız tercih edilir, ancak C uygulamalarını nasıl oluşturacağınızı bilmiyorsanız ve Debian / Ubuntu'yu çalıştırmazsanız, başkalarının sizin için puan vermesine izin verebilirsiniz. dssim
PNG'de girdi / çıktı beklediğinden, farklı bir biçimde çıktı alırsanız önce çıktınızı PNG'ye dönüştürün.
Puanlamayı acısız hale getirmek için işte size hızlı bir yardımcı Python komut dosyası kullanın 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)))
En düşük puan kazanır.
You may assume that the image dimensions do not exceed 2^32 in either direction.
Bu biraz aşırı değil mi? Bu, bir çift (x, y) koordinatını depolamak için 16 bayt kullanmam gerektiği anlamına gelir. Çok az resim dosyası, her iki yönde 2 ^ 16 (65536) pikselden daha büyük boyutlara sahip ve 2 ^ 11, korpustaki tüm resimler için yeterli.
2^16
.