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

JPEG، JPEG2000، JPEG-LS. فشرده سازی تصویر بدون تلفات

عکس‌ها و عکس‌ها نه تنها از نظر محتوا، بلکه در سایر ویژگی‌های «کامپیوتری» با یکدیگر متفاوت هستند. به عنوان مثال، بر اساس اندازه.

این اتفاق می افتد که به نظر می رسد دو نقاشی یکسان وجود دارد، اما یکی سه برابر بزرگتر از دیگری است.

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

و این اتفاق می افتد که به نظر می رسد نقاشی فاقد رنگ است. در اینجا یک مثال است.

و فرمت یا نوع فایل مسئول همه اینها است.

در واقع، تصاویر در فرمت‌های مختلفی ارائه می‌شوند. و تعداد آنها بسیار بسیار زیاد است. ما همه آنها را در نظر نخواهیم گرفت، اما در مورد رایج ترین آنها صحبت خواهیم کرد. اینها فرمت هایی مانند bmp، gif، jpg، png، tiff هستند.

آنها اول از همه در کیفیت با یکدیگر تفاوت دارند. و کیفیت در تعداد (اشباع) رنگ ها متفاوت است.

به عنوان مثال، من یک تصویر را با استفاده از رنگ های مختلف می کشم. و ناگهان برخی از آنها تمام می شود و شما باید نقاشی را با آنچه دارید تمام کنید. البته، من سعی خواهم کرد هر کاری که ممکن است انجام دهم تا تأثیر زیادی بر نتیجه نداشته باشد، اما همچنان تصویر آنطور که می خواهم به نظر نمی رسد - محو تر، تار تر.

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

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

فرمت های رایج تصویر

BMP فرمتی برای طراحی های انجام شده در برنامه Paint است. می توان از آن برای ذخیره تصاویر ترسیم شده در رایانه استفاده کرد. اما این نوع فایل به دلیل حجم زیاد در اینترنت استفاده نمی شود. بنابراین اگر می‌خواهید یک تصویر کشیده شده در Paint را در یک وبلاگ یا شبکه اجتماعی منتشر کنید، باید از نوع دیگری باشد - gif، jpg یا png.

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

JPG فرمتی برای عکس ها و نقاشی ها با تعداد رنگ های زیاد است. شما می توانید یک تصویر را هم بدون افت کیفیت و هم با کاهش در آن ذخیره کنید.

PNG یک فرمت تصویر مدرن است. این نوع تصویر به دست می آید اندازه کوچکو بدون افت کیفیت بسیار راحت: فایل کوچک است و کیفیت خوب است. همچنین از شفافیت پشتیبانی می کند.

TIFF - تصاویر بسیار هستند کیفیت خوب، بدون فشرده سازی بر این اساس، حجم چنین فایل هایی بسیار زیاد است. TIFF زمانی استفاده می شود که کیفیت از اهمیت بالایی برخوردار باشد. به عنوان مثال، هنگام ایجاد کارت ویزیت، کتابچه، جلد مجلات.

کدام قالب را انتخاب کنید

  • BMP - اگر این یک نقاشی است که در Paint ساخته شده است و می خواهید آن را فقط روی رایانه نگه دارید.
  • GIF - اگر یک انیمیشن یا نقاشی با تعداد کمی رنگ برای انتشار در اینترنت است.
  • PNG - اگر این تصویری است که دارای رنگ های زیادی یا برخی از قسمت های شفاف است.
  • JPG (jpeg) - اگر یک عکس است.
  • TIFF - تصویر برای چاپ (کارت ویزیت، کتابچه، پوستر و غیره).

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

من سوالات زیادی از این قبیل دریافت می کنم؛ بسیاری از دانش آموزان من می پرسند که آیا می توانند از فرمت های جدید SVG و WebP استفاده کنند و بهترین مکان برای استفاده از این تصاویر کجاست. البته، شما می توانید از فرمت های جدید استفاده کنید، فقط باید بدانید که کدام فرمت برای چه چیزی مناسب تر است.

امروزه تصاویر در یک وب سایت جزء جدایی ناپذیر آن هستند. شروع از طراحی گرافیکیو آپلود تصاویر در مقالات، گرافیک اکثر سایت های موجود در شبکه را همراهی می کند. اما زیبایی بهایی دارد

تصاویر بهینه‌نشده یکی از عواملی هستند که سرعت یک وب‌سایت را کند می‌کنند، همانطور که توسط سرویس‌های تأیید نشان داده می‌شود.

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

امروز از چه تصاویری برای وب سایت ها استفاده می کنم؟

تمام تصاویر برای وب سایت ها به دو دسته تقسیم می شوند:

  • شطرنجی (به عنوان مثال - JPG، JPEG، GIF، PNG)،
  • بردار (به عنوان مثال - SVG).

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

یعنی وقتی سایز تصویر زیاد می شود کیفیت آن افت می کند.

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

همه این تصاویر می توانند و در وب سایت های مدرن استفاده می شوند. فقط باید بدانید که قبل از آپلود در سایت، !

شرح فرمت های تصویری محبوب برای سایت

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

JPEG

JPEG یا JPG یکی از محبوب ترین فرمت های تصویر برای وب سایت ها است. این فرمت از میلیون ها رنگ پشتیبانی می کند که به آن موقعیت پیشرو در ارائه عکس ها و تصاویر در سایت می دهد.

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

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

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

PNG

این فرمت از یک الگوریتم فشرده سازی بدون تلفات استفاده می کند. از نظر تعداد رنگ و سطح شفافیت در دو نوع 8 و 24 بیتی موجود می باشد. هر دو از شفافیت حمایت می کنند.

8 بیتی خیلی محبوب نیست، اما 24 بیتی به طور گسترده ای برای آن استفاده می شود تصاویر مختلفبرخط. به دلیل شفافیت، به شما امکان می دهد تصاویر ترکیبی ایجاد کنید. اغلب برای ایجاد دکمه ها و آیکون های متحرک در جایی که به جلوه شفافیت نیاز است استفاده می شود.

تصاویر با فرمت PNG را می توان چندین بار بهینه سازی و ویرایش کرد - کیفیت اصلی را حفظ می کند.

این فرمت همچنین توسط همه مرورگرها و دستگاه ها پشتیبانی می شود و اطمینان حاصل می کند که می تواند در هر صفحه نمایش داده شود.

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

GIF

این یک فرمت 8 بیتی است که از 256 رنگ، شفافیت و انیمیشن پشتیبانی می کند. به دلیل پشتیبانی از تعداد کمی رنگ، وزن فایل نیز حداقل است.

فرمت برای عکس ها و تصاویر با طیف گسترده ایرنگ ها

اما در ساخت بنرها، دکمه ها، آیکون ها و ... کاربرد زیادی دارد.

در وب سایت های مدرن از این فرمت کمتر و کمتر استفاده می شود.

در مرحله بعد، اجازه دهید در مورد فرمت های SVG و WebP نسبتاً جدید صحبت کنیم که چندان محبوب نیستند، اما محبوبیت و پشتیبانی پیدا می کنند و کاملاً با الزامات سرعت بارگذاری و سازگاری وب سایت مناسب هستند.

SVG

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

امروزه SVG توسط تمام مرورگرهای مدرن پشتیبانی می شود. اما مشکلات مربوط به نمایشگر همچنان وجود دارد.

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

فرمت SVG سبک وزن است، بسیار مقیاس پذیر است، تصاویر واضحی را در هر وضوح صفحه ارائه می دهد، از انیمیشن پشتیبانی می کند، می توان آن را از طریق CSS کنترل کرد و در HTML قرار داد و تعداد درخواست ها را کاهش می دهد.

وب پی

یک قالب متن باز که توسط گوگل به طور خاص برای اینترنت توسعه یافته است. امروزه یوتیوب از تبدیل تصاویر کوچک ویدئو به WebP استفاده می کند.

فرمت فشرده سازی عالی را فراهم می کند و از شفافیت پشتیبانی می کند. مزایای فرمت های JPG و PNG را بدون افزایش اندازه فایل ترکیب می کند.

اما، با وجود مزایای فرمت، توسط همه مرورگرها، به عنوان مثال، IE، Edge، Firefox و Safari پشتیبانی نمی شود.

راه‌هایی برای دور زدن این محدودیت‌ها وجود دارد، اما آنها از استفاده از قالب در همه جا جلوگیری می‌کنند.

نتیجه

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

شاید وقتی WebP پشتیبانی گسترده ای به دست آورد، همه ما به آن تغییر می کنیم و jpg و png را در سایت های خود جایگزین می کنیم.

بیایید در نظرات در مورد فرمت هایی که در سایت های خود استفاده می کنید، چه چیزی را دوست دارید و چه چیزی را دوست ندارید، بحث کنیم.

فقط برای امروز، منتظر نظرات شما هستم.

