Trong thử thách này, bạn sẽ tạo ra một thuật toán nén xem trước hình ảnh. Mục tiêu của nó là giảm một tệp hình ảnh tùy ý thành hình ảnh xem trước 4 KiB, có thể được sử dụng để nhanh chóng xác định hình ảnh với rất ít băng thông.
Bạn phải viết hai chương trình (hoặc một chương trình kết hợp): máy nén và bộ giải nén. Cả hai phải lấy một tệp hoặc stdin làm đầu vào và xuất ra tệp hoặc thiết bị xuất chuẩn. Máy nén phải chấp nhận một hình ảnh ở định dạng hình ảnh không mất dữ liệu chính (ví dụ PNG, BMP, PPM) và xuất ra một tệp có tối đa 4096 byte . Bộ giải nén phải chấp nhận bất kỳ tệp nào do máy nén tạo ra và xuất ra một hình ảnh càng gần với đầu vào. Lưu ý rằng không có giới hạn kích thước mã nguồn cho bộ mã hóa / giải mã, vì vậy bạn có thể sáng tạo trong thuật toán của mình.
Hạn chế:
Không gian lận'. Các chương trình của bạn không được sử dụng các đầu vào ẩn, lưu trữ dữ liệu trên internet, v.v. Bạn cũng bị cấm chỉ bao gồm các tính năng / dữ liệu liên quan đến bộ ảnh ghi điểm.
Đối với thư viện / công cụ / tích hợp, bạn được phép sử dụng các hoạt động xử lý ảnh chung (chia tỷ lệ, làm mờ, chuyển đổi không gian màu, v.v.), nhưng không phải là hoạt động giải mã / mã hóa / nén hình ảnh (ngoại trừ đầu vào máy nén và đầu ra bộ giải nén). Nén / giải nén chung cũng không được phép . Dự định là bạn sẽ tự thực hiện nén cho thử thách này.
Kích thước của đầu ra hình ảnh của bộ giải nén phải khớp chính xác với kích thước của tệp gốc được cung cấp cho máy nén. Bạn có thể cho rằng kích thước hình ảnh không vượt quá 2 16 theo một trong hai hướng.
Máy nén của bạn phải chạy trên PC tiêu dùng trung bình dưới 5 phút và bộ giải nén phải chạy dưới 10 giây cho bất kỳ hình ảnh nào trong bộ bên dưới.
Chấm điểm
Để giúp xác minh nhanh chóng và so sánh trực quan, vui lòng bao gồm một album hình ảnh không mất dữ liệu của kho kiểm tra sau khi nén bằng câu trả lời của bạn.
Máy nén của bạn sẽ được kiểm tra bằng cách sử dụng sau đây corpus của hình ảnh :
Bạn có thể tải xuống tất cả các hình ảnh trong một tệp zip ở đây .
Điểm của bạn sẽ là chỉ số tương tự cấu trúc trung bình cho máy nén của bạn trên tất cả các hình ảnh. Chúng tôi sẽ sử dụng nguồn mở dssim
cho thử thách này. Nó dễ dàng được xây dựng từ nguồn hoặc nếu bạn đang sử dụng Ubuntu thì nó cũng có PPA. Được ưu tiên nếu bạn chấm điểm câu trả lời của riêng bạn, nhưng nếu bạn không biết cách xây dựng các ứng dụng C và bạn không chạy Debian / Ubuntu, bạn có thể để người khác chấm điểm cho mình. dssim
mong đợi đầu vào / đầu ra ở PNG, vì vậy hãy chuyển đổi đầu ra của bạn thành PNG trước nếu bạn xuất ở định dạng khác.
Để làm cho việc ghi điểm không gây đau đớn, đây là tập lệnh trợ giúp nhanh của Python, cách sử dụng 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)))
Điểm số thấp nhất chiến thắng.
You may assume that the image dimensions do not exceed 2^32 in either direction.
Đây có phải là một chút quá mức? Điều này có nghĩa là tôi phải sử dụng tối đa 16 byte để lưu trữ một cặp tọa độ (x, y). Rất ít tệp hình ảnh có kích thước hơn 2 ^ 16 (65536) pixel theo cả hai hướng và 2 ^ 11 là đủ cho tất cả các hình ảnh trong kho văn bản.
2^16
.