JPEG सारख्या योजनांमध्ये क्वांटायझेशन मॅट्रिक्सची अनुकूली निर्मिती. लॉसलेस कॉम्प्रेशन अल्गोरिदम. सांख्यिकी कोडिंग अल्गोरिदम

Symbian साठी 07.05.2019
Symbian साठी

हे मोजणे सोपे आहे की 2000 * 1000 पिक्सेल आकाराच्या असम्पीडित पूर्ण-रंग प्रतिमेचा आकार सुमारे 6 मेगाबाइट्स असेल. जर आपण व्यावसायिक कॅमेरा किंवा उच्च-रिझोल्यूशन स्कॅनरमधून मिळवलेल्या प्रतिमांबद्दल बोललो तर त्यांचा आकार आणखी मोठा असू शकतो. स्टोरेज डिव्हाइसेसच्या क्षमतेमध्ये वेगवान वाढ असूनही, विविध इमेज कॉम्प्रेशन अल्गोरिदम अजूनही खूप संबंधित आहेत.
सर्व विद्यमान अल्गोरिदम दोन मोठ्या वर्गांमध्ये विभागले जाऊ शकतात:

  • लॉसलेस कॉम्प्रेशन अल्गोरिदम;
  • हानीकारक कॉम्प्रेशन अल्गोरिदम.
जेव्हा आम्ही लॉसलेस कॉम्प्रेशनबद्दल बोलतो, तेव्हा आमचा अर्थ असा होतो की कॉम्प्रेशन अल्गोरिदममध्ये एक व्यस्त अल्गोरिदम आहे जो तुम्हाला मूळ प्रतिमा अचूकपणे पुनर्संचयित करण्यास अनुमती देतो. हानीकारक कॉम्प्रेशन अल्गोरिदमसाठी कोणतेही व्यस्त अल्गोरिदम नाही. एक अल्गोरिदम आहे जो मूळ प्रतिमेशी तंतोतंत जुळत नाही अशी प्रतिमा पुनर्संचयित करतो. प्रतिमेची व्हिज्युअल गुणवत्ता राखून उच्च कॉम्प्रेशन रेशो प्राप्त करण्यासाठी कॉम्प्रेशन आणि रिकव्हरी अल्गोरिदम निवडले जातात.

लॉसलेस कॉम्प्रेशन अल्गोरिदम

RLE अल्गोरिदम
सर्व RLE मालिका अल्गोरिदम अतिशय सोप्या कल्पनेवर आधारित आहेत: घटकांचे पुनरावृत्ती करणारे गट जोडीने बदलले जातात (पुनरावृत्तीची संख्या, पुनरावृत्ती घटक). उदाहरण म्हणून बिट्सचा क्रम वापरून या अल्गोरिदमचा विचार करू. हा क्रम शून्य आणि एकाचे पर्यायी गट करेल. शिवाय, गटांमध्ये अनेकदा एकापेक्षा जास्त घटक असतात. नंतर क्रम 11111 000000 11111111 00 खालील संख्यांच्या संचाशी संबंधित असेल 5 6 8 2. या संख्या पुनरावृत्तीची संख्या दर्शवतात (मोजणी एका पासून सुरू होते), परंतु या संख्यांना देखील एन्कोड करणे आवश्यक आहे. आम्ही असे गृहीत धरू की पुनरावृत्तीची संख्या 0 ते 7 पर्यंत आहे (म्हणजेच, पुनरावृत्तीची संख्या एन्कोड करण्यासाठी आमच्यासाठी 3 बिट पुरेसे आहेत). नंतर वर चर्चा केलेला क्रम 5 6 7 0 1 2 क्रमांकाच्या खालील क्रमाने एन्कोड केला जातो. मूळ क्रम एन्कोड करण्यासाठी 21 बिट्सची आवश्यकता असते आणि RLE संकुचित स्वरूपात या क्रमाला 18 बिट लागतात हे मोजणे सोपे आहे.
हा अल्गोरिदम अगदी सोपा असला तरी त्याची कार्यक्षमता तुलनेने कमी आहे. शिवाय, काही प्रकरणांमध्ये, या अल्गोरिदमचा वापर कमी होत नाही तर अनुक्रमाची लांबी वाढवते. उदाहरणार्थ, खालील क्रमाचा विचार करा 111 0000 11111111 00. संबंधित RL क्रम असा दिसतो: 3 4 7 0 1 2. मूळ अनुक्रमाची लांबी 17 बिट आहे, संकुचित अनुक्रमाची लांबी 18 बिट आहे.
हे अल्गोरिदम काळ्या आणि पांढर्या प्रतिमांसाठी सर्वात प्रभावी आहे. हे अधिक जटिल अल्गोरिदमच्या कॉम्प्रेशनच्या मध्यवर्ती टप्प्यांपैकी एक म्हणून देखील वापरले जाते.

शब्दकोश अल्गोरिदम

शब्दकोश अल्गोरिदममागील कल्पना अशी आहे की मूळ अनुक्रमातील घटकांची साखळी एन्कोड केलेली आहे. हे एन्कोडिंग एक विशेष शब्दकोश वापरते, जे मूळ अनुक्रमावर आधारित प्राप्त केले जाते.
शब्दकोश अल्गोरिदमचे संपूर्ण कुटुंब आहे, परंतु आम्ही सर्वात सामान्य अल्गोरिदम एलझेडडब्ल्यू पाहू, ज्याचे नाव त्याच्या डेव्हलपर लेपल, झिव्ह आणि वेल्च यांच्या नावावर आहे.
या अल्गोरिदममधील शब्दकोश हा एक टेबल आहे जो अल्गोरिदम चालत असताना कोडिंग चेनने भरलेला असतो. संकुचित कोड डीकोड केल्यावर, शब्दकोश आपोआप पुनर्संचयित केला जातो, म्हणून संकुचित कोडसह शब्दकोश प्रसारित करण्याची आवश्यकता नाही.
शब्दकोष सर्व सिंगलटन स्ट्रिंगसह सुरू केला आहे, म्हणजे. शब्दकोषाच्या पहिल्या ओळी त्या वर्णमाला दर्शवतात ज्यामध्ये आपण एन्कोड करतो. कॉम्प्रेशन दरम्यान, डिक्शनरीमध्ये आधीच रेकॉर्ड केलेल्या सर्वात लांब साखळीसाठी शोध घेतला जातो. प्रत्येक वेळी शब्दकोषात अद्याप लिहिलेली नसलेली साखळी समोर आली की ती तेथे जोडली जाते आणि शब्दकोषात आधीच लिहिलेल्या साखळीशी संबंधित संकुचित कोड आउटपुट असतो. सैद्धांतिकदृष्ट्या, शब्दकोशाच्या आकारावर कोणतेही निर्बंध लादलेले नाहीत, परंतु व्यवहारात हा आकार मर्यादित करणे अर्थपूर्ण आहे, कारण कालांतराने, साखळ्या दिसू लागतात ज्या यापुढे मजकूरात आढळत नाहीत. याव्यतिरिक्त, जेव्हा आम्ही टेबलचा आकार दुप्पट करतो, तेव्हा आम्हाला संकुचित कोड संचयित करण्यासाठी अतिरिक्त बिट वाटप करणे आवश्यक आहे. अशा परिस्थितींना प्रतिबंध करण्यासाठी, एक विशेष कोड सादर केला जातो, जो सर्व एकल-घटक साखळ्यांसह सारणीच्या प्रारंभाचे प्रतीक आहे.
कॉम्प्रेशन अल्गोरिदमचे उदाहरण पाहू. आम्ही cuckooccooocuckoohood लाईन कॉम्प्रेस करू. समजा की डिक्शनरीमध्ये 32 पोझिशन्स असतील, याचा अर्थ त्याच्या प्रत्येक कोडमध्ये 5 बिट्स असतील. सुरुवातीला, शब्दकोश खालीलप्रमाणे भरला आहे:

