ในการท้าทายนี้คุณจะต้องสร้างอัลกอริทึมการบีบอัดภาพตัวอย่าง เป้าหมายคือเพื่อลดไฟล์ภาพที่กำหนดเองไปเป็นภาพตัวอย่างขนาด 4 KiB ซึ่งสามารถใช้เพื่อระบุรูปภาพที่มีแบนด์วิดท์น้อยมากได้อย่างรวดเร็ว
คุณต้องเขียนโปรแกรมสองโปรแกรม (หรือโปรแกรมที่รวมกันหนึ่งโปรแกรม): คอมเพรสเซอร์และตัวขยายการบีบอัด ทั้งสองต้องใช้ไฟล์หรือ stdin เป็นอินพุตและเอาต์พุตไปยังไฟล์หรือ stdout คอมเพรสเซอร์ต้องยอมรับภาพหนึ่งภาพในรูปแบบภาพหลัก lossless ของทางเลือก (เช่น PNG, BMP, PPM) และเอาท์พุทไฟล์ของที่มากที่สุด 4096 ไบต์ ตัวขยายการบีบอัดจะต้องยอมรับไฟล์ใด ๆ ที่สร้างโดยคอมเพรสเซอร์และส่งภาพออกให้ใกล้เคียงที่สุดกับอินพุต โปรดทราบว่าไม่มีการ จำกัด ขนาดซอร์สโค้ดสำหรับตัวเข้ารหัส / ตัวถอดรหัสดังนั้นคุณสามารถสร้างสรรค์ในอัลกอริทึมของคุณ
ข้อ จำกัด :
ไม่มีการโกง'. โปรแกรมของคุณอาจไม่ใช้อินพุตที่ซ่อนอยู่การจัดเก็บข้อมูลบนอินเทอร์เน็ต ฯลฯ นอกจากนี้คุณยังถูกห้ามไม่ให้รวมคุณลักษณะ / ข้อมูลที่เกี่ยวข้องกับชุดภาพการให้คะแนนเท่านั้น
สำหรับห้องสมุด / เครื่องมือ / built-ins ที่คุณจะได้รับอนุญาตให้ใช้ทั่วไปการดำเนินงานการประมวลผลภาพ (ปรับเบลอสีเปลี่ยนแปลงพื้นที่ ฯลฯ ) แต่ไม่ได้ภาพถอดรหัส / เข้ารหัส / การบีบอัดการดำเนินงาน (ยกเว้นสำหรับการป้อนข้อมูลคอมเพรสเซอร์และการส่งออกขยายการบีบอัด) ทั่วไปการบีบอัด decompression / ยังไม่ได้รับอนุญาต มีวัตถุประสงค์เพื่อให้คุณใช้การบีบอัดของคุณเองสำหรับความท้าทายนี้
ขนาดของเอาต์พุตภาพโดยตัวขยายการบีบอัดจะต้องตรงกับขนาดของไฟล์ต้นฉบับที่กำหนดให้กับคอมเพรสเซอร์ คุณอาจคิดว่าขนาดภาพไม่เกิน 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
ฉันจะเปลี่ยนไป