چگونه فرمت JPG عکس ما را کم حجم تر میکند؟

حتما تا به حال از خود پرسیده اید که چگونه ممکن است یک فرمت فایل یا یک عکس یا هر چیزی کم حجم تر بشود در اینجا به یک قاعده کلی درباره فشرده سازی مدیا میپردازیم که در پسوند JPG با نحوه فشرده سازی JPEG به بهترین نحو ممکن انجام میشود.
این فرمت تصویر را تقریبا بدون افت کیفیت از نظر دیداری با ترکیب کردن و از دست دادن اطلاعاتی که چشم انسان نمیبیند کم حجم میکند.

مرحله اول رنگ ها:

در مرحله اول باید دانست که چشم انسان بیشتر از رنگ ها به جزئیات تیره و روشن و سیاه و سفید توجه میکند چرا که در چشم انسان ۱۳۰ میلیون سلول برای تشخیص سیاهی و سفیدی و تیرگی و روشنی وجود دارد که تقریبا در هر طیف نوری کار میکند ولی در عوض فقط و فقط ۶ میلیون سلول برای تشخیص رنگ هاست که جالب است بدانید این ۶ میلیون سلول به نسبت ۴۳ درصد قرمز و ۴۳ درصد سبز و ۱۴ درصد آبی تشکیل شده تا رنگ ها را به واضح ترین شکل ممکن ببیند اما نتیجه میگیریم که برای چشم انسان سایه روشن و سیاه و سفید مهم تر از رنگ هاست.

نتیجه دیگر که میتوان گرفت این است که فرکانس های بالاتر نور یعنی طیف نور سبز و قرمز چشم که هر کدام ۴۳ درصد چشم را پوشش میدهند مهم تر از فرکانس های پایین یعنی آبی است.

برای مثال این تصویر را در نظر بگیرید:

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

حال تصویر ما عناصر اصلی را دارد و به یاد داشته باشید که در چشم انسان تیرگی و روشنی مهم تر از رنگ هاست بنابر این برای اینکه تیرگی و روشنی حفظ و رنگ ها کم حجم شوند JPEG تصویر را از نحوه RGB که از تصاویر آبی و سبز و قرمز با تقسیم تیرگی و روشنی مساوی است را به YCBCR تبدیل میکند که در این فرمت به جای اینکه در سه رنگ اصلی نور تصویر ذخیره شود تیرگی ها و روشنی ها را در عنصر Y قرار میدهد و رنگ ها را در دو عنصر دیگر CB و CR ذخیره میشوند در سمت راست تصویر بالا میتوانید نحوه دیدن تصاویر به صورت YCBCR را ببینید که عنصر مهم تر یعنی تیرگی و روشنی را از رنگ ها جدا میکند.

مرحله دوم دور انداختن اطلاعاتی که چشم ما نمیبیند:

در مرحله دوم باید به این توجه کرد که چشم ما تیرگی و روشنی برایش مهم تر از رنگ هاست پس در این حالت اطلاعات اضافی رنگ ها دور انداخته میشود در حالت پیش فرض هر دو پیکسل به یک پیکسل مستطیل شکل تبدیل میشود و در فیلم ها هر چهار پیکسل به یک پیکسل رنگی تبدیل میشوند البته در نرم افزار های ویرایش عکس میتوانید تایین کنید که چه مقدار از اطلاعات رنگی عکس از بین بروند که معمولا نرم افزار چهار حالت بیشتر ارائه نمیدهد که یعنی اطلاعات رنگی از دست نرود یا یک چهارم اطلاعات از دست برود یا یک سوم یا یک دوم که البته یک دوم اطلاعات آنقدر فرقی با حالت عادی ندارد چرا که چشم ما به رنگ ها حساس نیست و بیشتر به نقاط تیره و روشن توجه میکند و در واقع عکس به چنین چیزی تبدیل میشود:

تا اینجای کار ما از ۳ کانال کامل که داشتیم ۱ کانال را حفظ کردیم و ۲ کانال رنگی با حجم نصف بدست آورده ایم که یعنی تازه یک سوم حجم عکس کم شده و هنوز راه زیادی برای رفتن باقی مانده است.

مرحله سوم تبدیل فرکانس های رنگی به فرکانس های منطقی – ریاضی:

این بخش واقعا بخش منطقی و خیلی سختی هست و احتمالا نتونید درکش کنید و توضیحش به زبان ساده فوق العاده سخت هست و فقط گیج تر میشید پس من توضیحات پیشرفته را میدهم ولی اگر چیزی نفهمیدید مهم نیست.

خيلي خب، بيا تصویر را به بلوک های ۸×۸ پیکسل تقسیم کنیم.فقط يکي از اين بلوک هاي ۸×۸ رو از کانال Y در نظر بگيريم. دامنه فضایی چیزی است که الان داریم مقدار در گوشه بالا-سمت چپ نشان دهنده روشنایی (Y-value) پیکسل در گوشه بالای چپ آن بلوک است. به همین ترتیب مقدار در گوشه پایین سمت راست نشان دهنده درخشش پیکسل در گوشه پایین سمت راست آن بلوک است. از این رو اصطلاح فضایی موقعیت دربلوک نشان دهنده موقعیت در تصویر است. هنگامی که این بلوک را به دامنه فرکانس تبدیل کنیم، موقعیت در بلوک به جای آن نشان دهنده یک باند فرکانسی در آن بلوک تصویر خواهد بود. مقدار در گوشه بالای سمت چپ بلوک نشان دهنده کمترین فرکانس اطلاعات خواهد بود و مقدار در گوشه پایین سمت راست بلوک نشان دهنده بالاترین فرکانس اطلاعات خواهد بود.