ही सारणी माहिती संकुचित करणाऱ्याच्या बाजूला आणि ती विघटित करणाऱ्याच्या बाजूला असते. आता आपण कॉम्प्रेशन प्रोसेस बघू.

डिक्शनरी भरण्याची प्रक्रिया टेबल दाखवते. हे मोजणे सोपे आहे की परिणामी संकुचित कोड 105 बिट्स घेते आणि मूळ मजकूर (एक वर्ण एन्कोडिंगसाठी 4 बिट खर्च करतो असे गृहीत धरून) 116 बिट्स लागतात.
थोडक्यात, डीकोडिंग प्रक्रिया कोडच्या थेट डीकोडिंगवर येते आणि हे महत्वाचे आहे की सारणी एन्कोडिंगच्या वेळी सुरू केली जाते. आता डीकोडिंग अल्गोरिदम पाहू.


डिक्शनरीमध्ये जोडलेली स्ट्रिंग आम्ही i+1 वरच i-th पायरीवर पूर्णपणे परिभाषित करू शकतो. अर्थात, i-th ओळ i+1 ओळीच्या पहिल्या वर्णाने संपली पाहिजे. ते. शब्दकोष कसा पुनर्संचयित करायचा ते आम्ही आत्ताच शोधून काढले. जेव्हा cScSc फॉर्मचा क्रम एन्कोड केला जातो तेव्हा काही स्वारस्य असते, जेथे c एक वर्ण आणि S एक स्ट्रिंग आहे आणि cS हा शब्द डिक्शनरीमध्ये आधीपासूनच आहे. पहिल्या दृष्टीक्षेपात असे दिसते की डीकोडर या परिस्थितीचे निराकरण करण्यात सक्षम होणार नाही, परंतु प्रत्यक्षात या प्रकारच्या सर्व ओळी ज्या वर्णाने सुरू होतात त्याच वर्णाने समाप्त होणे आवश्यक आहे.

सांख्यिकी कोडिंग अल्गोरिदम
या मालिकेतील अल्गोरिदम अनुक्रमांच्या सर्वाधिक वारंवार येणाऱ्या घटकांना सर्वात लहान संकुचित कोड नियुक्त करतात. त्या. समान लांबीचे अनुक्रम वेगवेगळ्या लांबीच्या संकुचित कोडसह एन्कोड केलेले आहेत. शिवाय, जितक्या वेळा एक क्रम येतो, तितका संकुचित कोड लहान असतो.
हफमन अल्गोरिदम
Huffman अल्गोरिदम तुम्हाला उपसर्ग कोड तयार करण्याची परवानगी देतो. बायनरी ट्रीमधील मार्ग म्हणून आपण उपसर्ग कोडचा विचार करू शकतो: नोडपासून त्याच्या डाव्या मुलाकडे जाणे कोडमधील 0 शी संबंधित आहे आणि त्याच्या उजव्या मुलाला 1 शी संबंधित आहे. जर आपण झाडाच्या पानांना चिन्हांसह लेबल केले तर एन्कोड करण्यासाठी, आम्हाला उपसर्ग कोडचे बायनरी ट्री प्रतिनिधित्व मिळते.
हफमॅन ट्री तयार करण्यासाठी आणि हफमन कोड मिळवण्यासाठी अल्गोरिदमचे वर्णन करूया.
  1. इनपुट वर्णमालाचे वर्ण विनामूल्य नोड्सची सूची तयार करतात. प्रत्येक शीटचे वजन असते जे चिन्हाच्या घटनेच्या वारंवारतेइतके असते
  2. सर्वात लहान वजनासह दोन विनामूल्य वृक्ष नोड निवडले आहेत
  3. त्यांचे पालक त्यांच्या एकूण वजनाच्या समान वजनाने तयार केले जातात
  4. पालकांना विनामूल्य नोड्सच्या सूचीमध्ये जोडले गेले आहे आणि त्यांची दोन मुले या सूचीमधून काढून टाकली आहेत
  5. पालक सोडून जाणारा एक चाप बिट 1 नियुक्त केला आहे, दुसरा बिट 0 नियुक्त केला आहे
  6. फ्री नोड्सच्या सूचीमध्ये फक्त एक मुक्त नोड शिल्लक राहेपर्यंत दुसऱ्यापासून सुरू होणारी पायऱ्यांची पुनरावृत्ती केली जाते. हे झाडाचे मूळ मानले जाईल.
या अल्गोरिदमचा वापर करून, वर्णांची वारंवारता लक्षात घेऊन, दिलेल्या वर्णमालासाठी आम्ही हफमन कोड मिळवू शकतो.
अंकगणित कोडिंग
अंकगणित कोडिंग अल्गोरिदम घटकांच्या स्ट्रिंग्सला अंशामध्ये एन्कोड करतात. या प्रकरणात, घटकांची वारंवारता वितरण खात्यात घेतले जाते. या क्षणी, अंकगणित कोडिंग अल्गोरिदम पेटंटद्वारे संरक्षित आहेत, म्हणून आम्ही फक्त मूळ कल्पना पाहू.
आपल्या वर्णमालेत अनुक्रमे N चिन्हे a1,...,aN आणि त्यांची वारंवारता p1,...,pN असू द्या. चला अर्ध-मांतर विभाजित करूया आणि CUDA तंत्रज्ञानाचा वापर करून JPEG अल्गोरिदमच्या सर्व टप्प्यांच्या समांतरीकरणाची अंमलबजावणी सादर करू, ज्याने JPEG मानकानुसार कॉम्प्रेशन आणि डीकोडिंगच्या कार्यप्रदर्शनास लक्षणीय गती दिली.

2010 मध्ये, प्लॅनेट प्रकल्पातील शास्त्रज्ञांनी स्विस आल्प्समधील विशेष बंकरमध्ये ठेवलेल्या एका विशेष कॅप्सूलमध्ये JPEG स्वरूप वाचण्यासाठी सूचना दिल्या. 21 व्या शतकाच्या सुरूवातीस लोकप्रिय असलेल्या डिजिटल फॉरमॅट्सबद्दल पश्चात माहिती जतन करण्याच्या उद्देशाने हे केले गेले.

देखील पहा

नोट्स

दुवे

  • JFIF स्पेसिफिकेशन 1.02 (टेक्स्ट फाइल)
  • JPEG ऑप्टिमायझेशन. भाग १, भाग २, भाग ३.
  • ट्यूटोरियल

UPD. मला मोनोस्पेस फॉरमॅटिंग काढून टाकण्यास भाग पाडले गेले. एक चांगला दिवस, habraparser ने प्री आणि कोड टॅगमध्ये फॉरमॅटिंग स्वीकारणे बंद केले. संपूर्ण मजकूर मूषात बदलला. हबर प्रशासन मला मदत करू शकले नाही. आता ते असमान आहे, परंतु किमान ते वाचनीय आहे.

jpg फाइल कशी कार्य करते हे तुम्हाला कधी जाणून घ्यायचे आहे का? चला आता ते शोधूया! तुमचे आवडते कंपाइलर आणि हेक्स एडिटर वार्म अप करा, आम्ही हे डीकोड करू:

मी मुद्दाम एक लहान रेखाचित्र घेतले. हे एक परिचित, परंतु जोरदारपणे संकुचित केलेले Google favicon आहे:

मी तुम्हाला ताबडतोब चेतावणी देतो की वर्णन सोपे केले आहे आणि प्रदान केलेली माहिती पूर्ण नाही, परंतु नंतर तपशील समजणे सोपे होईल.

