نحوه راه اندازی گوشی های هوشمند و رایانه های شخصی پرتال اطلاعاتی

رمزگذاری Jpeg الگوریتم های کدگذاری آنتروپی

این الگوریتم توسط گروهی از متخصصان در زمینه عکاسی (Joint Photographic Expert Group) به طور خاص برای فشرده سازی تصاویر 24 بیتی و مقیاس خاکستری در سال 1991 توسعه یافت. این الگوریتم در فشرده‌سازی تصاویر دوسطحی خیلی خوب نیست، اما تصاویر را با زنگ‌های پیوسته به خوبی مدیریت می‌کند، که در آن پیکسل‌های اطراف تمایل دارند رنگ‌های مشابهی داشته باشند. معمولاً چشم با فشرده شدن 10 یا 20 بار با این روش نمی تواند تفاوتی را متوجه شود.

این الگوریتم بر اساس DCT اعمال شده بر روی یک ماتریس 8x8 پیکسل از بلوک های تصویری غیرمجاز است. DCT این بلوک ها را با توجه به دامنه فرکانس های خاص تجزیه می کند. در نتیجه، ماتریسی به دست می آید که در آن ضرایب زیادی، به عنوان یک قاعده، نزدیک به صفر هستند، که می تواند به شکل عددی تقریبی نشان داده شود، یعنی. به صورت کوانتیزه بدون افت قابل توجه در کیفیت ترمیم.

بیایید عملکرد الگوریتم را با جزئیات بیشتری در نظر بگیریم. فرض کنید یک تصویر 24 بیتی تمام رنگی را فشرده می کنید. در این صورت مراحل کار زیر را بدست می آوریم.

مرحله 1.با استفاده از عبارت زیر تصویر را از فضای RGB به فضای YCbCr ترجمه می کنیم:

ما فوراً متذکر می شویم که تبدیل معکوس به راحتی با ضرب ماتریس معکوس در یک بردار به دست می آید که اساساً فضای YUV است:

.

گام 2.تصویر اصلی را به ماتریس های 8x8 تقسیم کنید. از هر کدام سه ماتریس DCT کار می کنیم - 8 بیت به طور جداگانه برای هر جزء. در نسبت های فشرده سازی بالا، بلوک 8x8 به اجزای YCbCr در قالب 4: 2: 0 تجزیه می شود، یعنی. اجزای Cb و Cr از طریق یک نقطه در امتداد سطرها و ستون ها گرفته می شوند.

مرحله 3.استفاده از DCT بر روی بلوک های تصویر 8x8 پیکسل. به طور رسمی، DCT مستقیم برای بلوک 8x8 می تواند به صورت نوشته شود

جایی که ... از آنجایی که DCT "قلب" الگوریتم JPEG است، در عمل مطلوب است که آن را در سریع ترین زمان ممکن محاسبه کنید. یک روش ساده برای افزایش سرعت محاسبات، محاسبه توابع کسینوس قبل از زمان و جدول بندی نتایج است. علاوه بر این، با توجه به متعامد بودن توابع کسینوس با فرکانس های مختلف، فرمول فوق را می توان به صورت زیر نوشت:

.

در اینجا یک ماتریس 8x8 است که فضای 8 بعدی را برای نشان دادن ستون های یک بلوک در آن فضا توصیف می کند. ماتریس یک ماتریس جابه‌جایی است و همین کار را می‌کند، اما برای ردیف‌های بلوک. نتیجه یک تبدیل قابل تفکیک است که به صورت ماتریسی به صورت نوشته می شود

در اینجا نتیجه DCT است که محاسبه آن نیاز به عملیات ضرب و تقریباً همان مقدار جمع دارد که به طور قابل توجهی کمتر از محاسبات مستقیم با استفاده از فرمول بالا است. به عنوان مثال، تبدیل یک تصویر 512x512 پیکسل به عملیات حسابی نیاز دارد. با در نظر گرفتن 3 جزء روشنایی، مقدار 12 582 912 عملیات حسابی را به دست می آوریم. با استفاده از الگوریتم تبدیل فوریه سریع می توان تعداد ضرب و جمع را کاهش داد. در نتیجه، برای تبدیل یک بلوک 8×8، باید 54 ضرب، 468 جمع و جابجایی بیت انجام دهید.

در نتیجه DCT ، ماتریسی به دست می آوریم که در آن ضرایب در گوشه سمت چپ بالا با مولفه فرکانس پایین تصویر و در سمت راست پایین - با فرکانس بالا مطابقت دارد.

مرحله 4.کوانتیزاسیون در این مرحله، برخی از اطلاعات کنار گذاشته می شود. در اینجا، هر عدد از ماتریس به یک عدد خاص از "جدول کوانتیزاسیون" تقسیم می شود و نتیجه به نزدیکترین عدد صحیح گرد می شود:

.

علاوه بر این، برای هر ماتریس Y، Cb و Cr، می توانید جداول کوانتیزاسیون خود را تنظیم کنید. استاندارد JPEG حتی اجازه استفاده از جداول کوانتیزاسیون خود را می دهد، که با این حال، باید همراه با داده های فشرده به رمزگشا منتقل شود، که باعث افزایش اندازه کلی فایل می شود. واضح است که انتخاب 64 ضریب به تنهایی برای یک کاربر دشوار است، بنابراین استاندارد JPEG از دو رویکرد برای ماتریس‌های کوانتیزاسیون استفاده می‌کند. اولین مورد این است که استاندارد JPEG شامل دو جدول کوانتیزاسیون توصیه شده است: یکی برای luma و دیگری برای chroma. این جداول در زیر ارائه شده است. روش دوم سنتز (محاسبه در پرواز) یک جدول کوانتیزاسیون است که به یک پارامتری که توسط کاربر مشخص شده است بستگی دارد. خود جدول با استفاده از فرمول ساخته شده است

در مرحله کوانتیزاسیون، نسبت تراکم کنترل می شود و بیشترین تلفات رخ می دهد. واضح است که با تنظیم جداول کوانتیزاسیون با ضرایب بزرگ، به صفرهای بیشتر و در نتیجه نسبت تراکم بزرگتر خواهیم رسید.

کوانتیزاسیون نیز با اثرات خاص الگوریتم همراه است. در مقادیر زیاد مرحله کوانتیزاسیون، تلفات می تواند به قدری زیاد باشد که تصویر به مربع های تک رنگ 8x8 تقسیم شود. به نوبه خود، تلفات در فرکانس های بالا می تواند خود را در به اصطلاح "اثر گیبس" نشان دهد، زمانی که یک "هاله" مواج در اطراف خطوط با یک انتقال رنگ تیز تشکیل می شود.

مرحله 5.ماتریس 8x8 را با استفاده از اسکن "زیگزاگ" به یک بردار 64 عنصری ترجمه می کنیم (شکل 2).

برنج. 2. "زیگزاگ" -اسکن

در نتیجه در ابتدای بردار قاعدتاً ضرایب غیر صفر نوشته می شود و در انتها زنجیره های صفر تشکیل می شود.

