Thwart Lepton सम्पीडन


17

ड्रॉपबॉक्स हाल ही में जारी लेपटोन ( GitHub ), एक विधि है कि losslessly JPEG चित्रों राउंड ट्रिप संपीड़ित करता है, 22% की एक औसत बचत।

की वजह से डब्बों में सिद्धांत , किसी भी सामान्य संपीड़न एल्गोरिथ्म नहीं किया जा सकता गारंटी एक छोटी फ़ाइल में परिणाम की ( सामान्य है क्योंकि यह एक विशिष्ट प्रारूप करने के लिए विवश आदानों पर लागू नहीं होता)। लेप्टान जेपीईजी के बारे में सामान्य विशेषताओं का फायदा उठाता है, जो यदि उपसमुच्चय है, तो स्रोत से बड़ी फ़ाइल बनाने के लिए इसे कबूतर कर सकता है।

आवश्यकताएँ

एक प्रोग्राम लिखें जो उत्पन्न करता है:

  • एक मान्य JPEG / JFIF छवि,
  • 0.5 एमबी और 1 एमबी के बीच के आकार के साथ,
  • 256 × 256 px से छोटा नहीं,
  • 4096 × 4096 px से बड़ा नहीं,
  • लिप्टन द्वारा पहचानने योग्य (यह एक .lepछवि को सफलतापूर्वक "संपीड़ित" कर सकता है ), और
  • एक करने के लिए decompresses समान .jpg (इनपुट के रूप में)।
  • APPx, COMऔर अन्य मेटाडेटा, गैर-ग्राफ़िकल मार्कर अनुभाग जेपीईजी में प्रतिबंधित हैं (asymptotically दृष्टिकोण 1: 1 संपीड़न लंगड़ा है।
    • एक APP0JFIF मार्कर की अनुमति है लेकिन कोई थंबनेल की अनुमति नहीं है (बिल्कुल 16 बाइट्स होना चाहिए)
    • tl; dr अगर आप जानबूझकर मेटाडेटा को EXIF ​​सेगमेंट में नहीं खोल रहे हैं और आप किसी भी प्रकार के थंबनेल को अक्षम कर देते हैं, तो आपकी पसंद का भाषा पुस्तकालय छवि में डालना चाहता है, जो ठीक होना चाहिए।

कोड और छवि पोस्ट करें।

यदि आप एक प्रोग्राम लिखना चाहते हैं जो एक लेप्टन छवि का उत्पादन करता है जो परिवर्तित होने पर एक जेपीईजी पैदावार को पूरा करता है, तो यह ठीक है। यह मनमाने ढंग से कई JPEG → लेप्टन → JPEG → ... चक्रों में समान रहना चाहिए।

स्कोरिंग

स्रोत जेपीईजी छवि द्वारा विभाजित लिप्टन छवि का बाइट आकार। उच्चतर (बदतर लेप्टान संपीड़न) बेहतर है। डिफ़ॉल्ट झंडे और स्विच के साथ लेप्टान को चलाएं।


लेप्टान हो रही है

लेप्टान बनाने के लिए 5 सेकंड का क्रैश कोर्स:

git clone https://github.com/dropbox/lepton.git
cd lepton
./autogen.sh && ./configure && make

# fish shell: ./autogen.sh ;and ./configure ;and make

फिर ./lepton --helpआपको बातें बतानी चाहिए।


मुझे लगता है कि यह एक कोड गोल्फ चुनौती के लिए फिर से तैयार किया जा सकता है जहां आप कोड लिखते हैं जो एक छवि उत्पन्न करता है जो कम से कम कुछ निरंतर द्वारा संपीड़न को विफल करता है। वास्तव में, यह सिर्फ कोड आकार पर एक ऊपरी सीमा लगाने के लिए पर्याप्त हो सकता है जो कि जेपीईजी को हार्डकोड करने के लिए आकार से बहुत छोटा है, लेकिन एक उचित कार्यक्रम के लिए पर्याप्त बड़ा है।
xnor

3
क्या कोई अपेक्षा है कि समान रूप से यादृच्छिक पिक्सेल सर्वश्रेष्ठ उत्तर नहीं हैं?
फ़ेर्सम जूल

@ Faersum क्या आप मेरे उदाहरण की तरह मतलब है?
निक टी

1
इसके अलावा, क्योंकि JPEG एक हानिपूर्ण प्रारूप है, एक दी गई छवि को संपीड़ित करने के लिए कई, कई तरीके (जैसे "गुणवत्ता" अन्य चीजों के बीच) हैं। प्रत्येक JPEG फ़ाइल में एक जोड़ी टेबल शामिल होती है जो यह बताती है कि शेष छवि को कैसे डीकोड किया जाता है, और वे टेबल मूल रूप से जो कुछ भी हो सकते हैं। यदि आप BMP छवि को विभिन्न कार्यक्रमों में सहेजते हैं, तो यह संभवतः समान होगा। यदि आप अलग-अलग कार्यक्रमों में एक जेपीजी को बचाते हैं, जब तक कि वे एक ही बैक-एंड लाइब्रेरी का उपयोग नहीं करते हैं, शायद नहीं।
निक टी।

2
जेपीईजी कंप्रेसर के लिए @ फैरसुम समान रूप से यादृच्छिक इनपुट के परिणामस्वरूप समान रूप से यादृच्छिक आउटपुट नहीं होता है, और यह आउटपुट वही है जो लिप्टन काम करता है। यदि आप एक इनपुट के साथ आ सकते हैं जो जेपीईजी कंप्रेसर के कारण समान रूप से यादृच्छिक आउटपुट का उत्पादन करता है, तो यह संभवतः यहां और अन्य जगहों पर उपयोगी होगा।
स्पर्म

जवाबों:


4

पायथन 3 + मोजजप्रेस + / देव / यूरेनियम, 720 × 720: एवीजी। स्कोर 102%

mozjpegपैकेज पर निर्भर करता है , कोड मानता है कि यह स्थापित है /usr/local/opt/mozjpeg। (ओएस एक्स पर यह स्थापित करने के लिए मामूली है, बस चलाएं brew install mozjpeg)

इसके अलावा यह /dev/urandomविशेष फ़ाइल पर निर्भर करता है , इसका उपयोग यादृच्छिक डेटा उत्पन्न करने के लिए किया जाता है।

कोड बस यादृच्छिक डेटा को mozjpegकंप्रेसर (TGA प्रारूप में, क्योंकि cjpeg इसे समझता है और इसमें बहुत ही सरल शीर्षक है) को फीड करता है, और इसे एक अनुकूलित jpeg फ़ाइल बनाने देता है। गुणवत्ता अधिकतम पर सेट है क्योंकि यह डीसीटी गुणांक को कम से कम संपीड़ित बनाता है, और यह बहुत ज्यादा मायने नहीं रखता है कि एल्गोरिथ्म का उपयोग असुविधाजनक डेटा को संपीड़ित करने के लिए किया जाता है।

मैंने जाँच की कि jpeg-> lepton-> jpeg चक्र दोषरहित है - यह सच है।

import subprocess
from subprocess import PIPE

c_mozjpeg_path = '/usr/local/opt/mozjpeg/bin/cjpeg'
cjpeg_params = '-quality 100 -dc-scan-opt 2 -dct float -targa'
image_size = 720


def write_random_tga_image(w, h, of, rf):
    def wb(value, size):
        of.write(int.to_bytes(value, size, 'little'))

    wb(0, 2)
    wb(3, 1)
    wb(0, 9)
    wb(w, 2)
    wb(h, 2)
    wb(8, 1)
    wb(0, 1)

    data_size = w * h
    while data_size > 0:
        data_size -= of.write(rf.read(data_size))


def main():
    with open('/dev/urandom', 'rb') as rf:
        with open('oops.jpg', 'wb') as f:
            p = subprocess.Popen((c_mozjpeg_path,) + tuple(cjpeg_params.split(' ')), stdin=PIPE, stdout=f)
            write_random_tga_image(image_size, image_size, p.stdin, rf)
            p.communicate()


if __name__ == '__main__':
    main()

कोड जाहिर नहीं है।

उदाहरण छवि:

मजेदार तथ्य: उत्पन्न जेपीईजी फ़ाइल स्रोत असम्पीडित टीजीए छवि से बड़ी है, भले ही जेपीईजी हानिपूर्ण संपीड़न का उपयोग करती है।

मजेदार तथ्य 2: इमगुर (एसओ के लिए डिफ़ॉल्ट छवि होस्टिंग) इस फ़ाइल पर बहुत बुरा काम करता है - किसी कारण से यह कम गुणवत्ता के लिए इसे फिर से तैयार करता है, भले ही यह 1 एमबी से कम हो। इसलिए मैंने उदाहरण चित्र अपलोड करने के लिए गितुब का उपयोग किया।

मजेदार तथ्य 3: सामान्य तौर पर, मौजूदा JPEG डिकोडर के साथ संगत रहते हुए, वास्तव में mozjpeg बेहतर JPEG संपीड़न करता है। और इसमें जेपीईजी फ़ाइलों को भी दोषरहित रूप से अनुकूलित करने का उपकरण है - jpegtran


मैं एक क्रॉस-प्लेटफॉर्म RNG (उदाहरण के लिए SystemRandom क्लास) का उपयोग कर सकता था लेकिन मैं बहुत आलसी था। यह तुच्छ है और इसे समान परिणाम देने चाहिए।
प्रदर्शित नाम

1

Naive Noise, 1024 × 1024: 85.55% स्कोर

गेंद को लुढ़काने के लिए पायथन में एक अनुपम उदाहरण। किसी भी तरह से अनुकूलित नहीं; संभावित कमियाँ:

  • डिफ़ॉल्ट गुणवत्ता सेटिंग क्या है, इसका कोई पता नहीं है।
  • प्रत्येक 8x8 ब्लॉक में व्यावहारिक रूप से उसी से सटे एक ही औसत मूल्य (~ 50%) है: लेप्टान का कहना है कि वे अंतरिक्ष को बचाने के लिए उस जानकारी का उपयोग करते हैं।
  • पूरी तरह से डिफ़ॉल्ट मात्रा का ठहराव और हफ़मैन टेबल (जो भी पुस्तकालय उपयोग करने का निर्णय लेता है)।

import numpy as np
from PIL import Image

np.random.seed(0) # make sure it's repeatable.

size = 1024

imgr = np.random.randint(0, 0xFF, (size, size, 3)).astype('uint8')
pimg = Image.fromarray(imgr)
pimg.save('noise.jpg')

शोर

तो कुछ बात करने के लिए मार:

./lepton noise.jpg noise.lep 2>\dev\null # vomits out a lot of technobabble
./lepton noise.lep noise-out.jpg 2>\dev\null

diff -qs noise.jpg noise-out.jpg

SIZE1=$(stat -f "%z" noise.jpg) # http://superuser.com/a/570920/18931
SIZE2=$(stat -f "%z" noise.lep)
RATIO=$(bc <<< "scale=4; $SIZE2/$SIZE1")
echo "$SIZE2/$SIZE1 = $RATIO"

# Files noise.jpg and noise-out.jpg are identical
# 538817/629769 = .8555
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.