كيف يعمل JPG

كيف يعمل JPG

كان تنسيق ملف JPG أحد أكثر التطورات إثارة للإعجاب من الناحية التكنولوجية لضغط الصور الذي ظهر على الساحة في عام 1992. ومنذ ذلك الحين ، كان يمثل قوة مهيمنة في تمثيل صور جودة الصور على الإنترنت. ولسبب وجيه. الكثير من التكنولوجيا الكامنة وراء كيفية عمل JPG معقدة بشكل استثنائي ، وتتطلب فهماً راسخاً لكيفية تكيف العين البشرية مع إدراك الألوان والحواف.

ونظرًا لأنني مهتم بهذه الأشياء (وأنت أيضًا ، إذا كنت تقرأ هذا) ، فقد أردت تقسيم كيفية عمل تشفير JPG ، حتى نتمكن من فهم كيفية إنشاء ملفات JPG أصغر.

جوهر

يتم تقسيم نظام ضغط JPG إلى عدة مراحل. الصورة أدناه تصفهم على مستوى عالٍ ، وسنستعرض كل مرحلة أدناه.

تحويل مساحة الألوان

أحد المبادئ الأساسية لضغط البيانات المفقودة ، هو أن أجهزة الاستشعار البشرية ليست دقيقة مثل أنظمة الحوسبة. علميًا ، تمتلك العين البشرية فقط القدرة الجسدية على تمييز حوالي 10 ملايين لون مختلف. ومع ذلك ، هناك الكثير من الأشياء التي يمكن أن تؤثر على كيفية إدراك العين البشرية للون ؛ تم إبرازه تمامًا بأوهام الألوان ، أو حقيقة أن هذا الفستان كسر الإنترنت. الجوهر هو أنه يمكن التلاعب بالعين البشرية بشكل جيد فيما يتعلق بالألوان التي تدركها.

التكميم هو شكل من أشكال هذا التأثير في ضغط الصور المفقود ، ولكن JPG يتخذ نهجًا مختلفًا لهذا: نماذج الألوان . A لون الفضاء هي منظمة محددة من الألوان، ولها لون نموذج يمثل صيغة رياضية لكيفية تمثيل هذه الألوان (على سبيل المثال يتضاعف ثلاث مرات في RGB، أو يربع في CMYK).

ما هو قوي في هذه العملية هو أنه يمكنك التحويل من نموذج لون إلى آخر ، مما يعني أنه يمكنك تغيير التمثيل الرياضي للون معين ، باستخدام مجموعة مختلفة تمامًا من القيم الرقمية.

على سبيل المثال ، يوجد أدناه لون محدد ، ويتم تمثيله في نماذج ألوان RGB و CMYK ، وهما نفس لون العين البشرية ، ولكن يمكن تمثيلهما بمجموعة مختلفة من القيم العددية.

يحول JPG من نموذج ألوان RGB إلى Y و Cb و Cr ؛ الذي يتألف من Luminance (Y) و Chroma Blue (Cb) و Chroma Red (Cr). والسبب في ذلك هو أن التجارب النفسية البصرية (المعروفة أيضًا بكيفية عمل الدماغ مع المعلومات التي تراها العين) تُظهر أن العين البشرية أكثر حساسية للإنارة من التلوين ، مما يعني أننا قد نهمل التغييرات الأكبر في التلون دون التأثير على منطقتنا. تصور الصورة. على هذا النحو ، يمكننا إجراء تغييرات عدوانية على قنوات CbCr قبل أن تلاحظ العين البشرية.

الاختزال

إحدى النتائج المثيرة للاهتمام لمساحة اللون YCbCr ، هي أن قنوات Cb / Cr الناتجة بها تفاصيل أقل دقة ؛ أنها تحتوي على معلومات أقل مما تحتويه قناة Y.

نتيجة لذلك ، تقوم خوارزمية JPG بتغيير حجم قنوات Cb و Cr لتكون حوالي حجمها الأصلي (لاحظ أن هناك بعض الفروق الدقيقة في كيفية القيام بذلك والتي لا أغطيها هنا ...) ، وهو ما يسمى الاختزال .

المهم أن نلاحظ هنا أن الاختزال هو عملية ضغط ضائعة (لن تكون قادرًا على استعادة ألوان المصدر الدقيقة ، ولكن تقريبًا قريب) ، ولكن التأثير الكلي على المكونات المرئية للقشرة البصرية للإنسان ضئيل. Luma (Y) هو المكان الذي توجد فيه الأشياء المثيرة للاهتمام ولأننا نقوم فقط بتصغير قنوات CbCr ، فإن التأثير على النظام المرئي منخفض.