مرحله 6.ما بردار را با استفاده از الگوریتم RLE اصلاح شده تبدیل می کنیم، که در خروجی آن جفت هایی از نوع (پرش، عدد) دریافت می کنیم، که در آن "پرش" شمارنده صفرهای نادیده گرفته شده است و "عدد" مقداری است که باید در آن قرار داده شود. سلول بعدی برای مثال، بردار 1118 3 0 0 0 -2 0 0 0 0 1 ... به صورت جفت (0, 1118) (0,3) (3, -2) (4,1) تا می شود.

لازم به ذکر است که عدد اول مولفه تبدیل شده به طور قابل ملاحظه ای برابر با میانگین درخشندگی بلوک 8x8 است و به عنوان ضریب DC نامیده می شود. به همین ترتیب برای همه بلوک های تصویر. این شرایط نشان می دهد که ضرایب DC می توانند به طور مؤثر فشرده شوند اگر مقادیر مطلق آنها را حفظ نکنید، بلکه مقادیر نسبی را به شکل تفاوت بین ضریب DC بلوک فعلی و ضریب DC بلوک قبلی حفظ کنید و ضرایب DC را به خاطر بسپارید. ضریب اول همانطور که هست در این حالت ترتیب ضرایب DC را می توان به عنوان مثال به صورت زیر انجام داد (شکل 3). بقیه ضرایب که ضرایب AC نامیده می شوند، بدون تغییر باقی می مانند.

مرحله 7.جفت های به دست آمده را با استفاده از کدهای هافمن با جدول ثابت غیر یکنواخت به هم بپیچید. علاوه بر این، کدهای مختلفی برای ضرایب DC و AC استفاده می شود، به عنوان مثال. جداول مختلف با کد هافمن

برنج. 3. طرح سفارش ضریب DC

برنج. 4. بلوک دیاگرام الگوریتم JPEG

فرآیند بازیابی تصویر در این الگوریتم کاملاً متقارن است. این روش به شما امکان می دهد تصاویر را 10-15 بار بدون از دست دادن دید قابل توجه فشرده سازی کنید.

هنگام توسعه این استاندارد، ما با این واقعیت هدایت شدیم که این الگوریتم مجبور بود تصاویر را به سرعت فشرده کند - بیش از یک دقیقه در یک تصویر متوسط. این در سال 1991 است! و اجرای سخت افزاری آن باید نسبتاً ساده و ارزان باشد. در این مورد، الگوریتم باید از نظر زمان عملیاتی متقارن باشد. تحقق نیاز اخیر، ظهور دوربین های دیجیتالی را که تصاویر 24 بیتی می گیرند، ممکن کرد. اگر الگوریتم نامتقارن بود، منتظر ماندن برای مدت طولانی تا زمانی که دستگاه "شارژ مجدد شود" ناخوشایند خواهد بود - تصویر را فشرده می کند.

اگرچه JPEG یک استاندارد ISO است، فرمت فایل آن ثابت نشده است. با بهره گیری از این، سازندگان فرمت های ناسازگار خود را ایجاد می کنند و بنابراین، می توانند الگوریتم را تغییر دهند. بنابراین، جداول داخلی الگوریتم توصیه شده توسط ISO با جداول خود جایگزین می شوند. همچنین گزینه های JPEG برای برنامه های خاص وجود دارد.

  • آموزش

UPD مجبور شد قالب بندی monospace را حذف کند. یک روز خوب، habraparser متوجه قالب بندی داخل تگ های پیش و کد نشد. کل متن به آشفتگی تبدیل شد. دولت هابر نتوانست به من کمک کند. اکنون ناهموار، اما حداقل قابل خواندن است.

آیا تا به حال فکر کرده اید که یک فایل jpg چگونه کار می کند؟ حالا بیایید بفهمیم! کامپایلر و ویرایشگر هگز مورد علاقه خود را گرم کنید، بیایید این را رمزگشایی کنیم:

من به خصوص یک نقاشی کوچکتر گرفتم. این همان فاویکون گوگل آشنا اما به شدت فشرده شده است:

من بلافاصله به شما هشدار می دهم که توضیحات ساده شده است و اطلاعات ارائه شده کامل نیست، اما بعداً درک مشخصات آسان خواهد بود.

حتی بدون اینکه بدانیم رمزگذاری چگونه انجام می‌شود، می‌توانیم چیزی را از فایل استخراج کنیم.
- نشانگر شروع همیشه در ابتدای همه فایل های 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 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 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 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
اف اف اف اف اف اف اف اف اف اف اف اف اف اف اف اف اف اف اف اف اف اف اف اف اف اف اف اف

هدر بخش همیشه 3 بایت است. در مورد ما اینطور است. سربرگ شامل موارد زیر است:
طول: 0x43 = 67 بایت
طول مقادیر در جدول: 0 (0 - 1 بایت، 1 - 2 بایت)
[_0] شناسه جدول: 0
64 بایت باقی مانده باید جدول 8x8 را پر کند.



به ترتیب پر شدن مقادیر جدول دقت بیشتری کنید. به این ترتیب نظم زیگزاگ می گویند:

نشانگر: SOF0 - Baseline 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 هستند.

جزء اول:
شناسه: 1
نازک شدن افقی (H 1): 2
[_2] کاهش عمودی (V 1): 2
شناسه جدول کوانتیزاسیون: 0

جزء دوم:
شناسه: 2
نازک شدن افقی (H 2): 1
[_1] نازک شدن عمودی (V 2): 1

جزء سوم:
شناسه: 3
نازک شدن افقی (H 3): 1
[_1] نازک شدن عمودی (V 3): 1
شناسه جدول کوانتیزاسیون: 1

اکنون ببینید چگونه می توان میزان نازک بودن تصویر را تعیین کرد. H max = 2 و V max = 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.
- مقدار کد دوم

ساخت درخت کد هافمن

باید از جدولی که در قسمت DHT گرفتیم یک درخت باینری بسازیم. و در حال حاضر توسط این درخت ما هر کد را تشخیص می دهیم. مقادیر را به ترتیبی که در جدول نشان داده شده اند اضافه می کنیم. الگوریتم ساده است: مهم نیست کجا هستیم، همیشه سعی می کنیم مقداری به شاخه سمت چپ اضافه کنیم. و اگر او مشغول است، سپس به سمت راست. و اگر جایی در آنجا نباشد، به سطح بالاتر برمی گردیم و از آنجا تلاش می کنیم. باید در سطحی برابر با طول کد توقف کنید. شاخه های چپ با 0، شاخه های راست - 1 مطابقت دارند.
اظهار نظر:
لازم نیست هر بار از اوج شروع کنید. ارزش افزوده - یک سطح به عقب برگردید. آیا شعبه مناسب وجود دارد؟ اگر چنین است، دوباره بالا بروید. اگر نه، شاخه مناسب را ایجاد کنید و در آنجا حرکت کنید. سپس، از آنجا، جستجوی خود را برای اضافه کردن مقدار بعدی شروع کنید.

درختان برای همه جداول در این مثال:


UPD (با تشکر): گره های اولین درخت (DC، id = 0) باید دارای مقادیر 0x03 و 0x02 باشند.