با احترام، ماکسیم زایتسف.

    با سه فرمت محبوب فایل JPEG، RAW، TIFF هستند. گاهی اوقات می توانید اختلاف نظر بین عکاسان را بشنوید - کدام فرمت فایل برای عکاسی بهتر است، در کدام فرمت بهتر است عکس بگیرید، زیرا دوربین های مدرن به شما اجازه می دهند عکس بگیرید.تووگرافی در هر یک از این فرمت ها و گاهی اوقات در چندین فرمت همزمان!

    فرمت فایلی که یک تصویر در آن ذخیره می شود اساساً بین کیفیت تصویر و اندازه فایل مصالحه می کند.

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

    عمق رنگ (کیفیت رندر رنگ، عمق بیت تصویر) - مقدار حافظه در تعداد بیت های مورد استفاده برای ذخیره و نمایش رنگ هنگام رمزگذاری یک پیکسل گرافیک شطرنجییا تصاویر ویدئویی تعداد بیت ها تعداد درجه بندی ها (مرحله های تن) در هر جزء رنگی یا به سادگی تعداد رنگ ها را نشان می دهد. افزودن 1 بیت به معنای افزودن یک بیت دیگر به کد رنگ باینری است.

    • رنگ 1 بیتی (21 = 2 رنگ) رنگ باینری که اغلب با سیاه و سفید (یا سیاه و سبز) نشان داده می شود.
    • رنگ 2 بیتی (22 = 4 رنگ) CGA، درجه بندی خاکستری NeXTstation
    • رنگی 3 بیتی (23 = 8 رنگ) بسیاری از رایانه های شخصی قدیمی با خروجی تلویزیون
    • رنگ 4 بیتی (24 = 16 رنگ) به عنوان EGA و تا حدی به عنوان استاندارد VGA با وضوح بالا شناخته می شود.
    • رنگ 5 بیتی (25 = 32 رنگ) چیپست اصلی آمیگا
    • رنگ 6 بیتی (26 = 64 رنگ) چیپست اصلی آمیگا
    • رنگ 8 بیتی (28 = 256 رنگ) ایستگاه های کاری Unix قدیمی، VGA با وضوح پایین، Super VGA، AGA
    • رنگ 12 بیتی (212 = 4096 رنگ) در برخی از سیستم‌های Silicon Graphics، سیستم‌های NeXTstation و سیستم‌های حالت HAM Amiga.

    به عنوان مثال، ما در فضای رنگی RGB کار می کنیم. این بدان معناست که سه کانال وجود دارد که رنگ پیکسل نهایی از آنها تشکیل می شود: کانال قرمز (راد)، کانال سبز (سبز) و کانال آبی (آبی). فرض کنید کانال ها چهار بیتی هستند. یعنی هر کانال قابلیت نمایش 16 رنگ را دارد. در نتیجه، تمام RGB 12 بیتی خواهد بود و قادر به نمایش خواهد بود

    C=16x16x16=4096 رنگ

    عمق رنگ در این مورد 12 بیت است.

    وقتی مردم در مورد RGB 24 بیتی صحبت می کنند، منظور آنها کانال های 8 بیتی (هر کدام 256 رنگ) با تعداد کل گزینه های رنگ در هر پیکسل است.

    C=256x256x256=16777216 رنگ.

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

    کمی در مورد خود فرمت ها.

    فرمت TIFF

    TIFF مخفف عبارت Tagged Image File Format است و استانداردی برای صنعت چاپ و چاپ است.

    در نتیجه، این چیزی است که اتفاق می افتد:

    1. اگر دوربین شما آنقدر ساده است که فقط JPEG می‌گیرد و می‌خواهید بگیرید حداکثر کیفیت، حداکثر اندازه و حداقل فشرده سازی را تنظیم کنید و خود را با این واقعیت که فرمت های دیگری ندارید عذاب ندهید. در بیشتر موارد، یک تصویر RAW که به صورت دستی و با زحمت رندر می شود، با JPEG که به طور خودکار توسط دوربین گرفته می شود مطابقت دارد.

    2. احتمالاً نباید در TIFF عکس بگیرید. ضبط در این فرمت دشوارتر است، اما تفاوت محسوسی در مقایسه با JPEG با کیفیت بالا وجود ندارد.

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

    شاید بتوان گفت یک راه حل دیگر باقی می ماند جهانی. حالتی وجود دارد که به شما امکان می دهد فریم ها را در دو فرمت به طور همزمان بگیرید: RAW+ JPEG. در این حالت از صحنه های مهم عکس بگیرید. ذخیره سازی اطلاعات دیجیتال مدرن - هم کارت حافظه و هم هارد دیسک - این امکان را فراهم می کند. در این حالت، یک JPEG دریافت می‌کنید تا بلافاصله از عکس استفاده کنید، بدون اینکه وقت خود را صرف ویرایش کنید. و در صورت نیاز، فایل RAW را برای پردازش به متخصص بسپارید.

    عکس. فرمت های فایل

    به راحتی می توان محاسبه کرد که یک تصویر تمام رنگی فشرده نشده با اندازه 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 بیت است.
    این الگوریتم برای تصاویر سیاه و سفید بیشترین کارایی را دارد. همچنین اغلب به عنوان یکی از مراحل میانی فشرده سازی الگوریتم های پیچیده تر استفاده می شود.

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

    ایده پشت الگوریتم‌های فرهنگ لغت این است که زنجیره‌ای از عناصر دنباله اصلی کدگذاری می‌شوند. این رمزگذاری از یک دیکشنری ویژه استفاده می کند که بر اساس دنباله اصلی به دست آمده است.
    یک خانواده کامل از الگوریتم های فرهنگ لغت وجود دارد، اما ما به رایج ترین الگوریتم LZW که به نام توسعه دهندگان آن Lepel، Ziv و Welch نامگذاری شده است، نگاه خواهیم کرد.
    فرهنگ لغت در این الگوریتم جدولی است که با اجرای الگوریتم با زنجیره های کدگذاری پر می شود. هنگامی که کد فشرده رمزگشایی می شود، فرهنگ لغت به طور خودکار بازیابی می شود، بنابراین نیازی به انتقال فرهنگ لغت همراه با کد فشرده نیست.
    فرهنگ لغت با تمام رشته های تک تن مقداردهی اولیه می شود، یعنی. اولین خطوط فرهنگ لغت نشان دهنده الفبای است که در آن رمزگذاری می کنیم. در طول فشرده سازی، جستجو برای طولانی ترین زنجیره ای که قبلاً در فرهنگ لغت ثبت شده است انجام می شود. هر بار که با زنجیره‌ای مواجه می‌شوید که هنوز در فرهنگ لغت نوشته نشده است، در آنجا اضافه می‌شود و کد فشرده‌شده مربوط به زنجیره‌ای که قبلاً در فرهنگ لغت نوشته شده است، خروجی می‌شود. در تئوری، هیچ محدودیتی در اندازه فرهنگ لغت اعمال نمی شود، اما در عمل محدود کردن این اندازه منطقی است، زیرا با گذشت زمان، زنجیره هایی ظاهر می شوند که دیگر در متن یافت نمی شوند. علاوه بر این، زمانی که اندازه جدول را دو برابر می کنیم، باید یک بیت اضافی را برای ذخیره کدهای فشرده اختصاص دهیم. به منظور جلوگیری از چنین شرایطی معرفی شده است کد ویژه، نمادی از مقداردهی اولیه جدول با تمام زنجیره های تک تنه است.
    بیایید به مثالی از الگوریتم فشرده سازی نگاه کنیم. ما خط cuckoocuckoocuckoohood را فشرده می کنیم. فرض کنید دیکشنری دارای 32 موقعیت است، به این معنی که هر کد آن 5 بیت را اشغال می کند. در ابتدا فرهنگ لغت به صورت زیر پر می شود:

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


    جدول روند پر کردن فرهنگ لغت را نشان می دهد. به راحتی می توان محاسبه کرد که کد فشرده به دست آمده 105 بیت طول می کشد و متن اصلی (با فرض اینکه ما 4 بیت را برای رمزگذاری یک کاراکتر صرف کرده ایم) 116 بیت طول می کشد.
    در اصل، فرآیند رمزگشایی به رمزگشایی مستقیم کدها خلاصه می شود و مهم است که جدول به همان روشی که در هنگام رمزگذاری مقداردهی اولیه شود. حالا بیایید به الگوریتم رمزگشایی نگاه کنیم.



    رشته اضافه شده به فرهنگ لغت در مرحله i را فقط در i+1 می توانیم به طور کامل تعریف کنیم. بدیهی است که خط i باید به اولین کاراکتر خط i+1 ختم شود. که ما تازه فهمیدیم که چگونه یک دیکشنری را بازیابی کنیم. زمانی که دنباله‌ای از شکل cScSc کدگذاری می‌شود، جایی که c یک کاراکتر و S یک رشته است و کلمه cS قبلاً در فرهنگ لغت وجود دارد، جالب توجه است. در نگاه اول ممکن است به نظر برسد که رمزگشا قادر به حل این وضعیت نخواهد بود، اما در واقع تمام خطوط از این نوع باید همیشه با همان کاراکتری که با آن شروع می شوند پایان یابد.

    الگوریتم های کدگذاری آماری
    الگوریتم های این سری کوتاه ترین کد فشرده شده را به متداول ترین عناصر دنباله ها اختصاص می دهند. آن ها دنباله هایی با طول یکسان با کدهای فشرده با طول های مختلف کدگذاری می شوند. علاوه بر این، هر چه یک دنباله بیشتر اتفاق بیفتد، کد فشرده مربوطه کوتاهتر می شود.
    الگوریتم هافمن
    الگوریتم هافمن به شما امکان می دهد کدهای پیشوندی بسازید. می‌توانیم کدهای پیشوند را به‌عنوان مسیرهایی در یک درخت دودویی در نظر بگیریم: رفتن از یک گره به فرزند سمت چپ آن با 0 در کد مطابقت دارد و به فرزند راست آن با 1. اگر برگ‌های درخت را با نمادها برچسب‌گذاری کنیم. برای کدگذاری، نمایش را دریافت می کنیم کد پیشوندبه شکل درخت دوتایی
    اجازه دهید الگوریتم ساخت درخت هافمن و به دست آوردن کدهای هافمن را شرح دهیم.
  1. کاراکترهای الفبای ورودی فهرستی از گره های آزاد را تشکیل می دهند. هر ورق دارای وزنی است که برابر با دفعات وقوع نماد است
  2. دو گره درخت آزاد با کوچکترین وزن انتخاب شده است
  3. والد آنها با وزنی برابر با وزن کل آنها ایجاد می شود
  4. والد به لیست گره های رایگان اضافه می شود و دو فرزند آن از این لیست حذف می شوند
  5. یک قوس خروجی از والد به بیت 1 و دیگری به بیت 0 اختصاص داده شده است
  6. مراحل شروع از دوم تکرار می شود تا زمانی که تنها یک گره آزاد در لیست گره های آزاد باقی بماند. این ریشه درخت در نظر گرفته خواهد شد.