एन्कोडिंग कसे होते हे माहीत नसतानाही, आम्ही फाइलमधून आधीच काहीतरी काढू शकतो.
- प्रारंभ मार्कर. हे नेहमी सर्व jpg फाइल्सच्या सुरुवातीला असते.
पुढे बाइट्स येतात . हे एक मार्कर आहे जे टिप्पणी विभागाची सुरूवात दर्शवते. पुढील 2 बाइट्स - विभागाची लांबी (या 2 बाइट्ससह). तर पुढच्या दोन मध्ये - टिप्पणी स्वतः. हे अक्षर कोड ":" आणि ") आहेत, म्हणजे. नियमित हसरा चेहरा. तुम्ही हेक्स एडिटरच्या उजव्या बाजूला पहिल्या ओळीत पाहू शकता.

एक छोटा सिद्धांत

अगदी थोडक्यात टप्प्याटप्प्याने:
हा डेटा कोणत्या क्रमाने एन्कोड केला जाऊ शकतो याचा विचार करूया. समजा की चॅनल Y संपूर्ण इमेजसाठी पूर्णपणे एन्कोड केलेले आहे, नंतर Cb, नंतर Cr. प्रत्येकाला डायल-अपवर चित्रे लोड केल्याचे आठवते. जर ते अशा प्रकारे एन्कोड केले असेल, तर स्क्रीनवर दिसण्यापूर्वी संपूर्ण प्रतिमा लोड होण्याची प्रतीक्षा करावी लागेल. फाईलचा शेवट हरवला तर ते देखील अप्रिय होईल. कदाचित इतर चांगली कारणे आहेत. म्हणून, एन्कोड केलेला डेटा एकामागून एक लहान भागांमध्ये व्यवस्थित केला जातो.

मी तुम्हाला आठवण करून देतो की प्रत्येक ब्लॉक Y ij, Cb ij, Cr ij हा हफमन कोडसह एन्कोड केलेला DCT गुणांकांचा मॅट्रिक्स आहे. फाइलमध्ये ते या क्रमाने मांडलेले आहेत: Y 00 Y 10 Y 01 Y 11 Cb 00 Cr 00 Y 20

फाइल वाचत आहे

एकदा आम्ही टिप्पणी काढल्यानंतर, हे समजणे सोपे होईल:
  • फाइल मार्करच्या आधीच्या सेक्टरमध्ये विभागली गेली आहे.
  • मार्कर 2 बाइट लांब आहेत, पहिला बाइट आहे.
  • जवळजवळ सर्व सेक्टर मार्कर नंतर पुढील 2 बाइट्समध्ये त्यांची लांबी साठवतात.
सोयीसाठी, मार्कर हायलाइट करूया:
FF D8 FF FE 00 04 3A 29 FF DB 00 43 00 A0 6E 78



FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF DB 00
43 01 AA B4 B4 F0 D2 F0 FF FF FF FF FF FF FF FF FF
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
FF FF FF C0 00 11 08 00 10 00 10 03 01 22 00 02
11 01 03 11 01 FF C4 00 15 00 01 01 00 00 00 00
00 00 00 00 00 00 00 00 00 00 03 02 FF C4 00 1A
10 01 00 02 03 01 00 00 00 00 00 00 00 00 00 00
00 01 00 12 02 11 31 21 FF C4 00 15 01 01 01 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 FF
C4 00 16 11 01 01 01 00 00 00 00 00 00 00 00 00
00 00 00 00 11 00 01 FF DA 00 0C 03 01 00 02 11
03 11 00 3F 00 AE E7 61 F2 1B D5 22 85 5D 04 3C
82 C8 48 B1 DC BF FF D9

मार्कर: DQT - परिमाण सारणी.

FF DB 00 43 00 A0 6E 78
8C 78 64 A0 8C 82 8C B4 AA A0 BE F0 FF FF F0 DC
DC F0 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF

विभाग शीर्षलेख नेहमी 3 बाइट्स घेते. आमच्या बाबतीत ते आहे. हेडरमध्ये हे समाविष्ट आहे:
लांबी: 0x43 = 67 बाइट्स
सारणीतील मूल्यांची लांबी: 0 (0 - 1 बाइट, 1 - 2 बाइट)
[_0] टेबल आयडी: 0
उर्वरित 64 बाइट्स 8x8 टेबल भरणे आवश्यक आहे.



टेबल मूल्ये ज्या क्रमाने भरली आहेत त्या क्रमाने जवळून पहा. या ऑर्डरला झिगझॅग ऑर्डर म्हणतात:

मार्कर: SOF0 - बेसलाइन DCT

या मार्करला SOF0 म्हणतात, आणि याचा अर्थ असा आहे की प्रतिमा बेस पद्धत वापरून एन्कोड केलेली आहे. हे खूप सामान्य आहे. परंतु इंटरनेटवर कमी लोकप्रिय नाही ही परिचित प्रगतीशील पद्धत आहे, जेव्हा कमी-रिझोल्यूशन प्रतिमा प्रथम लोड केली जाते आणि नंतर एक सामान्य चित्र. हे तुम्हाला पूर्ण डाउनलोडची वाट न पाहता तेथे काय दाखवले आहे ते समजून घेण्यास अनुमती देते. विनिर्देशनाने आणखी काही परिभाषित केले आहेत, जसे की मला वाटते, अगदी सामान्य पद्धती नाहीत.

FF C0 00 11 08 00 10 00 10 03 01 22 00 02
11 01 03 11 01

लांबी: 17 बाइट्स.
अचूकता: 8 बिट. मूळ पद्धतीमध्ये ते नेहमी 8 असते. मला समजले की, ही चॅनेलच्या मूल्यांची थोडी खोली आहे.
चित्राची उंची: 0x10 = 16
आकृतीची रुंदी: 0x10 = 16
घटकांची संख्या: 3. बहुतेकदा हे Y, Cb, Cr असतात.

पहिला घटक:
आयडी: १
क्षैतिज पातळ करणे (H 1): 2
[_2] अनुलंब पातळ करणे (V 1): 2
परिमाण सारणी आयडी: 0

2रा घटक:
आयडी: 2
क्षैतिज पातळ करणे (H 2): १
[_1] अनुलंब पातळ करणे (V 2): 1

3रा घटक:
आयडी: ३
क्षैतिज पातळ करणे (H 3): १
[_1] अनुलंब पातळ करणे (V 3): 1
परिमाण सारणी आयडी: 1

आता प्रतिमा किती पातळ आहे हे कसे ठरवायचे ते पहा. आम्हाला H कमाल = 2 आणि V कमाल = 2 सापडते. चॅनल i H max/H i वेळा क्षैतिज आणि V max/V i वेळा अनुलंब पातळ केले जाईल.

मार्कर: DHT (हफमन टेबल)

हा विभाग हफमन एन्कोडिंगद्वारे प्राप्त केलेले कोड आणि मूल्ये संग्रहित करतो.

FF C4 00 15 00 01 01 00 00 00 00
00 00 00 00 00 00 00 00 00 00 03 02