در دایره ها - مقادیر کدها، زیر دایره ها - خود کدها (توضیح خواهم داد که ما آنها را گرفتیم و از بالا به هر گره می رویم). با چنین کدهایی (از این و جداول دیگر) است که محتوای خود شکل رمزگذاری می شود.

نشانگر: SOS (شروع اسکن)

بایت در نشانگر به معنای "بله! در نهایت مستقیماً به تجزیه بخش تصویر رمزگذاری شده رفتیم! با این حال، این بخش به طور نمادین SOS نامیده می شود.

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

طول قسمت هدر (نه کل بخش): 12 بایت.
تعداد اجزای اسکن ما 3، یکی برای Y، Cb، Cr داریم.

جزء اول:
شماره قطعه تصویر: 1 (Y)
شناسه جدول هافمن برای ضرایب DC: 0
[_0] شناسه جدول هافمن برای ضرایب AC: 0

جزء دوم:
شماره قطعه تصویر: 2 (Cb)

[_1]

جزء سوم:
شماره مولفه تصویر: 3 (کروم)
شناسه جدول هافمن برای ضرایب DC: 1
[_1] شناسه جدول هافمن برای ضرایب AC: 1

این اجزا به صورت دوره ای متناوب می شوند.

اینجا جایی است که قسمت هدر، از اینجا تا انتهای (نشانگر) داده های کدگذاری شده به پایان می رسد.


0

پیدا کردن ضریب DC
1. خواندن دنباله ای از بیت ها (اگر به 2 بایت برسیم، این یک نشانگر نیست، بلکه فقط یک بایت است)... پس از هر بیت، بسته به بیت خوانده شده، در امتداد درخت هافمن (با شناسه مربوطه) در امتداد شاخه های 0 یا 1 حرکت می کنیم. اگر در گره نهایی باشیم متوقف می شویم.
10 1011101110011101100001111100100

2. مقدار گره را می گیریم. اگر 0 باشد، ضریب آن 0 است، آن را روی جدول می نویسیم و به خواندن ضرایب دیگر ادامه می دهیم. در مورد ما - 02. این مقدار طول ضریب در بیت است. یعنی 2 بیت بعدی را می خوانیم این ضریب می شود.
10 10 11101110011101100001111100100

3. اگر رقم اول مقدار در باینری 1 باشد، آن را به همان صورت باقی می گذاریم: DC_coef = مقدار. در غیر این صورت تبدیل می کنیم: DC_coef = value-2 طول مقدار +1. ضریب را در جدول در ابتدای زیگزاگ - گوشه سمت چپ بالا می نویسیم.

یافتن ضرایب AC
1. مشابه مورد 1، یافتن ضریب DC. ما به خواندن دنباله ادامه می دهیم:
10 10 1110 1110011101100001111100100

2. مقدار گره را می گیریم. اگر برابر با 0 باشد، به این معنی است که مقادیر باقیمانده ماتریس باید با صفر پر شوند. سپس ماتریس بعدی کدگذاری می شود. چند نفر اولی که تا اینجا خوانده اند و در مورد آن به صورت شخصی برای من نوشته اند، یک امتیاز مثبت در کارما دریافت خواهند کرد. در مورد ما، مقدار گره 0x31 است.
اولین nibble: 0x3 - این مقدار صفر است که باید به ماتریس اضافه کنیم. اینها 3 ضریب صفر هستند.
نوک دوم: 0x1 - طول ضریب در بیت. بیت بعدی را می خوانیم.
10 10 1110 1 110011101100001111100100

3. مشابه مورد 3 یافتن ضریب DC.

همانطور که قبلاً فهمیدید، باید ضرایب 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]