با استفاده از این الگوریتم، می توانیم کدهای هافمن را برای یک الفبای معین، با در نظر گرفتن فراوانی وقوع کاراکترها، بدست آوریم.
کدگذاری حسابی
الگوریتم های رمزگذاری حسابی رشته هایی از عناصر را در یک کسری رمزگذاری می کنند. در این مورد، توزیع فرکانسی عناصر در نظر گرفته می شود. در حال حاضر، الگوریتم های رمزگذاری حسابی توسط پتنت ها محافظت می شوند، بنابراین ما فقط به ایده اصلی نگاه خواهیم کرد.

به راحتی می توان محاسبه کرد که یک تصویر تمام رنگی فشرده نشده با اندازه 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 بیت است.
این الگوریتم برای تصاویر سیاه و سفید بیشترین کارایی را دارد. همچنین اغلب به عنوان یکی از مراحل میانی فشرده سازی الگوریتم های پیچیده تر استفاده می شود.

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

ایده پشت الگوریتم‌های فرهنگ لغت این است که زنجیره‌ای از عناصر دنباله اصلی کدگذاری می‌شوند. این رمزگذاری از یک دیکشنری ویژه استفاده می کند که بر اساس دنباله اصلی به دست آمده است.
یک خانواده کامل از الگوریتم های فرهنگ لغت وجود دارد، اما ما به رایج ترین الگوریتم LZW که به نام توسعه دهندگان آن Lepel، Ziv و Welch نامگذاری شده است، نگاه خواهیم کرد.
فرهنگ لغت در این الگوریتم جدولی است که با اجرای الگوریتم با زنجیره های کدگذاری پر می شود. هنگامی که کد فشرده رمزگشایی می شود، فرهنگ لغت به طور خودکار بازیابی می شود، بنابراین نیازی به انتقال فرهنگ لغت همراه با کد فشرده نیست.
فرهنگ لغت با تمام رشته های تک تن مقداردهی اولیه می شود، یعنی. اولین خطوط فرهنگ لغت نشان دهنده الفبای است که در آن رمزگذاری می کنیم. در طول فشرده سازی، جستجو برای طولانی ترین زنجیره ای که قبلاً در فرهنگ لغت ثبت شده است انجام می شود. هر بار که با زنجیره‌ای مواجه می‌شوید که هنوز در فرهنگ لغت نوشته نشده است، در آنجا اضافه می‌شود و کد فشرده‌شده مربوط به زنجیره‌ای که قبلاً در فرهنگ لغت نوشته شده است، خروجی می‌شود. در تئوری، هیچ محدودیتی در اندازه فرهنگ لغت اعمال نمی شود، اما در عمل محدود کردن این اندازه منطقی است، زیرا با گذشت زمان، زنجیره هایی ظاهر می شوند که دیگر در متن یافت نمی شوند. علاوه بر این، زمانی که اندازه جدول را دو برابر می کنیم، باید یک بیت اضافی را برای ذخیره کدهای فشرده اختصاص دهیم. به منظور جلوگیری از چنین شرایطی، یک کد ویژه معرفی شده است که نمادی از مقداردهی اولیه جدول با تمام زنجیره های تک عنصری است.
بیایید به مثالی از الگوریتم فشرده سازی نگاه کنیم. ما خط cuckoocuckoocuckoohood را فشرده می کنیم. فرض کنید دیکشنری دارای 32 موقعیت است، به این معنی که هر کد آن 5 بیت را اشغال می کند. در ابتدا فرهنگ لغت به صورت زیر پر می شود:

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

جدول روند پر کردن فرهنگ لغت را نشان می دهد. به راحتی می توان محاسبه کرد که کد فشرده به دست آمده 105 بیت طول می کشد و متن اصلی (با فرض اینکه ما 4 بیت را برای رمزگذاری یک کاراکتر صرف کرده ایم) 116 بیت طول می کشد.
در اصل، فرآیند رمزگشایی به رمزگشایی مستقیم کدها خلاصه می شود و مهم است که جدول به همان روشی که در هنگام رمزگذاری مقداردهی اولیه شود. حالا بیایید به الگوریتم رمزگشایی نگاه کنیم.


رشته اضافه شده به فرهنگ لغت در مرحله i را فقط در i+1 می توانیم به طور کامل تعریف کنیم. بدیهی است که خط i باید به اولین کاراکتر خط i+1 ختم شود. که ما تازه فهمیدیم که چگونه یک دیکشنری را بازیابی کنیم. زمانی که دنباله‌ای از شکل cScSc کدگذاری می‌شود، جایی که c یک کاراکتر و S یک رشته است و کلمه cS قبلاً در فرهنگ لغت وجود دارد، جالب توجه است. در نگاه اول ممکن است به نظر برسد که رمزگشا قادر به حل این وضعیت نخواهد بود، اما در واقع تمام خطوط از این نوع باید همیشه با همان کاراکتری که با آن شروع می شوند پایان یابد.

الگوریتم های کدگذاری آماری
الگوریتم های این سری کوتاه ترین کد فشرده شده را به متداول ترین عناصر دنباله ها اختصاص می دهند. آن ها دنباله هایی با طول یکسان با کدهای فشرده با طول های مختلف کدگذاری می شوند. علاوه بر این، هر چه یک دنباله بیشتر اتفاق بیفتد، کد فشرده مربوطه کوتاهتر می شود.
الگوریتم هافمن
الگوریتم هافمن به شما امکان می دهد کدهای پیشوندی بسازید. می‌توانیم کدهای پیشوند را به‌عنوان مسیرهایی در یک درخت دودویی در نظر بگیریم: رفتن از یک گره به فرزند سمت چپ آن با 0 در کد مطابقت دارد و به فرزند راست آن با 1. اگر برگ‌های درخت را با نمادها برچسب‌گذاری کنیم. برای کدگذاری، یک نمایش درخت باینری از کد پیشوند دریافت می کنیم.
اجازه دهید الگوریتم ساخت درخت هافمن و به دست آوردن کدهای هافمن را شرح دهیم.
  1. کاراکترهای الفبای ورودی فهرستی از گره های آزاد را تشکیل می دهند. هر ورق دارای وزنی است که برابر با دفعات وقوع نماد است
  2. دو گره درخت آزاد با کوچکترین وزن انتخاب شده است
  3. والد آنها با وزنی برابر با وزن کل آنها ایجاد می شود
  4. والد به لیست گره های رایگان اضافه می شود و دو فرزند آن از این لیست حذف می شوند
  5. یک قوس خروجی از والد به بیت 1 و دیگری به بیت 0 اختصاص داده شده است
  6. مراحل شروع از دوم تکرار می شود تا زمانی که تنها یک گره آزاد در لیست گره های آزاد باقی بماند. این ریشه درخت در نظر گرفته خواهد شد.
با استفاده از این الگوریتم، می توانیم کدهای هافمن را برای یک الفبای معین، با در نظر گرفتن فراوانی وقوع کاراکترها، بدست آوریم.
کدگذاری حسابی
الگوریتم های رمزگذاری حسابی رشته هایی از عناصر را در یک کسری رمزگذاری می کنند. در این مورد، توزیع فرکانسی عناصر در نظر گرفته می شود. در حال حاضر، الگوریتم های رمزگذاری حسابی توسط پتنت ها محافظت می شوند، بنابراین ما فقط به ایده اصلی نگاه خواهیم کرد.
بگذارید الفبای ما از N نماد a1،...،aN و فراوانی وقوع آنها p1،...، pN تشکیل شده باشد. بیایید نیم فاصله را تقسیم کنیم. این مراحل برای کدنویس مهم هستند که در مرحله بعدی به طور موثر کار کنند.