लांबी: 21 बाइट्स.
वर्ग: 0 (0 - DC गुणांकांची सारणी, 1 - AC गुणांकांची सारणी).
[_0] टेबल आयडी: 0
हफमन कोड लांबी: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
कोडची संख्या:
कोडची संख्या म्हणजे त्या लांबीच्या कोडची संख्या. कृपया लक्षात घ्या की विभाग फक्त कोडची लांबी साठवतो, स्वतः कोड नाही. संहिता आपल्यालाच शोधाव्या लागतात. तर, आमच्याकडे 1 लांबीचा एक कोड आणि 2 लांबीचा एक कोड आहे. एकूण 2 कोड, या टेबलमध्ये आणखी कोणतेही कोड नाहीत.
प्रत्येक कोडशी संबंधित मूल्य असते आणि ते खालीलप्रमाणे फाइलमध्ये सूचीबद्ध केले जातात. मूल्ये सिंगल-बाइट आहेत, म्हणून आम्ही 2 बाइट वाचतो.
- 1ल्या कोडचे मूल्य.
- 2 रा कोडचे मूल्य.

हफमन कोड ट्रीचे बांधकाम

आम्हाला DHT विभागात मिळालेल्या टेबलवरून बायनरी ट्री तयार करणे आवश्यक आहे. आणि या झाडावरून आपण प्रत्येक कोड ओळखतो. आम्ही मूल्ये टेबलमध्ये दर्शविलेल्या क्रमाने जोडतो. अल्गोरिदम सोपे आहे: आम्ही कोणत्या नोडमध्ये आहोत हे महत्त्वाचे नाही, आम्ही नेहमी डाव्या शाखेत मूल्य जोडण्याचा प्रयत्न करतो. आणि जर ती व्यस्त असेल तर उजवीकडे. आणि जर तिथे जागा नसेल, तर आम्ही उच्च स्तरावर परत येतो आणि तेथून प्रयत्न करतो. आपल्याला कोडच्या लांबीच्या समान पातळीवर थांबण्याची आवश्यकता आहे. डाव्या फांद्या 0 मूल्याशी संबंधित आहेत, उजव्या शाखा - 1.
टिप्पणी:
आपल्याला प्रत्येक वेळी शीर्षस्थानापासून प्रारंभ करण्याची आवश्यकता नाही. एक मूल्य जोडले - उच्च स्तरावर परत जा. योग्य शाखा अस्तित्वात आहे का? होय असल्यास, पुन्हा वर जा. नसल्यास, योग्य शाखा तयार करा आणि तेथे जा. त्यानंतर, या बिंदूपासून, पुढील मूल्य जोडण्यासाठी शोध सुरू करा.

या उदाहरणातील सर्व सारण्यांसाठी झाडे:


UPD (धन्यवाद): पहिल्या झाडाच्या नोड्समध्ये (DC, id =0) मूल्ये 0x03 आणि 0x02 असणे आवश्यक आहे

वर्तुळांमध्ये कोड्सचे अर्थ आहेत, वर्तुळांच्या खाली स्वतःच कोड्स आहेत (मला समजावून सांगू द्या की आम्ही ते प्रत्येक नोडच्या वरच्या मार्गाने जाऊन मिळवले). या कोड्ससह (या आणि इतर सारण्यांपैकी) आकृतीची सामग्री एन्कोड केलेली आहे.

मार्कर: SOS (स्कॅनची सुरुवात)

मार्करमधील बाइटचा अर्थ “होय! शेवटी, आम्ही थेट एन्कोड केलेल्या प्रतिमा विभागाचे विश्लेषण करण्यासाठी गेलो!” तथापि, विभागाला प्रतीकात्मकपणे SOS म्हणतात.

  FF DA 00 0C 03 01 00 02 11
03 11 00 3F 00

शीर्षलेख भागाची लांबी (संपूर्ण विभाग नाही): 12 बाइट्स.
स्कॅन घटकांची संख्या. आमच्याकडे Y, Cb, Cr साठी प्रत्येकी 3, एक आहे.

पहिला घटक:
प्रतिमा घटक क्रमांक: 1 (Y)
DC गुणांकांसाठी हफमन टेबल आयडी: 0
[_0] AC गुणांकांसाठी हफमन टेबल आयडी: 0

2रा घटक:
चित्र घटक क्रमांक: 2 (Cb)

[_1]

3रा घटक:
प्रतिमा घटक क्रमांक: 3 (Cr)
DC गुणांकांसाठी हफमन टेबल आयडी: 1
[_1] AC गुणांकांसाठी हफमन टेबल आयडी: 1

हे घटक चक्रीय पद्धतीने बदलतात.

हेडरचा भाग इथेच संपतो, इथून शेवटपर्यंत (मार्कर) एन्कोड केलेला डेटा असतो.


0

डीसी गुणांक शोधत आहे.
1. बिट्सचा क्रम वाचत आहे (जर आम्हाला 2 बाइट आढळले, तर हे मार्कर नाही तर फक्त एक बाइट आहे). प्रत्येक बिटानंतर, आम्ही वाचलेल्या बिटवर अवलंबून, 0 किंवा 1 शाखेच्या बाजूने हफमन झाडाच्या बाजूने (संबंधित अभिज्ञापकासह) पुढे जाऊ. आम्ही स्वतःला अंतिम नोडवर आढळल्यास आम्ही थांबतो.
10 1011101110011101100001111100100

2. आम्ही नोडचे मूल्य घेतो. जर ते 0 च्या बरोबरीचे असेल तर गुणांक 0 च्या बरोबरीचे असेल, आम्ही ते टेबलमध्ये लिहू आणि इतर गुणांक वाचण्यास पुढे जाऊ. आमच्या बाबतीत - 02. हे मूल्य बिट्समधील गुणांकाची लांबी आहे. म्हणजेच, आपण पुढील 2 बिट वाचतो, हे गुणांक असेल.
10 10 11101110011101100001111100100

3. जर बायनरी प्रस्तुतीकरणातील मूल्याचा पहिला अंक 1 असेल, तर आपण ते असे सोडू: DC_coef = मूल्य. अन्यथा, आम्ही रूपांतरित करतो: DC_coef = मूल्य-2 मूल्य लांबी +1 . आम्ही झिगझॅगच्या सुरूवातीस टेबलमध्ये गुणांक लिहितो - वरच्या डाव्या कोपर्यात.

AC गुणांक शोधत आहे.
1. चरण 1 प्रमाणेच, DC गुणांक शोधणे. आम्ही क्रम वाचणे सुरू ठेवतो:
10 10 1110 1110011101100001111100100

2. आम्ही नोडचे मूल्य घेतो. जर ते 0 असेल तर याचा अर्थ मॅट्रिक्सची उर्वरित मूल्ये शून्याने भरणे आवश्यक आहे. नंतर पुढील मॅट्रिक्स एन्कोड केले आहे. पहिले काही ज्यांनी हे वाचले आणि मला वैयक्तिक संदेशात याबद्दल लिहिले त्यांना कर्मात अधिक लाभ मिळेल. आमच्या बाबतीत, नोड मूल्य 0x31 आहे.
पहिले निबल: 0x3 - मॅट्रिक्समध्ये किती शून्य जोडले पाहिजेत हेच आहे. हे 3 शून्य गुणांक आहेत.
दुसरा निबल: 0x1 - बिट्समधील गुणांक लांबी. पुढील भाग वाचा.
10 10 1110 1 110011101100001111100100

3. डीसी गुणांक शोधण्याच्या चरण 3 प्रमाणेच.

तुम्ही आधीच समजून घेतल्याप्रमाणे, आम्हाला शून्य कोड मूल्य येईपर्यंत किंवा मॅट्रिक्स भरेपर्यंत तुम्हाला AC गुणांक वाचण्याची आवश्यकता आहे.
आमच्या बाबतीत आम्हाला मिळेल:
10 10 1110 1 1100 11 101 10 0 0 0 1 11110 0 100
आणि मॅट्रिक्स:





तुमच्या लक्षात आले की मूल्ये समान झिगझॅग पॅटर्नमध्ये भरलेली आहेत?
हा क्रम वापरण्याचे कारण सोपे आहे - कारण v आणि u ची मूल्ये जितकी मोठी असतील तितके कमी महत्त्वाचे गुणांक S vu वेगळे कोसाइन ट्रान्सफॉर्ममध्ये असेल. म्हणून, उच्च कम्प्रेशन दरांवर, क्षुल्लक गुणांक शून्यावर सेट केले जातात, ज्यामुळे फाइल आकार कमी होतो.

[-4 1 1 1 0 0 0 0] [ 5 -1 1 0 0 0 0 0]
[ 0 0 1 0 0 0 0 0] [-1 -2 -1 0 0 0 0 0]
[ 0 -1 0 0 0 0 0 0] [ 0 -1 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0] [-1 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0] [ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0] [ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0] [ 0 0 0 0 0 0 0 0]

[-4 2 2 1 0 0 0 0]
[-1 0 -1 0 0 0 0 0]
[-1 -1 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0]

अरे, मी हे सांगायला विसरलो की एन्कोड केलेले डीसी गुणांक स्वतः डीसी गुणांक नाहीत, परंतु मागील सारणीच्या गुणांकांमधील फरक (समान चॅनेल)! मॅट्रिक्स दुरुस्त करणे आवश्यक आहे:
2रा साठी DC: 2 + (-4) = -2
3ऱ्यासाठी DC: -2 + 5 = 3
चौथ्या साठी DC: 3 + (-4) = -1

[-2 1 1 1 0 0 0 0] [ 3 -1 1 0 0 0 0 0] [-1 2 2 1 0 0 0 0]
………

आता सर्व काही व्यवस्थित आहे. हा नियम फाईलच्या शेवटपर्यंत लागू होतो.

...आणि Cb आणि Cr साठी मॅट्रिक्सनुसार:

[-1 0 0 0 0 0 0 0]
[ 1 1 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0]

फक्त एकच मॅट्रिक्स असल्याने, DC गुणांक अस्पर्शित सोडले जाऊ शकतात.

गणना

परिमाणीकरण

मॅट्रिक्स क्वांटायझेशन टप्प्यातून जाते हे तुम्हाला आठवते का? मॅट्रिक्सचे घटक परिमाणीकरण मॅट्रिक्सच्या घटकांसह पदानुसार गुणाकार केले पाहिजेत. आपल्याला आवश्यक असलेली एक निवडणे बाकी आहे. आम्ही प्रथम पहिला घटक स्कॅन केला, त्याचा प्रतिमा घटक = 1. या आयडीसह प्रतिमा घटक 0 चे परिमाणीकरण मॅट्रिक्स वापरतो (आमचा दोनपैकी पहिला आहे). तर, गुणाकारानंतर:


[ 0 120 280 0 0 0 0 0]
[ 0 -130 -160 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0]

त्याचप्रमाणे, आम्हाला आणखी 3 Y-चॅनल मॅट्रिक्स मिळतात...

[-320 110 100 160 0 0 0 0] [ 480 -110 100 0 0 0 0 0]
[ 0 0 140 0 0 0 0 0] [-120 -240 -140 0 0 0 0 0]
[ 0 -130 0 0 0 0 0 0] [ 0 -130 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0] [-140 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0] [ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0] [ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0] [ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0] [ 0 0 0 0 0 0 0 0]

[-160 220 200 160 0 0 0 0]
[-120 0 -140 0 0 0 0 0]
[-140 -130 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0]

...आणि Cb आणि Cr साठी मॅट्रिक्सद्वारे.

[-170 0 0 0 0 0 0 0] [ 0 0 0 0 0 0 0 0]
[ 180 210 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0] [ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0] [ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0] [ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0] [ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0] [ 0 0 0 0 0 0 0 0]

इन्व्हर्स डिस्क्रिट कोसाइन ट्रान्सफॉर्म

सूत्र कठीण नसावे*. S vu हे आमचे परिणामी गुणांक मॅट्रिक्स आहे. u - स्तंभ, v - पंक्ती. s yx - थेट चॅनेल मूल्ये.

*सर्वसाधारणपणे बोलायचे झाले तर हे पूर्णपणे खरे नाही. जेव्हा मी स्क्रीनवर 16x16 प्रतिमा डीकोड आणि प्रदर्शित करण्यास सक्षम होतो, तेव्हा मी 600x600 प्रतिमा घेतली (तसे, हे Mind.In.A.Box च्या आवडत्या अल्बमचे मुखपृष्ठ होते - Lost Alone). हे लगेच कार्य करत नाही - विविध बग समोर आले. लवकरच मी योग्यरित्या लोड केलेल्या चित्राची प्रशंसा करू शकेन. मला खरोखर अस्वस्थ करणारी एकमेव गोष्ट म्हणजे लोडिंग गती. मला अजूनही आठवते की यास 7 सेकंद लागले. परंतु हे आश्चर्यकारक नाही, जर तुम्ही अविचारीपणे वरील सूत्र वापरत असाल, तर एका पिक्सेलच्या एका चॅनेलची गणना करण्यासाठी तुम्हाला 128 कोसाइन, 768 गुणाकार आणि काही जोडणे आवश्यक आहेत. फक्त त्याबद्दल विचार करा - एका पिक्सेलच्या फक्त एका चॅनेलवर जवळजवळ हजार कठीण ऑपरेशन्स! सुदैवाने, ऑप्टिमायझेशनसाठी जागा आहे (बऱ्याच प्रयोगानंतर, मी लोडिंगची वेळ 15ms च्या टायमर अचूकतेच्या मर्यादेपर्यंत कमी केली आणि त्यानंतर मी प्रतिमा 25 पट मोठ्या क्षेत्रासह फोटोमध्ये बदलली. कदाचित मी याबद्दल लिहीन. एक स्वतंत्र लेख).

मी चॅनेल Y च्या फक्त पहिल्या मॅट्रिक्सची गणना केल्याचे निकाल लिहीन (मूल्ये गोलाकार आहेत):


[ 87 72 50 36 37 55 79 95]
[-10 5 31 56 71 73 68 62]
[-87 -50 6 56 79 72 48 29]

आणि उर्वरित 2:
Cb Cr
[ 60 52 38 20 0 -18 -32 -40] [ 19 27 41 60 80 99 113 120]
[ 48 41 29 13 -3 -19 -31 -37] [ 0 6 18 34 51 66 78 85]
[ 25 20 12 2 -9 -19 -27 -32] [-27 -22 -14 -4 7 17 25 30]
[ -4 -6 -9 -13 -17 -20 -23 -25] [-43 -41 -38 -34 -30 -27 -24 -22]
[ -37 -35 -33 -29 -25 -21 -18 -17] [-35 -36 -39 -43 -47 -51 -53 -55]
[ -67 -63 -55 -44 -33 -22 -14 -10] [ -5 -9 -17 -28 -39 -50 -58 -62]
[ -90 -84 -71 -56 -39 -23 -11 -4] [ 32 26 14 -1 -18 -34 -46 -53]
[-102 -95 -81 -62 -42 -23 -9 -1] [ 58 50 36 18 -2 -20 -34 -42]

  1. अरे, मी जाऊन खाईन!
  2. होय, मी अजिबात हलत नाही, आपण कशाबद्दल बोलत आहोत.
  3. एकदा YCbCr कलर व्हॅल्यूज प्राप्त झाल्यानंतर, त्यांना RGB मध्ये रूपांतरित करणे बाकी आहे, जसे: YCbCrToRGB(Y ij , Cb ij , Cr ij) , Y ij , Cb ij , Cr ij - आमचे परिणामी मॅट्रिक्स.
  4. 4 Y मॅट्रिक्स, आणि प्रत्येकी एक Cb आणि Cr, आम्ही चॅनेल पातळ केल्यामुळे आणि 4 Y पिक्सेल एक Cb आणि Cr शी संबंधित आहेत. म्हणून, याप्रमाणे गणना करा: YCbCrToRGB(Y ij , Cb , Cr )