آخه یادم رفت بگم ضرایب DC کد شده خود ضرایب DC نیست بلکه تفاوتشون بین ضرایب جدول قبلی (همون کانال) هست! اصلاح ماتریس ها ضروری است:
DC برای دوم: 2 + (-4) = -2
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 ضرب و تعدادی جمع را در آنجا پیدا کنید. فقط در مورد آن فکر کنید - تقریباً هزار عملیات دشوار فقط در یک کانال از یک پیکسل! خوشبختانه جا برای بهینه سازی وجود دارد (پس از آزمایش های زیاد زمان بارگذاری را تا حد دقت تایمر 15 میلی ثانیه کاهش دادم و بعد از آن تصویر را به عکسی 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 * کر
G = Y - 0.34414 * Cb - 0.71414 * Cr
B = Y + 1.772 * Cb
فراموش نکنید که 128 را اضافه کنید. اگر مقادیر خارج از محدوده هستند، مقادیر مرزی را تعیین کنید. فرمول ساده است، اما کسری از زمان CPU را نیز مصرف می کند.

در اینجا جداول حاصل برای کانال های R، G، B برای مربع 8x8 سمت چپ مثال ما آمده است:
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 نیستم، بنابراین به سختی می توانم به همه سؤالات پاسخ دهم. فقط وقتی داشتم رسیورم را می نوشتم، اغلب مجبور بودم با مشکلات مختلف و نامفهومی روبرو شوم. و وقتی تصویر به اشتباه نمایش داده شد، نمی دانستم کجا اشتباه کرده ام. شاید او بیت ها را اشتباه تعبیر کرده است یا شاید از DCT سوء استفاده کرده است. من یک مثال گام به گام را از دست دادم، بنابراین امیدوارم این مقاله هنگام نوشتن رمزگشا کمک کند. من فکر می‌کنم که شرح روش اصلی را پوشش می‌دهد، اما هنوز هم نمی‌توانید این کار را انجام دهید. در اینجا چند لینک است که به من کمک کرد:

JPEG یکی از جدیدترین و قدرتمندترین الگوریتم ها است. در عمل، این استاندارد بالفعل برای تصاویر تمام رنگی است. این الگوریتم با نواحی ۸×۸ عمل می‌کند، جایی که روشنایی و رنگ نسبتاً آرام تغییر می‌کنند. در نتیجه، زمانی که ماتریس چنین ناحیه‌ای در یک سری دوگانه در کسینوس بسط می‌یابد (فرمول‌های زیر)، تنها ضرایب اول معنادار هستند. بنابراین، فشرده سازی در JPFG به هزینه تغییرات صاف در رنگ ها در تصویر انجام می شود.

این الگوریتم توسط گروهی از متخصصان عکاسی به طور خاص برای فشرده سازی تصاویر JPEG 24 بیتی - گروه مشترک متخصص عکاسی - یک بخش در ISO - سازمان بین المللی استاندارد توسعه داده شد. به طور کلی، الگوریتم مبتنی بر تبدیل کسینوس گسسته (از این پس DCT) است که برای به دست آوردن ماتریس جدید ضرایب روی ماتریس تصویر اعمال می شود. برای به دست آوردن تصویر اصلی، تبدیل معکوس اعمال می شود

DCT تصویر را به دامنه های برخی فرکانس ها تجزیه می کند، بنابراین، در طول تبدیل، ماتریسی به دست می آوریم که در آن بسیاری از ضرایب یا نزدیک یا برابر با صفر هستند. علاوه بر این، سیستم درک رنگ انسان در تشخیص فرکانس های خاص ضعیف است. بنابراین، می توان برخی از ضرایب را بدون افت قابل توجه کیفیت تصویر تقریب زد.

برای این کار از کوانتیزاسیون استفاده می شود. در ساده ترین حالت، یک شیفت بیتی حسابی به راست است. با این تبدیل، برخی از اطلاعات از بین می رود، اما می توان به نسبت های فشرده سازی بزرگ دست یافت.

عملیات الگوریتم

بیایید یک تصویر 24 بیتی را فشرده کنیم.

مرحله I.

تصویر را از فضای رنگی RGB، با اجزای مسئول اجزای قرمز (قرمز)، سبز (سبز) و آبی (آبی) رنگ نقطه، به فضای رنگی YCrCb (که گاهی اوقات YUV نامیده می‌شود) ترجمه می‌کنیم.

در آن، Y جزء روشنایی و Cg، Cb اجزای مسئول رنگ (قرمز رنگی و آبی رنگی) هستند. با توجه به اینکه چشم انسان نسبت به روشنایی حساسیت کمتری به رنگ دارد، می توان آرایه هایی را برای اجزای Cg و Cb با تلفات زیاد و بر این اساس نسبت فشرده سازی بالا بایگانی کرد. این دگرگونی از دیرباز در تلویزیون مورد استفاده قرار گرفته است. باند فرکانسی باریک تری به سیگنال های مسئول رنگ اختصاص داده می شود.

ترجمه ساده شده از فضای رنگی RGB به فضای رنگی YCrCb را می توان به صورت زیر نشان داد:

تبدیل معکوس با ضرب بردار YUV در ماتریس معکوس انجام می شود:

گام 2.

تصویر اصلی را به ماتریس های 8x8 تقسیم کنید. از هر کدام سه ماتریس DCT کار می کنیم - 8 بیت به طور جداگانه برای هر جزء. در نسبت تراکم بالاتر، این مرحله می تواند کمی دشوارتر باشد. تصویر با مؤلفه Y تقسیم می شود - مانند مورد اول، و برای مؤلفه های Cr و Cb، ماتریس ها از طریق یک خط و از طریق یک ستون تایپ می شوند. آن ها از ماتریس اصلی 16x16، تنها یک ماتریس DCT فعال به دست می آید. علاوه بر این، همانطور که به راحتی قابل مشاهده است، 3/4 اطلاعات مفید در مورد اجزای رنگی تصویر را از دست می دهیم و بلافاصله فشرده سازی دو برابری دریافت می کنیم. ما می توانیم این کار را با کار در فضای YCrCb انجام دهیم. همانطور که تمرین نشان داده است، این به طور قابل توجهی بر تصویر RGB حاصل تأثیر نمی گذارد.

مرحله 3.

ما DCT را برای هر ماتریس کاری اعمال می کنیم. در این مورد، ماتریسی به دست می آوریم که در آن ضرایب در گوشه بالا سمت چپ با مولفه فرکانس پایین تصویر و در سمت راست پایین با فرکانس بالا مطابقت دارد.

به شکل ساده شده، این تبدیل را می توان به صورت زیر نشان داد:

مرحله 4.

ما کوانتیزاسیون را انجام می دهیم. در اصل، این به سادگی تقسیم ماتریس کار بر عنصر ماتریس کوانتیزاسیون به عنصر است. برای هر جزء (Y، U و V)، در حالت کلی، ماتریس کوانتیزاسیون خاص خود (از این پس MK) مشخص شده است.

در این مرحله نسبت تراکم کنترل می شود و بیشترین تلفات رخ می دهد. واضح است که با مشخص کردن MK با ضرایب بزرگ، به صفرهای بیشتر و در نتیجه نسبت تراکم بیشتر خواهیم رسید.

کوانتیزاسیون نیز با اثرات خاص الگوریتم همراه است. در مقادیر بزرگ ضریب گاما ، - از دست دادن در فرکانس های پایین می تواند آنقدر زیاد باشد که تصویر به مربع های 8x8 تقسیم شود. تلفات در فرکانس های بالا می تواند خود را در به اصطلاح "اثر گیبس" نشان دهد، زمانی که نوعی "هاله" در اطراف خطوط با یک انتقال رنگ تیز تشکیل می شود.

مرحله 5.

ماتریس 8x8 را با استفاده از اسکن زیگزاگ به یک بردار 64 عنصری ترجمه می کنیم. عناصر با شاخص (0.0) را انتخاب کنید. (0.1). (1.0). (2.0) ...

بنابراین، در ابتدای بردار، ضرایب ماتریس مربوط به فرکانس های پایین و در انتها - فرکانس های بالا را دریافت می کنیم.

مرحله 6.

در هم پیچیدن بردار با استفاده از الگوریتم کدگذاری گروهی. در این حالت، جفت هایی از نوع (پرش، عدد) دریافت می کنیم، که در آن "پرش" شمارنده صفرهای نادیده گرفته شده است، و "عدد" مقداری است که باید در سلول بعدی قرار داده شود.

بنابراین، بردار به صورت جفت (0، 42) (0، 3) (3، -2) (4، 1) تا می شود.

مرحله 7.

جفت های آموخته شده را با کدگذاری هافمن با یک جدول ثابت جمع می کنیم.

فرآیند بازیابی تصویر در این الگوریتم کاملاً متقارن است. این روش به شما امکان می دهد برخی از تصاویر را 10-15 بار بدون از دست دادن جدی فشرده کنید.


خط لوله عملیات مورد استفاده در الگوریتم JPEG.

جنبه های مثبت مهم الگوریتم عبارتند از:

  • 1) نسبت تراکم تنظیم شده است
  • 2) تصویر رنگی خروجی می تواند 24 بیت در هر نقطه باشد.

معایب الگوریتم این است که:

  • 1) هنگامی که نسبت فشرده سازی افزایش می یابد، تصویر به مربع های جداگانه (8x8) تقسیم می شود. این به دلیل این واقعیت است که تلفات زیادی در فرکانس‌های پایین در طول کوانتیزاسیون اتفاق می‌افتد و بازیابی داده‌های اصلی غیرممکن می‌شود.
  • 2) اثر گیبس ظاهر می شود - هاله ها در امتداد مرزهای انتقال رنگ تیز.

JPEG نسبتاً اخیراً استاندارد شده است - در سال 1991. اما حتی در آن زمان نیز الگوریتم هایی وجود داشتند که با افت کیفیت کمتری فشرده تر می شدند. واقعیت این است که اقدامات توسعه دهندگان استاندارد به دلیل قدرت فناوری که در آن زمان وجود داشت محدود شد. یعنی حتی در یک کامپیوتر شخصی، الگوریتم باید کمتر از یک دقیقه روی یک تصویر متوسط ​​کار می کرد و اجرای سخت افزاری آن باید نسبتاً ساده و ارزان باشد. الگوریتم باید متقارن باشد (زمان رفع فشرده سازی تقریباً برابر با زمان بایگانی است).