1.2. PrEP

به عنوان یک مرحله کلیدی از الگوریتم فشرده سازی، تبدیل کسینوس گسسته (که از این پس DCT نامیده می شود) نوعی تبدیل فوریه است و مانند دومی دارای تبدیل معکوس (DCCT) است. اگر یک تصویر را مجموعه‌ای از امواج فضایی در نظر بگیریم که در آن محورهای X و Y با عرض و ارتفاع تصویر مطابقت دارند و محور Z مقادیر رنگ پیکسل‌های مربوطه را نشان می‌دهد، می‌توانیم از حالت فضایی حرکت کنیم. نمایش تصویر به آن نمایش طیفیو برگشت. DCT یک ماتریس N x N از پیکسل ها را به ماتریسی از ضرایب فرکانس با اندازه مناسب تبدیل می کند.



برنج. 4.

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

از فرمول ها (شکل 4) مشخص است که محاسبه یک عنصر از ماتریس حاصل به زمان O(N 2) نیاز دارد، بنابراین تبدیل کل ماتریس تقریبا غیرممکن است. تیم توسعه JPEG بهترین راه حل را برای این مشکل پیشنهاد کرد: تقسیم ماتریس اصلی به مربع اندازه استاندارد 8x8 و هر یک از آنها را تبدیل کنید. استفاده از بلوک های بزرگتر کیفیت فشرده سازی را بهبود می بخشد، اما نه به طور نامحدود، زیرا احتمال شبیه بودن نقاط بسیار دور به یکدیگر بسیار کم است.

شایان ذکر است که در طول محاسبات فقط از 32 مقدار کسینوس از پیش محاسبه شده استفاده می شود که به شما امکان می دهد سرعت تبدیل را به میزان قابل توجهی افزایش دهید. این بدون شک منجر به از دست رفتن جزئی اطلاعات می شود، اما حجم آن نسبتاً ناچیز است.

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

1.3. گرد کردن

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

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


3 5 7 9 11 13 15 17
5 7 9 11 13 15 17 19
7 9 11 13 15 17 19 21
9 11 13 15 17 19 21 23
11 13 15 17 19 21 23 25
13 15 17 19 21 23 25 27
15 17 19 21 23 25 27 29
17 19 21 23 25 27 29 31

نمونه ای از یک ماتریس گرد با ضریب کیفیت 2.

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

1.4. فشرده سازی

آخرین مرحله از الگوریتم کدگذاری JPEG فشرده سازی است. پس از پردازش ماتریس DCT با استفاده از MO، تعداد زیادی صفر در ماتریس حاصل به خصوص در ناحیه فرکانس بالا (گوشه سمت راست پایین) ظاهر می شود.

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

برنج. 5.

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

1.5. رمزگشایی

از آنجایی که DCT یک تبدیل فوریه است، یک تبدیل کسینوس گسسته معکوس (IDCT) برای آن وجود دارد. الگوریتم رمزگشایی الگوریتم رمزگذاری را به ترتیب معکوس تکرار می کند.

2.JPEG2000

در ابتدا، استاندارد جدید به عنوان پایه ای برای استاندارد فشرده سازی بدون تلفات آینده JPEG-LS ایجاد شد، اما بعداً به دلیل ظهور الگوریتم های کارآمدتر کنار گذاشته شد. با توجه به توسعه فناوری، استاندارد JPEG به تدریج اهمیت خود را از دست داد. توسعه دهندگان JPEG2000 امیدوار بودند استانداردی ایجاد کنند که بسیاری از خطاهای استانداردهای موجود را تصحیح کند. از جمله وظایف آنها عبارت بود از:

  • حذف نیست فشرده سازی موثردر منطقه فرکانس پایین. الگوریتم‌های موجود در فشرده‌سازی نواحی فرکانس متوسط ​​و بالا به خوبی عمل کردند، اما نتایج ضعیفی در ناحیه فرکانس پایین نشان دادند.
  • فشرده سازی بدون تلفات و اتلاف. در زمان توسعه، هیچ استانداردی وجود نداشت که امکان فشرده سازی بدون تلفات و تلفات را در یک جریان فشرده سازی واحد فراهم کند.
  • پردازش تصویر بزرگ. الگوریتم های موجود اجازه فشرده سازی کارآمد تصاویر بزرگتر از 64Kx64K را بدون کاشی کاری نمی دهند.
  • ساختار الگوریتم فشرده سازی یکپارچه. اجرای JPEG کنونی از 44 اصلاح پشتیبانی می‌کند، که بیشتر آن‌ها مختص برنامه بوده و توسط اکثر رمزگشاها پشتیبانی نمی‌شوند.
  • ایمنی سر و صدا. در زمان توسعه JPEG، فناوری‌های شبکه هنوز به اندازه کافی توسعه نیافته بودند و طراحان JPEG در هنگام انتقال تصاویر از طریق کانال‌های ناامن یا توانایی بازیابی تصویر در صورت آسیب دیدن در نتیجه انتقال، به ایمنی نویز فکر نمی‌کردند.
  • تصاویر تولید شده توسط کامپیوتر. الگوریتم‌های اصلی روی عکس‌های دیجیتال و تصاویری که با استفاده از دوربین دیجیتال یا اسکنر به‌دست می‌آمدند، به خوبی کار می‌کردند، اما به‌طور مؤثر تصاویر ایجاد شده روی رایانه را پردازش نمی‌کردند، مثلاً با استفاده از ویرایشگرهای گرافیکی.
  • اسناد پیچیده. JPEG هنگام پردازش تصاویر پیچیده دو بعدی (به ویژه تصاویر متنی) بسیار ضعیف عمل می کند.

نمودار زیر مراحل اساسی یک رمزگذار JPEG2000 را نشان می دهد.


برنج. 6.


برنج. 7.

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

برنج. 8.

2.2. تخته فیبر

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

برنج. 9.

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

  • LL - فرکانس های پایینتوسط سطرها و ستون ها
  • HL - فرکانس های بالا در ردیف ها و فرکانس های پایین در ستون ها
  • LH - فرکانس های پایین در ردیف ها و فرکانس های بالا در ستون ها
  • HH - فرکانس های بالا در ردیف ها و ستون ها

طبق استاندارد، تعداد مراحل می تواند از 0 تا 32 باشد. برای یک تصویر معمولی، از 4 تا 8 مرحله استفاده می شود. در هر مرحله بعدی، فقط ناحیه فرکانس پایین (LL) پردازش می شود، زیرا مناطق با فرکانس بالا معمولاً حاوی اطلاعات مهمی نیستند.


برنج. 10.

برنج. یازده

2.3. گرد کردن

برای گرد کردن ضرایب DWT، یک کوانتایزر ثابت با منطقه مرده استفاده می شود. (شکل 14) برای هر قطعه یک مقدار ثابت از مرحله گرد کردن برای تمام ضرایب این قطعه استفاده می شود. فرمول محاسبه مقادیر گرد شده در شکل 12 ارائه شده است. در اینجا y مقدار اولیه ضریب است، sign(y) علامت ضریب را تعیین می کند و Δb مقدار مرحله گرد کردن است. منطقه مردهکوانتایزر بازه‌ای با محدوده 2Δb در حول و حوش صفر است که تعداد صفرهای بیشتری را در خروجی به دست می‌دهد.

2.4. کد نویسی

کدگذاری ضرایب گرد حاصل بلوک به بلوک انجام می شود. طبق استاندارد JPEG2000، بلافاصله قبل از رمزگذاری، قطعات به بلوک های به اندازه کافی کوچک (مثلاً 32x32 یا 64x64 در اندازه) تقسیم می شوند تا همه بلوک های یک قطعه یک اندازه باشند. پارتیشن بندی به بلوک ها به منظور اجرای سازماندهی انعطاف پذیرتر از اطلاعات فشرده برای افزایش ایمنی نویز و غیره انجام می شود.


برنج. 16.

در JPEG2000، هر بلوک به طور جداگانه کدگذاری می شود. الگوریتم رمزگذاری، ماتریس ضریب گرد کردن هر بلوک را به صورت راه راه طی می کند، همانطور که در شکل 17 نشان داده شده است. بلوک ها به بلوک هایی با ارتفاع اسمی 4 تقسیم می شوند. سپس نوارها از بالا به پایین اسکن می شوند و ستون های هر نوار به صورت نواری مشخص می شوند. از چپ به راست عبور کرد.


برنج. 17.