तुम्ही 1 आणि 4 निवडल्यास, मी तुमच्यासाठी आनंदी आहे. एकतर तुम्हाला ते बरोबर समजले आहे किंवा तुम्ही लवकरच तुमच्या जेवणाचा आनंद घ्याल.

YCbCr ते RGB

R = Y + 1.402 * Cr
G = Y - 0.34414 * Cb - 0.71414 * Cr
B = Y + 1.772 * Cb
128 जोडण्यास विसरू नका. जर मूल्ये मध्यांतराच्या पलीकडे गेली तर सीमा मूल्ये नियुक्त करा. सूत्र सोपे आहे, परंतु ते प्रोसेसर वेळेचा वाटा देखील खातो.

आमच्या उदाहरणाच्या वरच्या डाव्या 8x8 स्क्वेअरसाठी R, G, B चॅनेलसाठी परिणामी सारण्या येथे आहेत:
255 248 194 148 169 215 255 255
255 238 172 115 130 178 255 255
255 208 127 59 64 112 208 255
255 223 143 74 77 120 211 255
237 192 133 83 85 118 184 222
177 161 146 132 145 162 201 217
56 73 101 126 144 147 147 141
0 17 76 126 153 146 127 108

231 185 117 72 67 113 171 217
229 175 95 39 28 76 139 189
254 192 100 31 15 63 131 185
255 207 115 46 28 71 134 185
255 241 175 125 112 145 193 230
226 210 187 173 172 189 209 225
149 166 191 216 229 232 225 220
72 110 166 216 238 231 206 186

255 255 249 203 178 224 255 255
255 255 226 170 140 187 224 255
255 255 192 123 91 138 184 238
255 255 208 139 103 146 188 239
255 255 202 152 128 161 194 232
255 244 215 200 188 205 210 227
108 125 148 172 182 184 172 167
31 69 122 172 191 183 153 134

शेवट

सर्वसाधारणपणे, मी JPEG तज्ञ नाही, म्हणून मी सर्व प्रश्नांची उत्तरे देऊ शकत नाही. हे इतकेच आहे की जेव्हा मी माझा डीकोडर लिहित होतो, तेव्हा मला बऱ्याचदा न समजण्याजोग्या समस्यांना सामोरे जावे लागले. आणि जेव्हा प्रतिमा चुकीच्या पद्धतीने प्रदर्शित केली गेली तेव्हा मी कुठे चूक केली हे मला माहित नव्हते. कदाचित त्याने बिट्सचा चुकीचा अर्थ लावला असेल किंवा कदाचित त्याने डीसीटी चुकीच्या पद्धतीने वापरला असेल. मी खरोखर चरण-दर-चरण उदाहरण गमावले होते, म्हणून मला आशा आहे की हा लेख डीकोडर लिहिताना मदत करेल. मला वाटते की त्यात मूलभूत पद्धतीचे वर्णन समाविष्ट आहे, परंतु तरीही आपण ते एकटे करू शकत नाही. मी तुम्हाला दुवे ऑफर करतो ज्याने मला मदत केली:

JPEG सारख्या योजनांमध्ये क्वांटायझेशन मॅट्रिक्सची अनुकूली निर्मिती

लुझकोव्ह युरी व्हॅलेरिविच,

सेंट पीटर्सबर्ग स्टेट युनिव्हर्सिटी ऑफ इन्फॉर्मेशन टेक्नॉलॉजीज, मेकॅनिक्स आणि ऑप्टिक्सचे पदव्युत्तर विद्यार्थी.

वैज्ञानिक पर्यवेक्षक – डॉक्टर ऑफ टेक्निकल सायन्सेस, प्रोफेसर

ट्रॉपचेन्को अलेक्झांडर युवेनालिविच.

परिचय

अलिकडच्या वर्षांत, वेव्हलेट ट्रान्सफॉर्म्सवर आधारित हानीकारक प्रतिमा कॉम्प्रेशन स्कीम लोकप्रिय करण्याचा एक स्पष्ट प्रवृत्ती आहे. तथापि, डिस्क्रिट कोसाइन ट्रान्सफॉर्म (डीसीटी) वर आधारित इमेज कॉम्प्रेशन फॉरमॅट अजूनही सर्वात जास्त वापरले जातात.

व्यापक स्वरूप JPEG (संयुक्त छायाचित्रण तज्ञ गट) [ वॉलेस जी.के.] संशोधकांसमोर खालील प्रश्न उपस्थित करतात: डीकंप्रेशन अल्गोरिदम न बदलता कॉम्प्रेशन गुणवत्ता वाढवण्यासाठी विद्यमान कॉम्प्रेशन स्कीममध्ये बदल करणे शक्य आहे का?या समस्येचे निराकरण केल्याने वापरकर्त्यांद्वारे प्रतिमा डीकंप्रेशनसाठी विशेष (सुधारित) सॉफ्टवेअरच्या उपलब्धतेबद्दल काळजी न करता विद्यमान कंप्रेसरमध्ये बदल लागू करणे शक्य होईल.

JPEG सारख्या योजनेद्वारे आमचा अर्थ प्रतिमेला आयताकृती तुकड्यांमध्ये विभाजित करून कॉम्प्रेशन स्कीमचा एक प्रकार आहे, ज्याचे अनिवार्य घटक आहेत: ऑर्थोगोनल ट्रान्सफॉर्मेशन, रूपांतरित डेटाचे परिमाण आणि त्यानंतरचे सांख्यिकीय एन्कोडिंग.

अनेक कॉम्प्रेशन अल्गोरिदम अनेक डीफॉल्ट पॅरामीटर्स वापरतात. JPEG मध्ये, यामध्ये क्वांटायझेशन मॅट्रिक्स आणि हफमन टेबल समाविष्ट आहेत. ते संकुचित फाइलच्या शीर्षलेखात संग्रहित केले जातात आणि वापरकर्त्याद्वारे स्वतंत्रपणे निर्धारित केले जाऊ शकतात, जे कम्प्रेशनची गुणवत्ता सुधारण्यास अनुमती देते.

अशा प्रकारे, आज जेपीईजी क्वांटायझेशन मॅट्रिक्स (उदाहरणार्थ, आणि ) संकलित करण्यासाठी अनेक पद्धती आधीच प्रस्तावित केल्या गेल्या आहेत, जे तथापि, सार्वत्रिक नाहीत.आमच्या कामात, आम्ही स्पेक्ट्रम गुणांकांच्या अनुकूली स्केलर क्वांटायझेशनसाठी एक सामान्यीकृत दृष्टीकोन विचारात घेणार आहोत, जे अंमलबजावणी करणे सोपे आहे आणि जेपीईजी सारख्या योजनांमध्ये लागू केले जाऊ शकते.

अनुकूली सिग्नल परिमाणीकरण

क्वांटायझेशन ही सिग्नल प्रक्रियेची एक पद्धत आहे ज्यामध्ये विकृतीचा समावेश होतो. सार स्केलर परिमाणीकरणपर्यंत खाली येते फंक्शन व्हॅल्यूजच्या मर्यादेत मध्यांतरांच्या मर्यादेत विभागणे आणि नंतर या मध्यांतरातील कोणतेही मूल्य दर्शवण्यासाठी एक मूल्य निवडणे.

तर, नंतर मध्यांतरांचा संच आणि गुणांचा संच द्या परिमाणीकरण कार्यसाठी म्हणून परिभाषित केले आहे. कधी एकसमान स्केलर परिमाणीकरणमध्यांतरांचा संच खालीलप्रमाणे दर्शविला जाऊ शकतो:

कुठे - पॅरामीटर, किंवा परिमाणीकरण पायरी, - मूलभूत अंतराल ऑफसेट, , – मध्यांतराची संख्या, जी एन्कोड केलेली ऑब्जेक्ट आहे. मग परिमाणीकरण ऑपरेशन राउंडिंगसह साध्या विभाजनात कमी केले जाऊ शकते:

.(1)

स्केलर क्वांटायझेशनमधील अनुकूलता प्रत्येक क्वांटाइज्ड मूल्यासाठी क्वांटायझेशन चरणाच्या वैयक्तिक निवडीद्वारे प्राप्त केली जाते.

वजन निकषावर आधारित अनुकूली स्केलर परिमाणीकरण

आम्ही प्रस्तावित केलेला दृष्टिकोन आधारित आहे वर्णक्रमीय गुणांकांचे सांख्यिकीय विश्लेषण. हे कॉम्प्रेशन स्कीममध्ये वापरले जाऊ शकते (उदा JPEG ) प्रदान केले की सिग्नल स्कॅनिंग विंडोचा आकार स्थिर असतो.

तर, परिमाणांचा एक क्रम द्या, ज्यामध्ये विभागले गेलेएमच्या समान ब्लॉक्स्एनप्रत्येकामध्ये मूल्ये, आणि दिलेल्या ब्लॉकमधील घटकाची अनुक्रमणिका आहे, म्हणजेच प्रत्येक घटकाचे इतर कोणत्याही ब्लॉकमध्ये त्याचे ॲनालॉग आहे. प्रस्तावित दृष्टिकोनाचे सार खालीलप्रमाणे आहे: प्रत्येकासाठीnव्या घटकाचे, विशेष वजन निकषाचे मूल्य मोजले जाते आणि दिलेल्या स्पेक्ट्रम घटकाचे परिमाणीकरण चरण वजन निकषाचे संबंधित मूल्य जितके मोठे असेल तितके लहान सेट केले जाते.

अशा प्रकारे, द्वारे संकलित केलेल्या सिग्नलबद्दल काही सांख्यिकीय माहिती विचारात घेऊन परिमाणीकरण प्रक्रिया केली जाते.एमब्लॉक्स आणि प्रत्येक निर्देशांकाच्या घटकांसाठी अद्वितीय n. या प्रकरणात परिमाणीकरण कार्य (1) म्हणून दर्शविले जाईल, आणि परिमाणीकरण पॅरामीटर कार्य – .

चला एक निकष ओळखू या, त्यास कॉल करा स्पेक्ट्रम गुणांक वजन. मूल्य संबंधित वर्णक्रमीय स्थितीचे महत्त्व दर्शवेलnगुणांक .

एक गणना पद्धत सरासरी मोठेपणावर आधारित आहे:

.(2)

प्रयोगांनी दाखवल्याप्रमाणे, DCT गुणांकांसाठी (2) नुसार गणना केल्याने उच्च- आणि कमी-फ्रिक्वेंसी स्पेक्ट्रम गुणांकांसाठी निकष मूल्यांचे असमान वितरण होते. आपण वापरून परिस्थिती दुरुस्त करू शकता सुधारात्मक कार्य(खाली पहा), किंवा कमाल मोठेपणावर आधारित मूल्यांची गणना करून:

.(3)

फंक्शन परिभाषित करण्याच्या प्रश्नाकडे वळू. त्याची मूल्ये श्रेणीनुसार मर्यादित असू द्या . चला एक रेखीय कार्य सादर करूया:

,

कुठे आणि अनुक्रमे किमान आणि कमाल मूल्ये आहेत (केस स्वतंत्रपणे विचारात घेतला जातो).

व्यवहारात, ची नॉनलाइनर फंक्शन वापरणे फायदेशीर ठरू शकते, जे सुधार फंक्शनच्या वापराद्वारे प्राप्त केले जाते:

.(4)

कोणतेही सर्वसाधारणपणे मूळ वर्णक्रमीय वेक्टरच्या सर्व घटकांवर अवलंबून असल्याने, कार्यवर देखील अवलंबून आहे. खरं तर, हे सिग्नल परिमाणीकरण चरणाचे कार्य आहे. नोटेशनचा परिचय करून देऊ . मग सूत्र (4) शेवटी फॉर्म घेते:

.(5)

अशा प्रकारे, परिमाणीकरण चरण फंक्शन पासून श्रेणीमध्ये स्थानिकीकृत आहेa 1 ते a 2 त्याचे आकार बदलून, गुणांकांच्या विशिष्ट गटांना कमी किंवा जास्त प्रमाणात दाबणे शक्य आहे.

आता सर्किटमध्ये क्वांटायझेशन मॅट्रिक्सच्या अनुकूली निर्मितीसाठी प्रस्तावित दृष्टिकोन लागू करूया JPEG . (5) मध्ये आपण रेखीय सुधारणा फंक्शन आणि कमाल मोठेपणाचे निकष (3) वापरू.

डीफॉल्ट परिमाणीकरण चरण कार्यांचे आलेख JPEG अंजीर मध्ये दर्शविले आहेत.1 उरला. Δ प्रतिमेसाठी अनुकूलपणे व्युत्पन्न केलेले आलेख "म्हातारा माणूस" अंजीर मध्ये दर्शविले आहेत.1, बरोबर. दोन्ही प्रकरणांमध्ये, मूल्ये चढत्या क्रमाने लावली जातात. जसे आपण पाहू शकता, वितर्क मूल्यांच्या पहिल्या तृतीयांशासाठी Δ मध्ये तीव्र वाढ झाली आहे, जी विशेषतः व्युत्पन्न केलेल्या कार्यांसाठी वैशिष्ट्यपूर्ण आहे. या साइटवर व्युत्पन्नΔ काही ठिकाणी मानक मूल्यांपेक्षा लक्षणीयरीत्या ओलांडते, ज्यामुळे संबंधित फ्रिक्वेन्सीचे जास्त दडपण होते.


तांदूळ. 1. ऑर्डर केलेले मानक आणि व्युत्पन्न क्वांटायझेशन पॅरामीटर फंक्शन्स

चढत्या मूल्ये.

प्रतिमेसाठी आलेख "म्हातारा माणूस" अंजीर मध्ये दर्शविले आहे.2 बाकी. उजवीकडे प्रयोगाचा भाग म्हणून तयार केलेले डीफॉल्ट मॅट्रिक्स आणि मॅट्रिक्स वापरून कॉम्प्रेशन परिणाम आहेत. परिणामांवरून पाहिले जाऊ शकते, समान मूल्यांसह अनुकूली दृष्टिकोनाच्या बाजूने कॉम्प्रेशन रेशोमधील फरक 20% पर्यंत आहे PSNR.


तांदूळ. 2. सर्किटसाठी अनुकूली क्वांटायझेशन मॅट्रिक्सची निर्मिती JPEG.

निष्कर्ष

आम्ही स्पेक्ट्रम गुणांकांच्या अनुकूली स्केलर परिमाणीकरणासाठी एक पद्धत प्रस्तावित केली आहे, जी वर्णक्रमीय घटकांच्या महत्त्वाच्या निकषावर आधारित आहे. प्रयोगांनी दाखवल्याप्रमाणे, सर्किटमध्ये विचारात घेतलेल्या दृष्टिकोनाचा वापर JPEG तुम्हाला मानक क्वांटायझेशन मॅट्रिक्स वापरण्याच्या तुलनेत 20% पर्यंत कम्प्रेशन रेशोमध्ये फायदा मिळवण्याची परवानगी देते.