نیاز اخیر ظهور دوربین های دیجیتال را امکان پذیر کرد - دستگاه هایی به اندازه یک دوربین فیلمبرداری کوچک که عکس های 24 بیتی را روی یک فلش کارت 10-20 مگابایتی با رابط PCMCIA می گیرند. سپس کارت در اسلات روی لپ تاپ وارد می شود و برنامه مربوطه به شما امکان خواندن تصاویر را می دهد. اگر الگوریتم نامتقارن بود، ناخوشایند است که برای مدت طولانی منتظر بمانید تا دستگاه "شارژ مجدد" شود - تصویر را فشرده می کند.

یکی از ویژگی های نه چندان خوشایند JPEG همچنین این واقعیت است که اغلب نوارهای افقی و عمودی روی نمایشگر کاملاً نامرئی هستند و تنها زمانی می توانند ظاهر شوند که به شکل الگوی مویر چاپ شوند. زمانی اتفاق می‌افتد که یک صفحه چاپ اریب بر روی نوارهای افقی و عمودی تصویر قرار می‌گیرد. به دلیل این شگفتی ها، JPEG توصیه نمی شود که به طور فعال در چاپ استفاده شود و ضرایب بالا را تنظیم کند. با این حال، زمانی که آرشیو و تصاویر در نظر گرفته شده برای مشاهده انسان، در حال حاضر غیر قابل تعویض است.

استفاده گسترده از JPEG برای مدت طولانی محدود شده است، شاید تنها به این دلیل که با تصاویر 24 بیتی کار می کند. بنابراین برای مشاهده تصویری با کیفیت قابل قبول بر روی یک مانیتور معمولی در یک پالت 256 رنگ، باید از الگوریتم های مناسب و در نتیجه زمان مشخصی استفاده کرد. در برنامه‌هایی که هدفشان یک کاربر حساس است، مانند بازی‌ها، چنین تاخیرهایی غیرقابل قبول است. علاوه بر این، اگر تصاویری که دارید، مثلاً، با فرمت GIF 8 بیتی به JPEG 24 بیتی تبدیل شوند و سپس برای مشاهده به GIF برگردند، در این صورت کیفیت با هر دو تبدیل دو بار کاهش می یابد. با این وجود، افزایش اندازه آرشیوها اغلب بسیار زیاد است (3 تا 20 بار!)، و کاهش کیفیت آنقدر کم است که ذخیره تصاویر در JPEG بسیار کارآمد است.

در مورد اصلاحات این الگوریتم باید چند کلمه گفت. اگرچه JPEG یک استاندارد ISO است، فرمت فایل آن ثابت نشده است. با بهره گیری از این، سازندگان از فرمت های ناسازگار خود استفاده می کنند و بنابراین، می توانند الگوریتم را تغییر دهند. بنابراین، جداول داخلی الگوریتم، توصیه شده توسط ISO. آنها با کرون های خود جایگزین می شوند، علاوه بر این، هنگام تنظیم درجه تلفات، سردرگمی جزئی وجود دارد. به عنوان مثال، هنگام آزمایش، معلوم می شود که کیفیت "عالی"، "100٪" و "10 امتیاز" تصاویر به طور قابل توجهی متفاوت است. علاوه بر این، به هر حال، کیفیت "100٪" به معنای فشرده سازی بدون تلفات نیست. همچنین گزینه های JPEG برای برنامه های خاص وجود دارد.

به عنوان یک استاندارد ISO، JPEG به طور گسترده در تبادل تصاویر از طریق شبکه های کامپیوتری استفاده می شود. الگوریتم JPEG در فرمت‌های Quick Time، PostScript Level 2، Tiff 6.0 پشتیبانی می‌شود و در حال حاضر جایگاه برجسته‌ای را در سیستم‌های چند رسانه‌ای اشغال می‌کند.

ویژگی های الگوریتم JPFG:

نسبت تراکم: 2-200 (تعریف شده توسط کاربر).

کلاس تصویر:تصاویر 24 بیتی تمام رنگی، یا تصاویر با مقیاس خاکستری بدون تغییر رنگ ناگهانی (عکس).

تقارن: 1.

ویژگی های خاص: در برخی موارد الگوریتم در اطراف لبه های افقی و عمودی برش خورده در تصویر (اثر گیبس) یک «هاله» ایجاد می کند. علاوه بر این، هنگامی که نسبت فشرده سازی بالا باشد، تصویر به بلوک های 8x8 پیکسل تقسیم می شود.

(تلفظ "japeg" Joint Photographic Experts Group، پس از نام سازمان توسعه دهنده) یکی از فرمت های گرافیکی محبوبی است که برای ذخیره تصاویر عکاسی و تصاویر مشابه استفاده می شود. فایل های حاوی داده های JPEG معمولا دارای پسوندهای .jpeg، .jfif، .jpg، .JPG، یا JPE. هستند. با این حال، jpg. محبوب ترین پسوند در همه پلتفرم ها از میان آنهاست.

1. گروه مشترک کارشناسان عکاسی.

2. یک روش فشرده سازی تصویر که توسط این گروه توسعه یافته و یک قالب گرافیکی مربوطه که اغلب در WWW استفاده می شود. با فشرده بودن فایل ها و بر این اساس، انتقال سریع و همچنین "از دست دادن" کیفیت تصویر مشخص می شود. در درجه اول برای عکس ها استفاده می شود، زیرا از دست دادن کیفیت برای آنها اهمیت کمتری دارد. تنظیمات رنگ را در فضای رنگی RGB حفظ می کند.

Jpeg(تلفظ شده " ژاپنی"، مهندس گروه مشترک کارشناسان عکاسیبا توجه به نام سازنده) یکی از فرمت های گرافیکی محبوبی است که برای ذخیره تصاویر عکاسی و تصاویر مشابه استفاده می شود. فایل های حاوی داده های JPEG معمولا دارای پسوند هستند jpeg, jfif, .jpg, .JPG، یا JPE... با این حال، در میان آنها .jpgمحبوب ترین افزونه در همه پلتفرم ها. نوع MIME تصویر / jpeg است.

JPEG یک الگوریتم فشرده سازی داده های با اتلاف است.

منطقه برنامه

الگوریتم JPEG برای فشرده‌سازی عکس‌ها و نقاشی‌های حاوی صحنه‌های واقعی با انتقال صاف در روشنایی و رنگ مناسب‌تر است. JPEG بیشترین کاربرد را در عکاسی دیجیتال و برای ذخیره و انتقال تصاویر با استفاده از اینترنت دارد.

از سوی دیگر، JPEG برای فشرده‌سازی نقاشی‌ها، متن و گرافیک کاراکترها کاربرد کمی دارد، جایی که کنتراست شدید بین پیکسل‌های مجاور منجر به مصنوعات قابل‌توجهی می‌شود. توصیه می شود چنین تصاویری را در فرمت های بدون اتلاف مانند TIFF، GIF، PNG یا RAW ذخیره کنید.

JPEG (مانند سایر روش‌های فشرده‌سازی تحریف‌کننده) برای فشرده‌سازی تصاویر با پردازش چند مرحله‌ای مناسب نیست، زیرا هر بار که نتایج پردازش میانی ذخیره می‌شوند، اعوجاج به تصاویر وارد می‌شود.