در طی فرآیند رمزگذاری، ضرایب در یک بلوک عملاً به صورت صفحات بیت نمایش داده می شوند. یکی از این صفحات از علائم ضرایب تشکیل شده است. صفحات باقیمانده با ارقام مختلف مقادیر ضرایب مطابقت دارند (موقعیت بیت در صفحه مطابق با موقعیت ضریب در بلوک است). کدگذاری با هواپیما انجام می شود: ابتدا صفحه مربوط به مهم ترین رقم ضرایب کدگذاری می شود، سپس بعدی به ترتیب نزولی و غیره. ممکن است اتفاق بیفتد که صفحات بیت با بالاترین اولویت N (صفحه های NPB) دارای یکی نباشند. در این حالت، اولین صفحه به ترتیب که حداقل یک واحد را شامل می شود، صفحه NPB می شود. صفحات خالی قبل از آن در هنگام رمزگذاری حذف می شوند و اطلاعات مربوط به تعداد آنها در سربرگ بلوک وارد می شود.

کدگذاری حسابی مبتنی بر یک مدل حساس به زمینه است. زمینه به عنوان تابعی از مقادیر بیت های اطراف بیت در حال کدگذاری شکل می گیرد. هر صفحه بیت، به جز NBP، معمولاً در سه گذر کدگذاری می شود. در طی اولین پاس کد، اطلاعات مربوط به اهمیت ضرایب منتشر می شود. در طول رمزگذاری، به هر ضریب در بلوک کدگذاری شده یک پارامتر اهمیت اختصاص داده می شود. اگر در صفحات بیتی که در حال حاضر کدگذاری شده اند، حداقل یک بیت غیر صفر از این ضریب وجود داشته باشد، ضریب معنی دار نامیده می شود.

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

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

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

یکی از جزئیات ضروری ارائه شده توسط این استاندارد، امکان رد شدن از پاس های کد است که منبع دیگری برای افزایش کارایی به دلیل از دست دادن اطلاعات است (اولین و واضح ترین منبع کمی سازی است). این ویژگی به طور فعال برای کنترل سرعت تولید کد استفاده می شود.

2.5. سازماندهی داده ها

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



برنج. 20.

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

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

دستیابی به فشرده سازی با کیفیت بالا، البته، یکی از وظایف اصلی هنگام ایجاد استاندارد بود، و در اینجا توسعه دهندگان پیشرفت واضحی داشته اند. استاندارد JPEG2000 تقریباً 2 برابر بیشتر از استاندارد JPEG در هنگام فشرده سازی با اتلاف و 5-20٪ در هنگام فشرده سازی بدون تلفات کارآمدتر است. البته راندمان فشرده سازی بدون تلفات در این حالت به اندازه استاندارد JPEG-LS نیست، اما کاملا قابل قبول است. در مورد کارایی فشرده سازی با اتلاف، در اینجا استاندارد به شما امکان می دهد نتایجی را بدست آورید که نزدیک به بهترین نتایج برای این نوع روش های امروزی است.

3.JPEG-LS

قالب JPEG-LSبر اساس قالب بود LOCO-I(فشرده سازی بدون اتلاف کم پیچیدگی برای تصاویر). الگوریتم فشرده سازی بدون تلفات LOCO-I که به عنوان پایه توسعه استاندارد JPEG-LS پذیرفته شد، برای اولین بار نه تنها حالت بدون تلفات، بلکه تقریباً بدون تلفات (فشرده سازی با تلفات محدود و تعریف شده توسط کاربر) را ارائه کرد. برخلاف حالت JPEG2000 بدون اتلاف، JPEG-LS واقعاً موفق بود: با راندمان فشرده‌سازی بیشتر، استاندارد جدید سرعت فشرده‌سازی/فشرده‌سازی بالایی را فراهم می‌کند و برای منابع رایانه خیلی سخت نیست.

درک این نکته مهم است که فرمت JPEG-LS:

  • توسعه یا اصلاح روش JPEG نیست.
  • از کدگذاری DCT یا حسابی استفاده نمی کند.
  • از کوانتیزاسیون ضعیف فقط در حالت "تقریباً بدون تلفات" استفاده می کند

3.1. معرفی مفاهیم اولیه و اصول عملیاتی

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

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

رمزگشای JPEG-LS تفاوت کمی با رمزگذار دارد، بنابراین این الگوریتم فشرده سازی را می توان تقریباً متقارن نامید. در اینجا یک نمودار ساده شده است که اصول کدگذاری را نشان می دهد:



برنج. 21.

برخی اطلاعات در مورد تصویر اصلی: همانطور که در نمودار زیر نشان داده شده است (شکل 22)، تصویر اصلی ممکن است از اجزای Nf تشکیل شده باشد. هر جزء Ci شامل یک آرایه دو بعدی از پیکسل ها (نمونه) از ستون های x i و ردیف های y i است. اندازه مولفه ها به دو پارامتر بستگی دارد: X و Y که X حداکثر در بین مقادیر x i است و Y حداکثر در بین مقادیر y i همه اجزا است. (در استاندارد JPEG-LS، یک فصل کامل به تفاوت کار با تصاویر چند جزئی در مقایسه با تصاویر تک جزیی اختصاص داده شده است، اما در این مقاله تنها به کار با تصاویر تک جزیی می پردازیم).



برنج. 22.

شکل جهت هر جزء را نشان می دهد: بالا، پایین، چپ و راست. ترتیب ارسال پیکسل ها به رویه های رمزگذاری به صورت زیر تعیین می شود: از چپ به راست (از چپ به راست) و از بالا به پایین (از بالا به پایین) توسط مؤلفه.

پیکسل های زمینه a، b، c، d برای پیش بینی پیکسل فعلی x استفاده می شوند. بسته به زمینه، رمزگذار حالتی را انتخاب می کند: سریال (حالت اجرا)یا حالت منظم. مد سریالدر صورتی انتخاب می شود که y و z احتمالاً بر هم منطبق باشند، منظم- در غیر این صورت. بیایید در اینجا یک یادداشت در رابطه با وجود گزینه داشته باشیم "تقریبا بدون ضرر": هنگامی که این گزینه فعال باشد، اگر y و z با توجه به پارامتر تلورانس NEAR تقریباً یکسان باشند، حالت سریال انتخاب می شود.

در مورد استفاده از مد سریال شروع به وبگردی می کنیم خط فعلیاز پیکسل x و بزرگترین طول یک سری پیکسل منطبق با پیکسل متنی a را پیدا کنید. بنابراین، در خط جاری، یک سری پیکسل یکسان دریافت می کنیم که از نظر مقدار با پیکسل شناخته شده a منطبق است. تنها چیزی که باقی می ماند این است که طول سریال را رمزگذاری کنیم. (این کار با استفاده از یک آرایه 32 عنصری J انجام می شود.) شاید پیش از این حدس زده باشید که با فعال بودن گزینه "تقریباً بدون اتلاف"، مجموعه ای از پیکسل های نزدیک به a با استفاده از پارامتر NEAR انتخاب می شوند.

حال بیایید به اقدامات خود در مورد استفاده از حالت معمولی نگاه کنیم. برای محاسبه پیش‌بینی پیکسل x (Px) از مقادیر پیکسل‌های a، b و c استفاده می‌شود. سپس به اصطلاح خطای پیش بینی (Errval) محاسبه می شود. مقدار آن برابر است با تفاوت بین مقادیر x و Px. Errval توسط برخی اصطلاحات وابسته به زمینه تنظیم می شود و سپس با استفاده از کدهای Golomb کدگذاری می شود. کد گلومب به a، b، c، d و Errval همان پیکسل‌ها بستگی دارد که در آرایه‌های خاص A و N ذخیره می‌شوند. وقتی گزینه «تقریباً بی‌اتلاف» فعال باشد، خطای پیش‌بینی قبل از رمزگذاری بیشتر کوانتیزه می‌شود.


برنج. 23.

3.2. رمزگذار

JPEG-LS عمدتا به عنوان یک روش فشرده سازی اطلاعات بدون تلفات استفاده می شود، از این رو فایل تصویری بازیابی شده معمولاً با فایل اصلی یکسان است. در حالت تقریباً بدون ضرر، تصویر اصلی و تصویر بازسازی شده ممکن است متفاوت باشند. پیکسل بازسازی شده را با Rp و پیکسل اصلی را با p نشان می دهیم.

در مرحله اولیه سازی، رمزگذار عملیات زیر را انجام می دهد:

  • پارامترها RANGE = کف ((MAXVAL + 2 * NEAR) / (2 * NEAR + 1)) + 1، qbpp = ceil (log RANGE)، bpp = max (2، ceil (log (MAXVAL + 1)) محاسبه می‌شوند. )، LIMIT = 2 * (bpp + max(8، bpp)) . (در صورت رمزگذاری بدون اتلاف، NEAR = 0، RANGE = MAXVAL + 1. اگر حالت "تقریباً بدون تلفات" فعال است، NEAR > 0). MAXVAL و NEAR پارامترهایی هستند که توسط برنامه پیاده‌سازی الگوریتم تنظیم شده‌اند.
  • آرایه های شاخص N، A، B و C مقدار دهی اولیه می شوند. اجازه دهید هدف آنها را توضیح دهیم: N برای ذخیره فراوانی وقوع هر زمینه، A - برای جمع آوری مقدار خطای پیش بینی، B - برای محاسبه انحراف سیستماتیک، C - برای ذخیره مقادیر تصحیح استفاده می شود. خطای پیش بینی
  • متغیرهای حالت اجرا RUNindex=0 و J = (0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 5 هستند. ، 5، 6، 6، 7، 7، 8، 9،10،11،12،13،14،15).
  • دو متغیر کمکی Nn مقداردهی اولیه می شوند، Nn=0 برای رمزگذاری پیکسل انفجاری.