نکته اضافه:این تبدیل دامنه با استفاده از یک بیت از legerdemain ریاضی به نام تبدیل ۲D گسسته Cosine (DCT) انجام شده است. (اگر شما از تبدیلات Fourier چیزی شنیده اید، DCT مشابه آن است اما تنها از اعداد واقعی استفاده می کند؛ این برای پردازش کامپیوتر راحت تر است.) نکته ضروری این است که هر نشان دهنده مقادیر در بلوک ۸×۸ به عنوان یک مجموع از توابع cosine، که در آن هر تابع cosine دارای فرکانس منحصر به فرد خاص است.

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

مرحله آخر رمزنگاری اطلاعات باقیمانده:

در مرحله بعدی که در علوم کامپیوتر به آن codec گفته میشود نوعی فشرده سازی بدون افت کیفیت انجام میشود.

در کامپیوتر به هر کد ۰ یا ۱ در عمل ذخیره سازی یک بیت گفته میشود هر ۸ بیت توانایی تشکیل یک بایت را دارند که اکثر کاراکتر های صحیح شناخته شده کامپیوتر مانند حروف انگلیسی یک بایت هستند در مراحل بعدی هر ۱۰۲۴ بایت تبدیل به یک کیلوبایت میشوند و هر ۱۰۲۴ کیلوبایت تبدیل به ۱ مگابایت میشوند و به همین ترتیب ادامه پیدا میکند…

حال فرض کنید که ما تصویری که تا الان به دست آورده ایم(فقط بر فرض مثال زیرا در حقیقت حجم و تعداد پیکسل ها و داده ها برای یک عکس فوق العاده زیاد تر است)۳۲ بیت حجم دارد یعنی از ۳۲ کد ۰ و ۱ تشکیل شده است ، در ذخیره سازی بسیار زیاد پیش می آید که چندین کد ۰ یا چندین کد ۱ در کنار هم قرار میگیرند اگر بر فرض مثال عکس ۳۲ بیتی ما به صورت زیر نوشته شده باشد:
۱۱۱۱۱۱۱۱۱۱۱۱۱۱۱۱۰۰۰۰۰۰۰۰۱۱۱۱۰۰۰۰

حالا عمل codec کد بالا را به صورت زیر ترجمه میکند(با نقطه بخش های مختلف جدا شده اند تا شما بتوانید راحت تر بخوانید وگرنه در حقیقت این نقطه ها نوشته نمیشوند):
۱۶٫۱٫۸٫۰٫۴٫۱٫۴٫۰

خب میتوان دید که ۱۶ عدد ۱ داشته ایم که به جای نوشتن تک تک آنها به صورت ۱۶٫۱ نوشته ایم که به کد ماشینی زیر ترجمه میشود(نقطه ها در حقیقت وجود ندارند و فقط برای مقایسه بهتر شما نوشته شده اند):

۱۰۰۰۰٫۱ همانطور که میبینید عدد۱۶ به کد ماشینی یعنی ۱۰۰۰۰ و عدد ۱ همان عدد ۱ است ولی در اینجا در بحث ذخیره سازی ما از نوشتن ۱۰ بیت صرفه جویی کرده ایم.
حال بیایید کل عکس را codec کنیم(نقطه ها در حقیقت وجود ندارند و برای مقایسه بهتر شما نوشته شده اند):
۱۶٫۱٫۸٫۰٫۴٫۱٫۴٫۰ یعنی در ترجمه ماشینی این کد به صورت زیر تعریف میشود(نقطه ها در حقیقت وجود ندارند و برای مقایسه بهتر شما نوشته شده اند):
۱۰۰۰۰٫۱٫۱۰۰۰٫۰٫۱۰۰٫۱٫۱۰۰٫۰

در این عمل codec ما به جای نوشتن تمام ۳۲ کاراکتر فقط ۱۹ کاراکتر را آورده ایم اما شاید بپرسید که خب در مواردی مانند ۱۰۱۰۱۰ که کد به صورت ۱٫۱٫۱٫۰٫۱٫۱٫۰٫۱٫۱٫۱٫۰۱ ترجمه میشود و افزایش حجم داریم که در جواب باید گفت در codec به طور هوشمند کاراکتر هایی که ارزش کد گذاری ندارند و باعث افزایش حجم هستند کد گذاری نمیشوند و به این ترتیب عکس ما تا ۹۸ درصد کم حجم تر میشود.

هم اکنون عکسی که در ابتدا ۵ مگابایت بوده کمتر از ۵۰۰ کیلوبایت حجم دارد و عمل کم حجم کردن ما توسط JPEG به پایان رسیده است.


نویسنده: محمد امامی

دیدگاه ها غیر فعال است.