همچنین نباید از JPEG در مواردی استفاده شود که حتی حداقل تلفات غیرقابل قبول است، به عنوان مثال، هنگام فشرده سازی تصاویر نجومی یا پزشکی. در چنین مواردی، حالت فشرده سازی JPEG Lossless ارائه شده توسط استاندارد JPEG (که متأسفانه توسط اکثر کدک های محبوب پشتیبانی نمی شود) یا استاندارد فشرده سازی JPEG-LS ممکن است توصیه شود.

فشرده سازی

هنگامی که فشرده می شود، تصویر از RGB به YCbCr (YUV) تبدیل می شود. لازم به ذکر است که استاندارد JPEG (ISO / IEC 10918-1) به هیچ وجه انتخاب YCbCr را تنظیم نمی کند و به انواع دیگر تبدیل (به عنوان مثال، با تعدادی مؤلفه غیر از سه مؤلفه) و فشرده سازی بدون تبدیل اجازه می دهد. (مستقیماً به RGB)، با این حال، مشخصات JFIF (فرمت تبادل فایل JPEG، پیشنهاد شده در سال 1991 توسط C-Cube Microsystems، و اکنون استاندارد واقعی است) استفاده از تبدیل RGB-> YCbCr را فرض می کند.

پس از تبدیل RGB-> YCbCr برای کانال های تصویر Cb و Cr که مسئول رنگ هستند، می توان "subsampling" را انجام داد، به این معنی که به هر بلوک 4 پیکسلی (2x2) از کانال روشنایی Y مقادیر متوسط ​​Cb و Cr اختصاص داده می شود. (طرح حذف "4: 2: 0"). در همان زمان، برای هر بلوک 2x2، به جای 12 مقدار (4 Y، 4 Cb و 4 Cr)، فقط 6 مورد استفاده می شود (4 Y و یک Cb و Cr متوسط). اگر الزامات افزایشی بر کیفیت تصویر بازیابی شده پس از فشرده سازی اعمال شود، حذف می تواند فقط در یک جهت انجام شود - به صورت عمودی (طرح "4: 4: 0") یا افقی ("4: 2: 2") یا خیر. اصلاً ("4: 4: 4").

این استاندارد همچنین اجازه می دهد تا با میانگین Cb و Cr، نه برای یک بلوک 2x2، بلکه برای چهار پیکسل متوالی (عمودی یا افقی)، یعنی برای بلوک های 1x4، 4x1 (طرح 4: 1: 1)، و همچنین 2x4 و 4x2. . همچنین مجاز به استفاده از انواع مختلف حذف برای Cb و Cr است، اما در عمل چنین طرح هایی به ندرت استفاده می شود.

علاوه بر این، جزء luma Y و اجزای Cb و Cr که مسئول رنگ هستند به بلوک‌های 8x8 پیکسل تقسیم می‌شوند. هر یک از این بلوک ها تحت یک تبدیل کسینوس گسسته (DCT) قرار می گیرد. ضرایب DCT به‌دست‌آمده کوانتیزه می‌شوند (برای Y، Cb، و Cr، در حالت کلی، از ماتریس‌های کوانتیزاسیون مختلف استفاده می‌شود) و با استفاده از کدهای هافمن بسته‌بندی می‌شوند. استاندارد JPEG همچنین امکان استفاده از کدگذاری محاسباتی بسیار کارآمدتر را می دهد، اما به دلیل محدودیت های ثبت اختراع (پتنت رمزگذار QM حسابی که در استاندارد JPEG توضیح داده شده متعلق به IBM است)، در عمل از آن استفاده نمی شود.

ماتریس های مورد استفاده برای کوانتیزه کردن ضرایب DCT در قسمت هدر فایل JPEG ذخیره می شوند. آنها معمولاً طوری ساخته می شوند که ضرایب فرکانس بالا قوی تر از ضرایب فرکانس پایین کوانتیزه شوند. این منجر به درشت شدن جزئیات ظریف در تصویر می شود. هر چه نسبت تراکم بالاتر باشد، تمام ضرایب با شدت بیشتری کوانتیزه می شوند.

هنگام ذخیره یک تصویر در یک فایل JPEG، یک پارامتر کیفیت مشخص می شود که در برخی واحدهای دلخواه مشخص می شود، به عنوان مثال، از 1 تا 100 یا از 1 تا 10. عدد بالاتر معمولاً با کیفیت بهتر (و اندازه فایل فشرده بزرگتر) مطابقت دارد. ). با این حال، حتی در صورت استفاده از بالاترین کیفیت (مرتبط با یک ماتریس کوانتیزاسیون متشکل از یک ماتریس)، تصویر بازسازی شده دقیقاً با تصویر اصلی منطبق نخواهد شد، که هم با دقت نهایی اجرای DCT و هم با نیاز به گرد کردن تصویر مرتبط است. مقادیر Y، Cb، Cr و ضرایب DCT به نزدیکترین کل. حالت فشرده‌سازی JPEG بدون اتلاف، که از DCT استفاده نمی‌کند، تطابق دقیقی با تصاویر بازسازی‌شده و اصلی ارائه می‌کند، با این حال، راندمان پایین آن (نسبت فشرده‌سازی به ندرت از ۲ بیشتر می‌شود) و عدم پشتیبانی توسعه‌دهندگان نرم‌افزار به محبوبیت JPEG بدون افت کمکی نکرده است. .

انواع طرح های فشرده سازی JPEG

استاندارد JPEG دو روش اصلی برای نمایش داده های رمزگذاری شده ارائه می دهد.

رایج‌ترین مورد که توسط اکثر کدک‌های موجود پشتیبانی می‌شود، نمایش متوالی JPEG داده‌ها است که شامل پیمایش متوالی تصویر رمزگذاری‌شده بلوک از چپ به راست، از بالا به پایین است. عملیات توضیح داده شده در بالا بر روی هر بلوک تصویر کدگذاری شده انجام می شود و نتایج رمزگذاری به شکل یک "اسکن" واحد در جریان خروجی قرار می گیرد. آرایه ای از داده های کدگذاری شده مربوط به تصویر پیموده شده ("اسکن" شده). حالت رمزگذاری خط مبنا یا "خط پایه" فقط این نمایش را امکان پذیر می کند. حالت توسعه یافته (گسترش یافته)، همراه با ترتیب، همچنین امکان ارائه پیشرونده (پیشرو JPEG) داده ها را فراهم می کند.

در مورد JPEG پیشرونده، داده های فشرده شده در جریان خروجی به عنوان مجموعه ای از اسکن ها نوشته می شود، که هر کدام تصویر را به طور کامل با درجه افزایش جزئیات توصیف می کنند. این امر یا با ضبط در هر اسکن نه یک مجموعه کامل از ضرایب DCT، بلکه فقط برخی از آنها حاصل می شود: اول - فرکانس پایین، در اسکن های بعدی - فرکانس بالا (روش "انتخاب طیفی"، یعنی نمونه برداری طیفی) یا به صورت متوالی، از اسکن به اسکن، پالایش ضرایب DCT (روش "تقریب متوالی"، یعنی تقریب های متوالی). این نمایش تدریجی داده ها به ویژه هنگام انتقال تصاویر فشرده با استفاده از کانال های ارتباطی کم سرعت مفید است، زیرا به شما امکان می دهد پس از انتقال تنها قسمت کوچکی از فایل JPEG، ایده ای از کل تصویر بدست آورید.