بیایید چند توابع و متغیرهایی را که بعدا مورد استفاده قرار خواهند گرفت، معرفی می کنیم:

تابع GetNextSample(): اطلاعات پیکسل بعدی تصویر منبع را دریافت می کند و مقادیر مربوط به متغیرهای x, a, b, c, d, Ix, Ra, Rb, Rc, Rd را تعیین می کند. اگر پیکسل خوانده شده در انتهای خط باشد، سپس GetNextSample() EOLine = 1 را تنظیم می کند. در تمام موارد دیگر، EOLine = 0. مقادیر Ra، Rb، Rc، Rd مقادیر خود را از مقدار Rx محاسبه شده قبلی به ارث می برند. متغیر جهانی EOLine: توسط تابع GetNextSample () تنظیم می شود: اگر پیکسل فعلی آخرین پیکسل در خط باشد، برابر با 1 است، در غیر این صورت برابر با 0 است. تابع AppendToBitStream(a,b): یک عدد غیر منفی را به صورت باینری به جریان بیت کدگذاری شده با استفاده از بیت های b اضافه می کند. مهم ترین بیت ها ابتدا اضافه می شوند. تابع Quantize(a): برای کمی کردن خطای پیش‌بینی در حالت «تقریباً بدون تلفات» استفاده می‌شود. تابع ComputeRx(): مقدار Rx بازسازی شده را برای پیکسل فعلی برمی گرداند (از "خطای پیش بینی" کوانتیزه شده استفاده می کند).

از تصویر بالا (شکل 23) مشخص است که پیکسل های a، b، c و d نقش مهمی در رمزگذاری پیکسل x دارند. بیایید سعی کنیم بفهمیم وقتی این پیکسل ها از بین می روند چه اتفاقی می افتد. بنابراین، هنگام رمزگذاری خط بالایی، پیکسل های زمینه c، b و d از دست رفته اند، بنابراین مقادیر آنها صفر در نظر گرفته می شود. اگر پیکسل فعلی در ابتدا یا انتهای خط باشد، پیکسل های a، c یا d تعریف نشده اند. در این مورد، a و d از مقدار Rb بازسازی شده پیکسل b (یا صفر برای خط بالایی) استفاده می کنند و c از مقدار بازسازی شده a هنگام رمزگذاری اولین کاراکتر خط قبلی استفاده می کند. بنابراین، رمزگذار باید بخشی از کار رمزگشا را با بازسازی چند پیکسل انجام دهد.

رمزگذار با سه مرحله زیر شروع می شود:

پس از ایجاد زمینه Q، رمزگذار پیکسل x را پیش بینی می کند. ابتدا، پیش‌بینی Px با استفاده از به اصطلاح «پیش‌بینی‌کننده لبه» محاسبه می‌شود:

اگر (Rc > = max(Ra, Rb)) Px = min(Ra, Rb)؛
دیگر(
اگر (Rc<= min(Ra, Rb))
Px= max(Ra, Rb);
دیگر
Px = Ra + Rb - Rc;
}

اجازه دهید ماهیت "قاعده لبه" را توضیح دهیم. برای این کار مورد ب را در نظر بگیرید< а. При этом условии «правило края» выбирает b в качестве прогноза х во многих случаях, когда вертикальный край изображения находится непосредственно слева от х. Аналогично, пиксель а выбирается в качестве прогноза х во многих случаях, когда горизонтальный край находится непосредственно над х. Если край не обнаруживается, то «правило края» вычисляет прогноз в виде а + b - с, что имеет простую геометрическую интерпретацию. Если каждый пиксель является точкой трехмерного пространства, то прогноз а + b - с помещает Рх на ту же плоскость, что и точки а, b и с.

مرحله بعدی تصحیح پیش‌بینی از بایاس با استفاده از عدد SIGN (بسته به شماره سه منطقه Qi)، مقادیر تصحیح C(Q) (برگرفته از بایاس‌های سیستماتیک، و در اینجا بحث نشده است) و پارامتر MAXVAL است.

اگر (SIGN == 1+)
Px = Px + C (Q);
دیگر
Px = Px - C(Q);

اگر (Px > MAXVAL)
Px = MAXVAL;
در غیر این صورت اگر (Px< 0)
Px = 0;

پس از یافتن پیش‌بینی Px، رمزگذار خطای پیش‌بینی Errval را به عنوان تفاوت x - Px محاسبه می‌کند، اما اگر مقدار SIGN منفی باشد، علامت را تغییر می‌دهد.

به روشی تقریباً بدون تلفات، خطا کوانتیزه می شود و رمزگذار از مقدار Rx بازسازی شده پیکسل x به همان روشی که رمزگشا استفاده می کند استفاده می کند. مرحله اساسی کوانتیزاسیون به شرح زیر است:

اگر (Errval > 0)
Errval = (Errval + NEAR) / (2 * NEAR + 1);
دیگر
Errval = - (Errval - NEAR) / (2 * NEAR + 1);

این از پارامتر NEAR استفاده می کند، اما برخی جزئیات وجود دارد که در اینجا نشان داده نشده اند. مرحله اصلی بازسازی یافتن Rx = Px + SIGN * Errval * (2 * NEAR + 1) است.

خطای پیش‌بینی (پس از کمیت‌سازی احتمالی) دچار کاهش مدول می‌شود. (بعد از این برای مرحله کد نویسی اصلی آماده است).

اگر (اروال< 0)
Errval = Errval + RANGE;
اگر (Errval >= ((RANGE + 1) / 2))
Errval = Errval - RANGE;

کدهای Golomb (پارامتر اصلی با b نشان داده شد). در JPEG-LS این پارامتر m تعیین می شود. اگر عدد m قبلاً انتخاب شده باشد، کد گلمب یک عدد صحیح غیر منفی n از دو قسمت تشکیل شده است: کد یکنواخت قسمت صحیح عدد n/m و نمایش باینری n mod m. این کد برای اعداد صحیحی که دارای توزیع هندسی هستند ایده آل است (یعنی زمانی که احتمال عدد n (1 - r) * r n , 0 باشد.< r < 1) . Для каждого геометрического распределения найдется такое число m, что код Голомба, построенный по m, имеет наименьшую возможную среднюю длину. ساده ترین مورد، هنگامی که m توان 2 باشد (m = 2 k)، منجر به عملیات رمزگذاری/رمزگشایی ساده می شود. کد عدد n در این مورد از k ارقام مرتبه پایین عدد n تشکیل شده است که قبل از آن کد واحد عدد متشکل از ارقام مرتبه بالا باقیمانده عدد n وجود دارد. این کد خاص Golomb با G(k) نشان داده می شود.

برای مثال، بیایید کد G(2) عدد n = 19 = 10011 2 را محاسبه کنیم. از آنجا که k = 2، پس m = 4. بیایید با دو رقم کم اهمیت، 11 2، از عدد n شروع کنیم. آنها برابر با 3 هستند که همان n mod m است (3 = 19 mod 4). مهم ترین ارقام باقی مانده، 100 2، عدد 4 را به دست می دهند که برابر است با قسمت صحیح n/m (19/4 = 4.75). کد یوناری 4 00001 است، بنابراین کد G(2) n = 19 00001|11 است.

در عمل، همیشه تعداد محدودی از اعداد صحیح غیر منفی وجود دارد. بیایید بزرگترین عدد را با I نشان دهیم. بزرگترین طول G(0) I + 1 است، و از آنجایی که می توانم بزرگ باشم، مطلوب است که اندازه کد Golomb محدود شود. این کار با استفاده از یک کد Golomb خاص LG(k, glim) انجام می شود که به دو پارامتر k و glim بستگی دارد. ابتدا باید عدد q را از مهم ترین ارقام عدد n تشکیل دهید. اگر q< glimit- - 1 , то код LG(k, glimit) совпадает с кодом LG(k]. В противном случае, приготавливается унарный код числа glimit - ceil(log I) - 1 (то есть, glimit - ceil(log I) - 1 нулей, за которыми стоит единственная 1). Это действует как код esc, после которого стоит двоичный код n - 1 из ceil(log I) бит.

خطاهای پیش بینی لزوما اعداد مثبت نیستند. آنها برابر با برخی تفاوت ها هستند که می تواند صفر یا منفی باشد. با این حال، کدهای Golomb برای آن ساخته شدند اعداد مثبت. بنابراین، قبل از رمزگذاری، مقادیر خطای منفی باید در مجموعه ای از اعداد غیر منفی منعکس شود. برای این کار از نقشه زیر استفاده کنید:
مروال =
2 * Errval اگر Errval >= 0،
2 * |اروال| اگر اروال< 0.

این نمایشگر مقادیر منفی و مثبت را به ترتیب 0، -1، +1، -2، +2، -3،... جایگزین می کند.