الصورة مقسمة إلى كتل 8x8 بكسل

من الآن فصاعدًا ، يقوم JPG بجميع العمليات على كتل 8x8 من البكسل. يتم ذلك لأننا نتوقع عمومًا أنه لا يوجد الكثير من التباين بين الكتل 8 × 8 ، حتى في الصور المعقدة للغاية ، هناك بعض التشابه الذاتي في المناطق المحلية ؛ هذا التشابه هو ما سنستفيد منه أثناء الضغط لاحقًا.

من الجدير بالذكر أنه في هذه المرحلة ، نقدم واحدة من أولى "القطع الأثرية" الشائعة لتشفير JPG. "نزيف اللون" هو المكان الذي يمكن أن "تنزف" الألوان الموجودة على طول الحواف الحادة على الجانب الآخر. هذا لأن قنوات التلون ، التي تعبر عن لون البيكسلات ، تحتوي على كل كتلة من 4 بكسل في المتوسط ​​في لون واحد ، وبعض هذه الكتل تعبر الحافة الحادة.

تحويل جيب التمام منفصلة

حتى هذه اللحظة ، كانت الأمور مروّضة جدًا. تعد مساحات الألوان والاختزال والحظر أشياء بسيطة في عالم ضغط الصور. لكن الآن ... الآن تظهر الرياضيات الحقيقية.

المكون الرئيسي لتحويل DCT ، هو أنه يفترض أنه يمكن إعادة إنشاء أي إشارة رقمية باستخدام مجموعة من وظائف جيب التمام.

على سبيل المثال ، إذا كان لدينا هذا الرسم البياني أدناه:

يمكنك أن ترى أنه مجموع cos (x) + cos (2x) + cos (4x)

ربما يكون أفضل عرض لهذا ، هو فك التشفير الفعلي للصورة ، بالنظر إلى سلسلة من وظائف جيب التمام على مساحة ثنائية الأبعاد. لإظهار ذلك ، أقدم واحدة من أكثر صور GIF المدهشة على الإنترنت: تشفير كتلة 8 × 8 من البكسل باستخدام جيب التمام في مساحة ثنائية الأبعاد:

ما تشاهده هنا هو إعادة بناء صورة (اللوحة الموجودة في أقصى اليسار). كل إطار ، نأخذ قيمة أساسية جديدة (اللوحة اليمنى) ونضربها في قيمة الوزن (نص اللوحة اليمنى) لإنتاج المساهمة في الصورة (اللوحة المركزية).

كما ترون ، من خلال جمع قيم جيب التمام المختلفة مقابل الوزن ، يمكننا إعادة بناء صورتنا الأصلية (حسنًا ...)

هذه هي الخلفية الأساسية لكيفية عمل تحويل جيب التمام المنفصل. الفكرة هي أن أي كتلة 8 × 8 يمكن تمثيلها كمجموع تحويلات جيب التمام الموزونة ، بترددات مختلفة. خدعة مع هذا الشيء كله، هو معرفة ما المدخلات جيب التمام للاستخدام، وكيف ينبغي ترجيح معا.

تبين أن مشكلة " ما يجب استخدامه لجيب التمام" سهلة للغاية ؛ بعد الكثير من الاختبارات ، تم اختيار مجموعة من قيم جيب التمام لتحقيق أفضل النتائج ، فهي وظائفنا الأساسية ويتم تصورها في الصورة أدناه.

بقدر ما يتعلق الأمر بمسألة "كيف يجب أن يتم وزنهم معًا" ، ببساطة (HA!) طبق هذه الصيغة.

سأوفر لك ما تعنيه كل هذه القيم ، يمكنك البحث عنها في صفحة ويكيبيديا.

والنتيجة الأساسية هي أنه بالنسبة لكتلة 8 × 8 من البكسل في كل قناة لونية ، فإن تطبيق الصيغة أعلاه والوظائف الأساسية سيولد مصفوفة 8 × 8 جديدة ، والتي تمثل الأوزان التي سيتم استخدامها أثناء إعادة البناء. فيما يلي رسم بياني للعملية:

تمثل هذه المصفوفة ، G ، أوزان الأساس التي يجب استخدامها لإعادة بناء الصورة (القيمة العشرية الصغيرة في الجانب الأيمن السفلي من الرسم المتحرك أعلاه). بشكل أساسي ، لكل أساس ، نضربه في الوزن في هذه المصفوفة ، ونجمع كل شيء معًا ، ونحصل على الصورة الناتجة.

في هذه المرحلة ، لم نعد نعمل في فضاءات الألوان ، ولكن بشكل مباشر مع G Matrix (أوزان الأساس) ، يتم إجراء المزيد من الضغط على هذه المصفوفة مباشرة.

لكن المشكلة هنا هي أننا قمنا الآن بتحويل قيم الأعداد الصحيحة المحاذية للبايت إلى أرقام حقيقية. مما يؤدي إلى تضخيم معلوماتنا بشكل فعال (الانتقال من 1 بايت إلى 1 تعويم (4 بايت)). لحل هذه المشكلة ، والبدء في إنتاج ضغط أكثر أهمية ، ننتقل إلى مرحلة التكميم.

توضيح

لذلك ، لا نريد ضغط بيانات النقطة العائمة. هذا من شأنه أن ينفخ تيارنا ، ولن يكون فعالاً. تحقيقا لهذه الغاية ، نود أن نجد طريقة لتحويل مصفوفة الأوزان إلى قيم في مساحة [0،255]. بشكل مباشر ، يمكننا القيام بذلك عن طريق إيجاد القيمة الدنيا / القصوى للمصفوفة (-415.38 ، و 77.13 ، على التوالي) وقسمة كل رقم في هذا النطاق لتعطينا قيمة بين [0،1] التي نضربها في 255 للحصول على القيمة النهائية.

على سبيل المثال: [34.12- -415.38] / [77.13 - -415.38] * 255 = 232

يعمل هذا ، لكن المقايضة هي تقليل كبير في الدقة. سينتج عن هذا القياس توزيعًا غير متساوٍ للقيم ، مما ينتج عنه فقدان بصري كبير للصورة.

بدلاً من ذلك ، تتخذ JPG مسارًا مختلفًا. بدلاً من استخدام نطاق القيم في المصفوفة نظرًا لقيمتها المتدرجة ، فإنها تستخدم بدلاً من ذلك مصفوفة محسوبة مسبقًا من عوامل التكميم. لا يلزم أن تكون QFs جزءًا من الدفق ، بل يمكن أن تكون جزءًا من برنامج الترميز نفسه.

يوضح هذا المثال مصفوفة شائعة الاستخدام لعوامل التكميم ، واحدة لكل صورة أساس ،

نحن الآن نستخدم مصفوفات Q و G لحساب مصفوفة معامل DCT الكمية:

على سبيل المثال ، باستخدام G [0،0] = - 415.37 و Q [0،0] = 16 قيمة:

ينتج عن ذلك مصفوفة نهائية من:

لاحظ مدى بساطة المصفوفة - فهي تحتوي الآن على عدد كبير من الإدخالات الصغيرة أو الصفرية ، مما يسهل ضغطها.

بشكل سريع جانبًا ، نطبق هذه العملية على قنوات Y و CbCr بشكل مستقل ، وعلى هذا النحو نحتاج إلى مصفوفتين مختلفتين: واحدة من أجل Y والأخرى للقنوات C:

يضغط التكميم على الصورة بطريقتين مهمتين: الأولى ، أنه يحد من النطاق الفعال للأوزان ، ويقلل من عدد البتات المطلوبة لتمثيلها. ثانيًا ، العديد من الأوزان تصبح متطابقة أو صفرية ، مما يحسن الضغط في الخطوة الثالثة ، ترميز الإنتروبيا.

على هذا النحو الكمي هو المصدر الأساسي لمشغولات JPEG. نظرًا لأن الصور الموجودة في الجزء السفلي الأيمن تميل إلى أن تحتوي على أكبر قواسم تكمية ، فإن مصنوعات JPEG تميل إلى أن تشبه مجموعات من هذه الصور. يمكن التحكم في مصفوفة عوامل التكميم بشكل مباشر عن طريق تغيير "مستوى جودة" JPEG ، والذي يرفع قيمه لأعلى أو لأسفل (سنغطي ذلك في دقيقة واحدة)

ضغط

الآن ، عدنا إلى عالم القيم الصحيحة ، ويمكننا المضي قدمًا في تطبيق مرحلة ضغط بلا خسارة على الكتل الخاصة بنا. ومع ذلك ، عند النظر إلى بياناتنا المحولة ، يجب أن تلاحظ شيئًا مثيرًا للاهتمام:

كلما تحركت من أعلى اليسار إلى أسفل اليمين ، يزداد تكرار الأصفار. هذا يبدو وكأنه المشتبه به الرئيسي لتشفير طول التشغيل. لكن أوامر الصفوف الرئيسية والعمود الرئيسي ليست مثالية هنا ، لأن ذلك من شأنه أن يشتمل على سلاسل الأصفار هذه ، بدلاً من تجميعها جميعًا معًا.

بدلًا من ذلك ، نبدأ من الزاوية العلوية اليسرى ونتعرج في نمط قطري عبر المصفوفة ، ونتحرك ذهابًا وإيابًا حتى نصل إلى الزاوية اليمنى السفلية.

نتيجة مصفوفة luma الخاصة بنا ، بهذا الترتيب ، تصبح:

−26، −3،0، −3، 2، −6،2، −4،1، 3،1،1،5،1،2، 1،1، −1،2،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

بمجرد أن تصبح البيانات بهذا التنسيق ، تكون الخطوات التالية مباشرة: تنفيذ RLE على التسلسل ، ثم تطبيق بعض المشفر الإحصائي (Huffman / Arithmetic / ANS) على النتائج.

وبوم. حظرك الآن مشفر بتنسيق JPG.

فهم معلمة الجودة

الآن بعد أن فهمت كيفية إنشاء ملفات JPG فعليًا ، يجدر بك إعادة النظر في مفهوم معلمة الجودة التي تراها عادةً عند تصدير صور JPG من Photoshop (أو أي شيء آخر).

هذه المعلمة ، التي سنسميها q ، هي عدد صحيح من 1 إلى 100. يجب أن تفكر في q على أنه مقياس لجودة الصورة: تتوافق القيم الأعلى لـ q مع صور عالية الجودة وأحجام ملفات أكبر.

تُستخدم قيمة الجودة هذه خلال مرحلة التكميم ، لقياس عوامل التكميم بشكل مناسب. لذلك لكل وزن أساس ، فإن خطوة التكميم تشبه الآن الجولة (Gi ، k / alpha * Qi ، k)

حيث يتم إنشاء رمز ألفا كنتيجة لمعلمة الجودة.

عند زيادة alpha أو Q [x، y] (تذكر أن القيم الكبيرة لـ alpha تتوافق مع القيم الأصغر لمعامل الجودة q) ، يتم فقد المزيد من المعلومات ، ويقل حجم الملف .

على هذا النحو ، إذا كنت تريد ملفًا أصغر ، على حساب المزيد من القطع الأثرية المرئية ، يمكنك تعيين قيمة جودة أقل أثناء مرحلة التصدير.

لاحظ أعلاه ، في الصورة الأقل جودة ، كيف نرى علامات واضحة لمرحلة الحجب ، وكذلك مرحلة التكميم.

ربما الأهم ، هو أن معلمة الجودة تختلف باختلاف الصورة . نظرًا لأن كل صورة فريدة من نوعها ، وتقدم أنواعًا مختلفة من المشغولات المرئية ، ستكون قيمة Q فريدة أيضًا.

استنتاج

بمجرد فهم كيفية عمل خوارزمية JPG ، تصبح بعض الأشياء واضحة:

  1. يعد الحصول على قيمة الجودة الصحيحة ، لكل صورة ، أمرًا مهمًا للعثور على المقايضة بين الجودة المرئية وحجم الملف.
  2. نظرًا لأن هذه العملية تعتمد على الكتل ، فإن التشوهات تميل إلى الحدوث في شكل كتلة أو "رنين"
  3. نظرًا لأن الكتل المعالجة لا تتداخل مع بعضها البعض ، يتجاهل JPG عمومًا فرصة ضغط مساحات كبيرة من الكتل المتشابهة معًا. إن معالجة هذا القلق أمر جيد في تنسيق WebP.

وإذا كنت تريد أن تتلاعب بكل هذا بنفسك ، فيمكن تلخيص كل هذا الجنون في ملف 1000 سطر تقريبًا.

مهلا!

هل تريد معرفة كيفية تصغير حجم ملفات JPG؟

هل تريد معرفة كيفية عمل ملفات PNG أو كيفية تصغيرها؟

هل تريد المزيد من جودة ضغط البيانات؟ شراء كتابي!