هر دو طرح توصیف شده (هم ترتیبی و هم پیش رونده JPEG) بر اساس DCT هستند و اساساً اجازه نمی دهند یک تصویر بازسازی شده کاملاً یکسان با تصویر اصلی بدست آورید. با این حال، این استاندارد همچنین فشرده‌سازی را مجاز می‌کند که از DCT استفاده نمی‌کند، بلکه بر اساس یک پیش‌بینی‌کننده خطی ساخته شده است (بدون تلفات، به عنوان مثال، JPEG)، که تطابق کامل، بیت به بیت، اصلی و بازسازی‌شده را تضمین می‌کند. تصاویر. در عین حال، نسبت فشرده سازی برای تصاویر عکاسی به ندرت به 2 می رسد، اما عدم تضمین اعوجاج در برخی موارد مورد تقاضا است. نسبت‌های فشرده‌سازی بسیار بالاتری را می‌توان با استفاده از روش فشرده‌سازی JPEG-LS که توسط ISO / IEC 14495-1 توصیف شده است، بدست آورد، که با وجود شباهت در نام‌ها، ارتباط مستقیمی با استاندارد JPEG ISO / IEC 10918-1 (ITU T.81) ندارد. توصیه) (ITU T.87 Recommendation).

نحو و ساختار JPEG

فایل JPEG حاوی توالی است نشانگرهاکه هر کدام با بایت 0xFF شروع می شود که نشانگر شروع نشانگر و بایت - شناسه است. برخی از نشانگرها فقط از این جفت بایت تشکیل شده اند، در حالی که برخی دیگر حاوی داده های اضافی متشکل از یک فیلد دو بایتی با طول بخش اطلاعاتی نشانگر (شامل طول این فیلد، اما منهای دو بایت ابتدای نشانگر، یعنی 0xFF و شناسه) و خود داده.

نشانگرهای اصلی JPEG
نشانگر بایت ها طول وقت ملاقات

JPEG یکی از الگوریتم های جدید و به اندازه کافی قدرتمند است. در عمل، این استاندارد بالفعل برای تصاویر تمام رنگی است. این الگوریتم با نواحی ۸×۸ عمل می‌کند، جایی که روشنایی و رنگ نسبتاً آرام تغییر می‌کنند. در نتیجه، هنگام تجزیه چنین ماتریسی، مساحت در یک ردیف دوگانه در کسینوس (به فرمول زیر مراجعه کنید) تنها با ضرایب اول قابل توجه در نظر گرفته می شود. تصویر

الگوریتمی که توسط گروهی از متخصصان عکاسی به طور خاص برای فشرده سازی تصاویر 24 بیتی توسعه یافته است. JPEG - Joint Photographic Expert Group یک بخش در ISO - سازمان بین المللی استانداردسازی است. نام الگوریتم به عنوان ["jei" peg] خوانده می شود. به طور کلی، الگوریتم بر اساس تبدیل کسینوس گسسته (از این پس به عنوان DCT نامیده می شود) است که برای به دست آوردن ماتریس جدید ضرایب روی ماتریس تصویر اعمال می شود. برای به دست آوردن تصویر اصلی، یک تبدیل معکوس اعمال می شود.

DCT تصویر را به دامنه فرکانس های خاص تجزیه می کند. بنابراین، هنگام تبدیل، ماتریسی به دست می آوریم که در آن ضرایب زیادی یا نزدیک یا مساوی صفر هستند. علاوه بر این، به دلیل نقص بینایی انسان، ضرایب را می توان بدون افت قابل توجه کیفیت تصویر، تقریب زد.

برای این کار از کوانتیزاسیون استفاده می شود. در ساده ترین حالت، یک شیفت بیتی حسابی به راست است. با این تبدیل، برخی از اطلاعات از بین می رود، اما می توان به نسبت فشرده سازی زیادی دست یافت.

الگوریتم چگونه کار می کند

بنابراین، بیایید الگوریتم را با جزئیات بیشتری در نظر بگیریم (شکل 2.1). فرض کنید یک تصویر 24 بیتی را فشرده می کنیم.


مرحله 1.تصویر را از فضای رنگی RGB، با اجزای مسئول اجزای قرمز (قرمز)، سبز (سبز) و آبی (آبی) رنگ نقطه، به فضای رنگی YCrCb (که گاهی اوقات YUV نامیده می‌شود) ترجمه می‌کنیم.

در آن، Y جزء روشنایی و Cr، Co اجزای مسئول رنگ (قرمز رنگی و آبی رنگی) هستند. با توجه به این واقعیت که چشم انسان نسبت به روشنایی حساسیت کمتری به رنگ دارد، می توان آرایه هایی را برای اجزای Cr و Co با تلفات زیاد و بر این اساس نسبت تراکم زیاد بایگانی کرد. چنین تغییر شکلی از مدت ها قبل در تلویزیون استفاده شده است. باند فرکانسی باریک تری به سیگنال های مسئول رنگ اختصاص داده می شود. ترجمه ساده شده از فضای رنگی RGB به فضای رنگی YCrCb را می توان با استفاده از یک ماتریس انتقال نشان داد:

گام 2.تصویر اصلی را به ماتریس های 8x8 تقسیم کنید. از هر کدام 3 ماتریس DCT کار می کنیم - 8 بیت به طور جداگانه برای هر جزء. در نسبت تراکم بالاتر، این مرحله می تواند کمی دشوارتر باشد. تصویر مانند مورد اول بر مولفه Y تقسیم می شود و برای مؤلفه های Cr و Cb، ماتریس ها از طریق یک خط و از طریق یک ستون تایپ می شوند. یعنی از ماتریس اصلی 16x16 فقط یک ماتریس DCT کار به دست می آید. در عین حال، همانطور که به راحتی قابل مشاهده است، 3/4 اطلاعات مفید در مورد اجزای رنگی تصویر را از دست می دهیم و بلافاصله فشرده سازی 2 برابری دریافت می کنیم. ما می توانیم این کار را با کار در فضای YCrCb انجام دهیم. همانطور که تمرین نشان داده است، این تأثیر کمی بر روی تصویر RGB ایجاد شده دارد.

مرحله 3.در یک شکل ساده شده، DCT برای n = 8 می تواند به صورت زیر نمایش داده شود:

nu، v] = ^ Hc (i، u) xC (j، v) y

r Y)

Yq= IntegerRound

در این مرحله نسبت تراکم کنترل می شود و بیشترین تلفات رخ می دهد. واضح است که با مشخص کردن MK با ضرایب بزرگ، به صفرهای بیشتر و در نتیجه نسبت تراکم بیشتر خواهیم رسید.

کوانتیزاسیون نیز با اثرات خاص الگوریتم همراه است. در مقادیر گامای بالا، از دست دادن در فرکانس های پایین می تواند آنقدر زیاد باشد که تصویر به مربع های 8x8 تقسیم شود. تلفات در فرکانس های بالا می تواند خود را در به اصطلاح نشان دهد اثر گیبس،هنگامی که نوعی "هاله" در اطراف خطوط با یک انتقال رنگ تیز تشکیل می شود.