جدول زیر برخی از خطاهای پیش بینی، مقادیر نمایش داده شده و کدهای LG(2، 32) آنها را فهرست می کند، با فرض اینکه حروف الفبا اندازه 256 باشد (یعنی I = 255 و ceil (log I) = 8).

جدول: خطاهای پیش بینی، نمایشگرها و کدهای ال جی (2، 32)

خطای پیش بینی مقدار نمایش داده شده کد
0 0 1 00
-1 1 1 01
1 2 1 10
-2 3 1 11
2 4 01 00
-3 5 01 01
3 6 01 10
-4 7 01 11
4 8 001 00
-5 9 001 01
5 10 001 10
-6 11 001 11
6 12 0001 00
...
50 100 000000000000
000000000001
01100011

اکنون باید در مورد انتخاب پارامتر k برای کدهای Golomb بحث کنیم. این به صورت تطبیقی ​​انجام می شود. پارامتر k وابسته به زمینه است و هر بار که پیکسلی با آن زمینه پیدا می شود، مقدار آن به روز می شود. محاسبه k را می توان در یک خط ساده بیان کرد:
برای (k=0; (N[Q]<که در آن A و N آرایه هایی از شاخص های 0 تا 364 هستند. این فرمول از بافت Q به عنوان شاخص دو آرایه استفاده می کند. در ابتدا k به صفر مقداردهی می شود و سپس حلقه اجرا می شود. در هر تکرار حلقه، یک عنصر از آرایه N[Q] توسط k بیت به چپ منتقل شده و با A[Q] مقایسه می شود. اگر مقدار جابجا شده N[Q] بزرگتر یا مساوی A[Q] باشد، مقدار فعلی k انتخاب می شود. در غیر این صورت، k 1 افزایش یافته و آزمایش تکرار می شود.

پس از یافتن عدد k، خطای پیش‌بینی Errval به عدد MErrval تبدیل می‌شود که با استفاده از کد LG(k, LIMIT) کدگذاری می‌شود. عدد LIMIT یک پارامتر است. به روز رسانی آرایه های A و N (همراه با آرایه کمکی B) با قطعه کد زیر نشان داده شده است (پارامتر RESET توسط برنامه تنظیم شده است):

B[Q] = B[Q] + Errval * (2 * NEAR + 1);
A[Q] = A[Q] + abs(Errval);
اگر (N[Q] == RESET) (
A[Q] = A[Q]>>1;
B[Q] = B[Q]>>1;
N[Q] = N[Q]>>1;
}
N[Q] = N[Q] + 1;

حالا بیایید در مورد محاسبه انحراف سیستماتیک پیش بینی صحبت کنیم. مقدار تصحیح پیش بینی C[Q] باید در پایان رمزگذاری پیکسل x به روز شود. این به دو متغیر - B[Q] و N[Q] نیاز دارد. N[Q] تعداد رخدادهای زمینه Q از زمان اولیه است. B[Q] یک انحراف سیستماتیک است که اجازه می دهد مقدار C[Q] حداکثر یک بار در هر تکرار به روز شود. بنابراین، مقدار پیش‌بینی‌کننده C[Q] طبق کد زیر محاسبه می‌شود:

اگر (B[Q]<= -N[Q]) {
B[Q] = B[Q] + N[Q];
اگر (C[Q] > MIN_C)
C[Q] = C[Q] - 1;
اگر (B[Q]<= -N[Q])
B[Q] = -N[Q] + 1;
}
در غیر این صورت (B[Q] > 0) (
B[Q] = B[Q] - N[Q];
اگر (C[Q]< MAX_C)
C[Q] = C[Q] + 1;
اگر (B[Q] > 0)
B[Q] = 0;
}

ثابت های MIN_C و MAX_C حداقل و حداکثر هستند معنی ممکنآرایه شاخص C به ترتیب برابر با 128- و 127 است.

کدنویسی در حالت سریال به صورت متفاوتی انجام می شود. به یاد بیاورید که رمزگذار این حالت را زمانی انتخاب می کند که پیکسل های متوالی x را شناسایی کند که مقادیر Ix آنها مطابقت دارند و برابر با مقدار Ra بازسازی شده پیکسل زمینه a هستند. برای گزینه "تقریباً بدون اتلاف"، پیکسل های سری باید مقادیر Ix داشته باشند که نابرابری را برآورده کند |Ix - Ra|<= NEAR . Серия не должна выходить за пределы текущей строки. Длина серии кодируется (сам пиксель кодировать не нужно, поскольку он равен Ra), и если конец серии находится раньше конца строки, то после ее закодированной длины будет сразу записан код следующего пикселя (который прерывает серию). Две основные задачи кодера в этой моде состоят

  1. در ردیابی یک سری و کدگذاری طول آن؛
  2. در کدگذاری پیکسلی که سریال را قطع کرد.

این سریال به شرح زیر قابل پیگیری است:

RUNval = Ra;
RUNcnt = 0;
while (abs(Ix - RUNval)<= NEAR) {
RUNcnt = RUNcnt + 1;
Rx = RUNval;
اگر (EOLline == 1)
زنگ تفريح؛
دیگر
GetNextSample();
}

اجازه دهید برخی از مقادیر معرفی شده را توضیح دهیم: RUNcnt تعداد پیکسل های تکرار شونده (برای حالت سریال) است و RUNval مقدار فعلی پیکسل تکراری بازسازی شده است.

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

در حالی که (RUNcnt >= (1<AppendToBitStream(1, 1);
RUNcnt = RUNcnt - (1<اگر (RUNindex< 31))
RUNindex = RUNindex + 1;
}

کد زیر کدگذاری برای بخش های اجرا شده با طول کمتر از rm را نشان می دهد:

اگر (EOLline == 0) (
AppendToBitStream(0, 1);
AppendToBitStream (RUNcnt، J);
اگر (RUNindex > 0)) (
RUNindex = RUNindex - 1;
}
else if (RUNcnt > 0)
AppendToBitStream(1, 1);

در اینجا رمزگذار از جدول J استفاده می کند که شامل 32 ورودی است که با rk نشان داده می شود. J با مقادیر مقداردهی اولیه می شود
0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 9, 10, 11, 12, 13, 14, 15 .

برای هر مقدار rk rm = 2 rk را نشان می دهیم. به اعداد rm (در مجموع 32 عدد وجود دارد) ترتیب کد می گویند. 4 مقدار اول rk دارای rm = 2 0 = 1 است. برای چهارگانه دوم rm = 2 1 = 2، و برای چهار مقدار بعدی rm = 2 2 = 4. برای آخرین عدد rm = 2 15 = 32768. رمزگذار روشی را که برای یافتن طول اجرا توضیح داده شده است را انجام می دهد که در متغیر RUNlen ذخیره می شود. سپس این متغیر با تقسیم آن به عباراتی که مقادیر آن برابر با اعداد متوالی rm است کدگذاری می شود. برای مثال، اگر RUNlen=6 باشد، با استفاده از پنج عدد اول rm به صورت 6 = 1 + 1 + 1 + 1 + 2 نمایش داده می شود. با استفاده از 5 بیت کدگذاری شده است. ضبط با استفاده از دستورالعمل AppendToBitStream(l,l) انجام می شود. هر بار که 1 نوشته می شود، مقدار rm مربوطه از RUNlen کم می شود. اگر RUNlen در ابتدا برابر با 6 بود، به طور متوالی به 5، 4، 3، 2 و 0 کاهش می یابد.

ممکن است طول سری RUNlen با مجموع صحیح اعداد rm برابر نباشد. به عنوان مثال، RUNlen = 7. در این مورد، پنج بیت از 1 به عنوان کد نوشته می شود، به دنبال آن یک بیت پیشوند و باقیمانده RUNlen (در مثال ما 1 است)، که به عنوان تعدادی بیت rk در فایل نوشته می شود (مقدار فعلی rk در مثال ما 2 است). این آخرین عملیات با فراخوانی رویه AppendToBitStream(RUNcnt, J) انجام می شود. بیت پیشوند 0 است اگر سری توسط پیکسل دیگری در خط قطع شود. اگر سری به انتهای خط برود، پس بیت پیشوند 1 است.

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

وضعیتی را در نظر بگیرید که در آن پیشرفت رمزگذاری توسط انتهای رشته ای از پیکسل ها قطع می شود: پیکسل جدیدی که باعث وقفه می شود چگونه رمزگذاری می شود؟ این مشکل با رمزگذاری تفاوت بین مقدار Ix در موقعیت فعلی x و مقدار بازسازی شده پیکسل‌های a یا b حل می‌شود (به یاد بیاورید که اینها پیکسل‌های همسایه نسبت به x هستند - شکل 23 را ببینید). در این مورد، دو وضعیت مختلف در نظر گرفته می شود: اول، زمانی که abs(Ra - Rb)<= NEAR , вторая - в противном случае. По сути кодирование пикселя прерывания серии происходит теми же методами, что и кодирование нового пикселя в регулярной моде с тем лишь дополнением, что Ix должно отличаться от Ra на величину большую NEAR, иначе ход кодирования будет продолжен. Опишем операции, которые должны быть выполнены:

اگر (abs(Ra - Rb)<= NEAR)
RItype = 1;
دیگر
RItype = 0;
اگر (RItype == 1)
Px = Ra;
دیگر
Px = Rb;
Errval = Ix - Rb;

قطعه کد بالا شاخص RItype و خطای پیش‌بینی را برای پیکسل x تعریف می‌کند. سپس در صورت لزوم، علامت Errval را تغییر دهید و برای گزینه "تقریبا ضرر" خطای پیش بینی را نیز کمی کنید:

اگر ((RItype == 0) && (Ra > Rb)) (
اروال = -اروال;
SIGN = -1;
دیگر
SIGN = 1;
اگر (نزدیک > 0) (
Errval = Quantize(Errval);
Rx = ComputeRx();
}
دیگر
Rx = Ix;
Errval = ModRange (Errval, RANGE);

حال بیایید متغیر کمکی TEMP را محاسبه کنیم که برای محاسبه پارامتر k در کدهای Golomb استفاده می شود.

اگر (RItype == 0)
TEMP = A;
دیگر
TEMP = A + (N>>1)؛

بیایید Q = RItype + 365 را تنظیم کنیم. پارامتر k را برای کدهای Golomb به صورت زیر محاسبه می کنیم: برای (k=0; (N[Q]<

اگر (اروال< 0) {
Nn[Q] = Nn[Q] + 1;
A[Q] = A[Q] + ((EMERrval + 1 -RItype)>>1);
اگر (N[Q] == RESET) (
A[Q] = A[Q]>>1;
N[Q] = N[Q]>>1;
Nn[Q] = Nn[Q]>>1;
}
N[Q] = N[Q] + 1;

این پایان توضیحات رمزگذار JPEG-LS است. توجه داشته باشید که مطمئناً ناقص است، اما ما هدف خود را از کپی کردن استاندارد این روش قرار ندادیم. تمام جزئیات حذف شده را می توان در استاندارد یافت. حالا بیایید به توضیح مختصری در مورد اصول عملکرد رسیور بپردازیم.

3.3. رمزگشا

همانطور که قبلا ذکر شد، روش JPEG-LS تقریباً متقارن است، بنابراین ما توضیحات رمزگذار را با تغییرات جزئی کپی نمی کنیم - این اطلاعات را می توان در استاندارد خواند. بگذارید فقط به نحوه رمزگشایی در حالت سریال بپردازیم. بعد از اینکه تمام مقادیر پیکسل فعلی محاسبه شد، بخوانید بیت جدید R از جریان بیت. اگر برابر با 1 باشد، آنگاه:

  1. تصویر با 2 J|RUNindex| تکمیل شده است پیکسل با مقدار Ra
  2. اگر در مرحله قبل تصویر قبلاً با 2 J|RUNindex| تکمیل شده بود پیکسل و RUNindex< 31, то RUNindex увеличивается на 1. Если последний пиксель в строке ещё не декодирован, то мы снова считываем биты, в противном случае переходим к вычислению всех требуемых величин.

اگر بیت 0 باشد، پس:

  1. J|RUNindex| را بخوانید بیت از جریان بیت و به عدد تبدیل می شود و تصویر با پیکسل هایی با مقادیر Ra به مقداری مطابق با عدد محاسبه شده تکمیل می شود.
  2. اگر RUNindex > 0 باشد، RUNindex 1 کاهش می یابد.
  3. پیکسل وقفه سری رمزگشایی می شود و محاسبه تمام مقادیر لازم دوباره شروع می شود.

3.4. فرمت فایل

فایل فشرده شامل:

  • از بخش های داده حاوی کدهای Golomb و طول اجرا.
  • از بخش های نشانگر (اطلاعات لازم برای رمزگشا)؛
  • از بخش نشانگرهای "استراحت" (برخی نشانگرهای JPEG رزرو شده).

در اینجا ما یک نشانگر را یک بایت از یک ها می نامیم و به دنبال آن یک کد ویژه که شروع یک بخش جدید را نشان می دهد. اگر پس از یک نشانه، بایتی وجود داشته باشد که مهم ترین بیت آن 1 است، آن بایت شروع بخش نشانه است. در غیر این صورت، بخش داده شروع می شود.

3.5. کدهای گلومب

ما قبلاً بیش از یک بار به کدهای Golomb اشاره کرده ایم. چیست؟ کد Golomb یک عدد صحیح غیر منفی "می تواند یک کد هافمن کارآمد باشد." بستگی به انتخاب پارامتر b دارد. اصل کدنویسی به شرح زیر است:

  • دو مقدار محاسبه می شود
    q = طبقه ((n - 1) / b) و
    r = n - qb - 1 ;
  • کد در دو بخش ساخته شده است: بخش اول q در کد یکنواخت است، بخش دوم یک عبارت باینری برای r است که شامل بیت های طبقه (log 2 b) برای باقیمانده های کوچک و بیت های سقف (log 2 b) برای بقایای بزرگ است. .

ما توجیهی ریاضی برای استفاده از کدهای Golomb در JPEG-LS ارائه نمی کنیم، فقط توجه می کنیم که اگر جریان داده ورودی از اعداد صحیح تشکیل شده باشد و احتمال عدد n برابر با P(n) = (1 - p باشد) ) n - 1 p (0<= p <= 1) , то коды Голомба будут оптимальными кодами для этого потока данных, если выбрать параметр b следующим образом:
(1 - p) b + (1 - p) b + 1<= 1 <= (1 - p) b - 1 + (1 - p) b .

3.6. نتیجه

فرمت JPEG-LS در درجه اول برای ذخیره تصاویر برای مقاصد پزشکی ایجاد شده است، یعنی برای مواردی که داشتن یک تصویر بزرگ بدون کوچکترین افت کیفیت مهم است. همانطور که قبلا ذکر شد، فرمت LOCO-I که در دیواره های آزمایشگاه HP توسعه یافته است، به عنوان پایه در نظر گرفته شد. سپس با تلاش مشترک HP و Mitsubishi توسعه بیشتری یافت. هر دو شرکت اجازه دادند که پتنت های خود در این قالب بدون پرداخت مجوز استفاده شود، بنابراین JPEG-LS را می توان در برنامه های معمولی رایانه شخصی نیز یافت.

بگذارید با مثال خودم توضیح دهم. شاید بتوانید به من کمک کنید تا برخی چیزها را درک کنم. وظیفه ای که خودم پیش روی من گذاشته ام به شرح زیر است. یک فریم (با دستور) از دوربین وب به حافظه تلفن همراه با انتقال بعدی به تلفن همراه دیگر منتقل کنید. از مقاله شما مشخص نیست که در دسترس بودن الگوریتم بر چه قالبی باید باشد. بعد - تبدیل کسینوس - فقط یک تفسیر سطحی، و کجا می توانم به یک الگوریتم دقیق با یک مثال خاص نگاه کنم (مثلاً تجزیه و تحلیل ریاضی را مطالعه کنید، اما حتی تقریباً هیچ نمونه خاصی وجود ندارد، و اگر وجود داشته باشد، بخش های کاملی از محاسبات از دست رفته است. شاید کتابچه راهنمای خاصی وجود داشته باشد، پس مراجعه کنید. ساختار سازماندهی پرونده به طور کامل از بین رفته است و پیوندها حتی نشان داده نشده اند: "در ماتریس حاصل، اجزای فرکانس پایین نزدیکتر به گوشه سمت چپ بالا قرار دارند. و فرکانس‌های بالاتر به سمت راست منتقل می‌شوند،» به نظر من اینطوری انجام می‌شود، اما کار نمی‌کند (شاید من اشتباه می‌کنم!).

سوال: چگونه می توان به عنوان مثال فقط اطلاعات لازم را از یک فریم JPG برای رمزگشایی بیشتر در وضوح صفحه تلفن بدون استفاده از رایانه شخصی با استفاده از MK ضبط کرد. یک نسخه سیاه و سفید از قاب کافی است. به کدام FFxx باید توجه کنید و فقط آن اطلاعات را ثبت کنید. ساختار قاب دوربین وب را از کجا می توانم تهیه کنم؟ من درک می کنم که موضوع پیچیده و چند وجهی است. به عنوان مثال، در MK رمزگشایی قاب و سپس فشرده سازی آن با وضوح مورد نیاز غیرممکن است، اما احتمالاً می توان حداقل گوشه بالایی را با فرمت مورد نیاز برش داد.

من برای اطلاعات سپاسگزار خواهم بود.

آنچه می توانم انجام دهم = برنامه در VB، MK. توسعه تعاملی عملکرد مستقل کنترل از طریق تلفن همراه با چندین رله، کنترل صوتی با استفاده از تلفن همراه.

>> مرحله دوم این است که مستقیماً الگوریتم رمزگذاری تکرار >> (LZW) را اعمال کنید.

شاید RLE؟

البته، در این مرحله JPEG (به زمینه مراجعه کنید) RLE است. با تشکر از شناسایی خطا.

بهترین مقالات در این زمینه