विचारात घेतलेल्या बदलाच्या व्यावहारिक वापरामध्ये केवळ कंप्रेसरची अंमलबजावणी समाविष्ट आहे आणि प्रतिमा पाहण्यासाठी मानक वापरणे पुरेसे आहे. JPEG -डीकंप्रेसर, जो प्रस्तावित सोल्यूशनचा एक महत्त्वाचा फायदा आहे.

साहित्य

1. फंग एच. टी., पार्कर के. जे. JPEG // जर्नल ऑफ इलेक्ट्रॉनिक इमेजिंगसाठी इमेज-ॲडॉप्टिव्ह क्वांटायझेशन टेबलची रचना. - 1996. - खंड. 4, एन. 2. - पृष्ठ 144 - 150.

2. ग्रे R.M., Neuhoff D.L.क्वांटायझेशन // माहिती सिद्धांतावर IEEE व्यवहार. - 1998. - खंड. ४४, एन. ६. – पृष्ठ २३२५ – २३८३.

3. रत्नाकर व्ही., लिव्हनी एम. विस्तारित आरडी -जेपीईजी ऑप्टिमायझेशन // डेटा कॉम्प्रेशन कॉन्फरन्ससाठी ग्लोबल थ्रेशोल्डिंगसह ऑप्ट.– 1996.

4. वॉलेस जी. के. जेपीईजी स्टिल पिक्चर कॉम्प्रेशन स्टँडर्ड // IEEE ट्रान्स. उपभोक्ता इलेक्ट्रॉनिक्स. - 1992. - खंड. 38, एन. 1. - पृष्ठ 18 - 34.

सर्व डीसीटी गुणांकांची गणना केल्यानंतर, त्यांना परिमाणित करणे आवश्यक आहे. या चरणावर, माहितीचा काही भाग टाकून दिला जातो (संगणकांच्या मर्यादित अचूकतेमुळे मागील चरणात लहान नुकसान देखील होते). DCT गुणांक मॅट्रिक्समधील प्रत्येक संख्येला "परिमाणीकरण सारणी" मधील एका विशेष संख्येने विभाजित केले जाते आणि परिणाम जवळच्या पूर्णांकापर्यंत पूर्ण केला जातो. आधीच नमूद केल्याप्रमाणे, प्रत्येक रंगाच्या घटकासाठी अशा तीन टेबल्स असणे आवश्यक आहे. JPEG मानक चार सारण्यांना परवानगी देते आणि वापरकर्ता रंग घटकांचे परिमाण करण्यासाठी यापैकी कोणतेही टेबल निवडू शकतो. परिमाण सारणीतील सर्व 64 संख्या जेपीईजी पॅरामीटर्स आहेत. तत्त्वतः, वापरकर्ता उच्च कम्प्रेशन गुणोत्तर प्राप्त करण्यासाठी कोणतेही गुणोत्तर बदलू शकतो. सराव मध्ये, इतक्या मोठ्या संख्येने पॅरामीटर्ससह प्रयोग करणे खूप कठीण आहे, म्हणून JPEG सॉफ्टवेअर दोन पद्धती वापरते:

1. डीफॉल्ट परिमाण सारणी. असे दोन तक्ते, एक ल्युमिनोसिटी घटकासाठी (आणि ग्रेस्केलसाठी) आणि दुसरे क्रोमॅटिक घटकांसाठी, जेपीईजी समितीने केलेल्या अनेक प्रयोगांसह दीर्घ अभ्यासाचे परिणाम आहेत. ते JPEG मानकांचा भाग आहेत आणि टेबलमध्ये पुनरुत्पादित केले आहेत. ३.५०. वरच्या डाव्या कोपऱ्यातून खालच्या उजव्या कोपर्यात जाताना टेबलांचे QC गुणांक कसे वाढतात ते तुम्ही पाहू शकता. हे उच्च अवकाशीय फ्रिक्वेन्सीशी संबंधित DCT गुणांकातील घट प्रतिबिंबित करते.

2. वापरकर्त्याद्वारे निर्दिष्ट केलेल्या पॅरामीटरवर अवलंबून, परिमाणीकरण गुणांकांची एक साधी सारणी मोजली जाते. सारखे साधे भाव गुणांक वरच्या डावीकडून खालच्या उजवीकडे कमी होतील याची हमी.

प्रकाशमान

जर क्वांटायझेशन योग्यरित्या केले असेल, तर डीसीटी गुणांकांच्या ब्लॉकमध्ये फक्त काही शून्य नसलेले गुणांक असतील, जे मॅट्रिक्सच्या वरच्या डाव्या कोपर्यात केंद्रित असतील. हे अंक जेपीईजी अल्गोरिदमचे आउटपुट आहेत, परंतु आउटपुट फाइलवर लिहिण्यापूर्वी ते अधिक संकुचित केले जाणे आवश्यक आहे. जेपीईजी साहित्यात या कम्प्रेशनला "एंट्रोपी एन्कोडिंग" म्हणतात, ज्याच्या तपशीलांची चर्चा § 3.7.5 मध्ये केली जाईल. 8x8 पूर्णांक मॅट्रिक्स कॉम्प्रेस करण्यासाठी एन्ट्रॉपी कोडिंगमध्ये तीन तंत्रे वापरली जातात.

3. झिगझॅगमध्ये स्कॅन केल्याप्रमाणे 64 संख्या एकामागून एक रांगेत आहेत (चित्र 3.5a पहा). सुरुवातीला शून्य नसलेल्या संख्या असतात, सामान्यतः सर्व शून्यांची लांब शेपटी असते. केवळ शून्य नसलेल्या संख्या (योग्य एन्कोडिंगनंतर) फाइलमध्ये आउटपुट केल्या जातात, त्यानंतर विशेष EOB (अंत-ऑफ-ब्लॉक) कोड येतो. शून्यांची संपूर्ण शेपटी रेकॉर्ड करण्याची आवश्यकता नाही (EOB ला शून्यांची एक लांब मालिका एन्कोड करण्यासाठी देखील म्हटले जाऊ शकते).

उदाहरण: टेबलमध्ये. आकृती 3.51 काल्पनिक DCT गुणांकांची सूची दर्शविते, त्यापैकी फक्त 4 शून्य नाहीत. या संख्यांचा क्रम झिगझॅग करून, गुणांकांचा क्रम प्राप्त होतो:

टेबल ३.५१. परिमाणित गुणांक.

झिगझॅग पॅटर्नमध्ये मॅट्रिक्स घटक वाचण्यासाठी सबरूटीन कसे लिहायचे? सर्वात सोपा मार्ग म्हणजे हा मार्ग मॅन्युअली ट्रेस करणे आणि परिणाम zz रचनांच्या ॲरेमध्ये रेकॉर्ड करणे, ज्यामध्ये प्रत्येक संरचनेत सेल कोऑर्डिनेट्सची जोडी असते ज्यामधून झिगझॅग मार्ग जातो (चित्र 3.52 पहा).

जर रचना zz चे घटक zz.r आणि zz.c नियुक्त केले असतील, तर खालील चक्र वापरून झिगझॅग मार्ग पूर्ण केला जाऊ शकतो.

4. गैर-शून्य रूपांतरण गुणांक Huffman पद्धत वापरून संकुचित केले जातात (§ 3.7.5 पहा).

5. यापैकी पहिली संख्या (DC गुणांक, पृष्ठ 145 पहा) इतर संख्यांपासून (AC गुणांक) स्वतंत्रपणे प्रक्रिया केली जाते.

तांदूळ. ३.५२. झिगझॅग मार्गाचे निर्देशांक.



आम्ही वाचण्याची शिफारस करतो

वर