گام 5. ماتریس 8x8 را با استفاده از اسکن "زیگ زاگ" به یک بردار 64 عنصری ترجمه می کنیم، یعنی عناصری را با شاخص های (0,0), (0,1), (1,0), (2) می گیریم. , 0 ) ...

بنابراین، در ابتدای بردار، ضرایب ماتریس مربوط به فرکانس های پایین و در انتها - فرکانس های بالا را دریافت می کنیم.

مرحله 6.در هم پیچیدن بردار با استفاده از الگوریتم کدگذاری گروهی. در این صورت جفت هایی از نوع بدست می آوریم<пропустить, число>که در آن "پرش" تعداد صفرهایی است که باید پرش کنید و "عدد" مقداری است که باید در سلول بعدی قرار دهید. بنابراین، بردار 42 3000-2 00001 ... به جفت (0.42) (0.3) (3، -2) (4.1) تا می شود ....

گام 7. جفت های به دست آمده را با کد گذاری هافمن با یک جدول ثابت بپیچید.

فرآیند بازیابی تصویر در این الگوریتم کاملاً متقارن است. این روش به شما امکان می دهد برخی از تصاویر را 10-15 بار بدون از دست دادن جدی فشرده کنید.

جنبه های مثبت مهم الگوریتم عبارتند از:

■ درجه فشرده سازی تنظیم شده است.

■ تصویر رنگی خروجی می تواند 24 بیت در هر نقطه باشد.

معایب الگوریتم این است که:

■ افزایش نسبت فشرده سازی تصویر را به مربع های جداگانه (8x8) تقسیم می کند. این به دلیل این واقعیت است که تلفات زیادی در فرکانس‌های پایین در طول کوانتیزاسیون اتفاق می‌افتد و بازیابی داده‌های اصلی غیرممکن می‌شود.

■ جلوه گیبس ظاهر می شود - هاله ها در امتداد لبه های انتقال رنگ تیز.

همانطور که قبلاً ذکر شد، JPEG نسبتاً اخیراً - در سال 1991 - استاندارد شده است. اما حتی در آن زمان نیز الگوریتم هایی وجود داشتند که با افت کیفیت کمتری فشرده تر می شدند. واقعیت این است که اقدامات توسعه دهندگان استاندارد به دلیل قدرت فناوری که در آن زمان وجود داشت محدود شد. یعنی حتی در رایانه شخصی، الگوریتم باید کمتر از یک دقیقه روی یک تصویر متوسط ​​کار می کرد و اجرای سخت افزاری آن باید نسبتاً ساده و ارزان باشد. الگوریتم باید متقارن باشد (زمان رفع فشرده سازی تقریباً برابر با زمان بایگانی است).

برآورده کردن نیاز اخیر، ظهور دستگاه‌هایی مانند دوربین‌های دیجیتال را امکان‌پذیر کرد که عکس‌های 24 بیتی را روی یک فلش کارت 8 تا 256 مگابایتی می‌گیرند. تصاویر. درست نیست نیا،اگر الگوریتم نامتقارن بود، ناخوشایند است که برای مدت طولانی منتظر بمانید تا دستگاه "شارژ مجدد" شود - تصویر را فشرده می کند.

یک ویژگی نه چندان خوب JPEG نیز این است سپس،که اغلب نوارهای افقی و عمودی روی نمایشگر کاملاً نامرئی هستند و فقط هنگام چاپ به شکل الگوی مویر ظاهر می شوند. زمانی اتفاق می‌افتد که یک صفحه چاپ اریب بر روی نوارهای افقی و عمودی تصویر قرار می‌گیرد. با توجه به این شگفتی ها، JPEG ها نیستند به طور فعال توصیه می شوداستفاده در چاپ، تنظیم ضرایب بالای ماتریس کوانتیزاسیون. با این حال، هنگام آرشیو تصاویر در نظر گرفته شده برای مشاهده انسان، در حال حاضر غیر قابل تعویض است.

وسیعاستفاده از JPEG برای مدت طولانی محدود شده است، شاید تنها به این دلیل که با تصاویر 24 بیتی کار می کند. بنابراین برای مشاهده تصویری با کیفیت قابل قبول بر روی یک مانیتور معمولی در یک پالت 256 رنگ، باید از الگوریتم های مناسب و در نتیجه زمان مشخصی استفاده کرد. در برنامه‌هایی که هدفشان یک کاربر حساس است، مانند بازی‌ها، چنین تاخیرهایی غیرقابل قبول است. علاوه بر این، اگر مثلاً تصاویری که دارید با فرمت GIF 8 بیتی به JPEG 24 بیتی تبدیل شده و سپس برای مشاهده به GIF برگردند، در این صورت با هر دو تبدیل دوبار کیفیت از دست می‌رود. با این وجود، افزایش اندازه آرشیوها اغلب آنقدر زیاد است (3-20 برابر)، و افت کیفیت آنقدر کم است که ذخیره تصاویر در JPEG بسیار کارآمد است.

در مورد اصلاحات این الگوریتم باید چند کلمه گفت. اگرچه JPEG یک استاندارد ISO است، فرمت فایل آن ثابت نشده است. با استفاده از این، سازندگان فرمت های ناسازگار خود را ایجاد می کنند و بنابراین، می توانند الگوریتم را تغییر دهند. بنابراین، جداول داخلی الگوریتم توصیه شده توسط ISO با جداول خود جایگزین می شوند. علاوه بر این، هنگام تعیین نرخ ضرر کمی سردرگمی وجود دارد. به عنوان مثال، هنگام آزمایش، معلوم می شود که کیفیت "عالی"، "100٪" و "10 امتیاز" تصاویر به طور قابل توجهی متفاوت است. در عین حال، به هر حال، کیفیت "100٪" به معنای فشرده سازی بدون تلفات نیست. همچنین گزینه های JPEG برای برنامه های خاص وجود دارد.

به عنوان یک استاندارد ISO، JPEG به طور گسترده در تبادل تصاویر از طریق شبکه های کامپیوتری استفاده می شود. الگوریتم JPEG در Quick Time، PostScript Level 2، Tiff 6.0 پشتیبانی می شود و در حال حاضر جایگاه برجسته ای را در سیستم های چند رسانه ای اشغال می کند.

ویژگی های الگوریتم JPEG: o! NS. ، نسبت تراکم: 2-200 (تعریف شده توسط کاربر). ، ج،: _،. ... کلاس تصویر:تصاویر تمام رنگی 2jj.bit یا iso- | تصاویر خاکستری بدون تغییر رنگ ناگهانی (عکس).

تقارن: 1.

مشخصات:در برخی موارد، الگوریتم ایجاد می کند! "هاله" در اطراف لبه های افقی و عمودی تیز در تصویر (اثر گیبس). علاوه بر این، با نسبت تراکم بالا، iso-! بازتاب به بلوک های 8x8 پیکسل تقسیم می شود.

مقالات مرتبط برتر