تعويض الحركة
هذه الفكرة وحدها هي ما يميّز ضغط الفيديو عن "ضغط صورٍ متتالية". بدل تخزين الفرق المباشر بين إطارين، نتتبّع أين انتقلت كل قطعة، ونخزّن الحركة + خطأً صغيراً. منها تأتي مئة الضعف الإضافية.
سيّارة تعبر الشاشة بين إطارين. الخلفية ثابتة. الفرق المباشر frame[t] −
frame[t-1] صغير في الخلفية، لكنه ضخم حيث كانت السيّارة وحيث
صارت (تغيّر كامل في منطقتين).
لكن لاحظ: بِكسلات السيّارة لم تتغيّر — هي نفسها، فقط في مكان
آخر. كيف تستغلّ ذلك؟ بدل "ما الفرق هنا؟"، اسأل "من أين
أتت بِكسلات هذه المنطقة؟". وإذا وجدت أنها نسخةٌ من منطقة قريبة في الإطار السابق
مزاحةٌ بمقدار (dx,dy) — فما الذي يكفي تخزينه بدل البِكسلات كلّها؟
مطابقة البلوكات ومتّجه الحركة — حلّ اللغز
قسّم الإطار الحالي لبلوكات (مثلاً ١٦×١٦). لكل بلوك، ابحث في
الإطار المرجعي عن أكثر منطقة تشابهه (ضمن نافذة بحث). الإزاحة لأفضل تطابق =
متّجه الحركة (Motion Vector) (dx,dy). نخزّن:
المتّجه (رقمان!) + الباقي (residual) = الفرق الصغير بين البلوك
وأفضل تطابق. بلوك كامل اختُزل لرقمين وخطأ ضئيل.
تفاصيل تصنع الفرق
- مقياس التشابه: عادةً SAD (مجموع الفروق المطلقة) — رخيص وفعّال.
- استراتيجية البحث: البحث الشامل (كل المواضع) مثاليّ لكنه باهظ. خوارزميات سريعة (diamond/hexagon search) تقارب الأمثل بكسرٍ من الكلفة. هنا يقضي المرمّز معظم وقته.
- دقّة دون-بِكسلية (sub-pixel): الحركة الحقيقية ليست أعداداً صحيحة من البِكسلات. نستوفي (نصف/ربع/ثُمن بِكسل) فنطابق أدقّ — تحسّن كبير، أضافه H.264.
- أحجام بلوكات متغيّرة: بلوك كبير لمناطق متجانسة الحركة، صغير لحركة معقّدة (نظير quadtree في الصور).
تعويض الحركة = نموذج تنبّؤ: "أتنبّأ بهذا البلوك = نسخةٌ مزاحة من المرجع". الباقي (residual) هو خطأ التنبّؤ — وله إنتروبي منخفض، فيُمرَّر للتحويل والتكميم والمرمّز (العقدة ٠٣). هذا بالضبط انقسام نموذج/مرمّز من مسار الصور، لكن النموذج هنا زمنيّ. لاحظ التماثل مع intra-prediction المكاني (Paeth/الاتجاهي) — كلاهما تنبّؤ، أحدهما عبر المكان والآخر عبر الزمن.
متّجه الحركة لا يصف بالضرورة الحركة الفيزيائية الحقيقية للجسم — بل أرخص تطابق يقلّل التكلفة (الباقي + بِتّات المتّجه). قد يشير لمنطقة مشابهة صدفةً. من يخلط بينه وبين "تتبّع الأجسام" يُخطئ. (التتبّع الفيزيائي الحقيقي = التدفّق البصري، العقدة ٠٧ — وهو سؤال مختلف.)
- على إطارين متتاليين (من سلسلتك في العقدة ٠٠، أو فيديو حقيقي محوّل لإطارات رمادية): قسّم الإطار الحالي لبلوكات 16×16.
- لكل بلوك، نفّذ بحثاً شاملاً ضمن ±8 بِكسل في الإطار السابق بمقياس SAD. احفظ أفضل MV والباقي.
- قارن إنتروبي (الباقي + المتّجهات) مقابل إنتروبي (الفرق المباشر frame[t]−frame[t-1]) مقابل (الإطار الكامل). رتّبها — يجب أن يكون تعويض الحركة الأقل بفارق كبير على لقطات فيها حركة.
- قِس كلفة البحث: بدّل البحث الشامل ببحث "ثلاثي الخطوات" (three-step). كم تسارع الترميز؟ وكم خسرت من جودة التطابق؟ هذه مقايضة المرمّز الأبدية.
تعويض الحركة = تنبّؤ زمنيّ: لكل بلوك، خزّن متّجه حركة + باقياً صغيراً بدل البِكسلات. SAD، بحث سريع، دقّة دون-بِكسلية، أحجام متغيّرة. هذا قلب الفيديو ومصدر ضغطه الأسطوري. الآن لدينا "الباقي" منخفض الإنتروبي — ماذا نفعل به؟ نعامله تماماً كصورة: نحوّله ونكمّمه.