بعد الانتهاء من إنشاء هندسة الويب الخاصة بنا على الويب الهزلي الجديد
Meow the Infinite ، قررت أن الوقت قد حان لكتابة بعض المقالات الفنية التي طال انتظارها. سوف تركز هذه المقالة على مرشح قمت بتطويره منذ عدة سنوات. لم تتم مناقشته مطلقًا في مجال ضغط الفيديو ، رغم أنه يبدو لي أنه يستحق القيام به.
في عام 2011 ، قمت بتطوير "مرشح نصف الحبة". هذا هو نوع خاص من الفلتر الذي يأخذ صورة واردة ويعرض بشكل مقنع أكثر كيف ستبدو الصورة عندما تحولت
بالضبط نصف بكسل .
ربما تتساءل لماذا قد تكون هناك حاجة إلى مثل هذا المرشح على الإطلاق. في الواقع ، فهي شائعة جدا في برامج الترميز الفيديو الحديثة. تستخدم برامج ترميز الفيديو عوامل تصفية مشابهة لالتقاط أجزاء من الإطارات السابقة واستخدامها في إطارات تالية. نقلت برامج الترميز الأقدم بيانات الإطار فقط بكسل كامل في وقت واحد ، لكن برامج الترميز الجديدة ذهبت إلى أبعد من ذلك وتسمح بتحول أفضل للحركات الصغيرة بمقدار النصف أو حتى بمقدار ربع بكسل.
عند تحليل سلوك خوارزميات تعويض الحركة في مرشحات halfpel التقليدية ، وجد
Jeff Roberts أنه عند تطبيقها مرارًا على إطارات متسلسلة ، فإنها تتحلل بسرعة ، مما يجبر أجزاء أخرى من ضاغط الفيديو على استخدام بيانات أكثر من اللازم لتصحيح الآثار. إذا قمت بتعطيل هذه التصحيحات ونظرت إلى النتائج "الأولية" لمرشح halfpel ، فهذه هي الصورة الأصلية:
يتحول إلى هذا:
ثانية واحدة فقط في وقت لاحق الفيديو. كما ينبغي ، يتم نقله إلى الجانب ، لأن كل إطار ينقل الصورة بمقدار نصف بكسل. لكن النتيجة لا تبدو كنسخة نازحة من الصورة الأصلية ، فهي مشوهة بشكل خطير.
خلال مرشح "فيديو ثانية واحدة" يتم تطبيقه فعليًا عدة مرات - 60 إذا تم تشغيل الفيديو على تردد 60 إطارًا في الثانية. لكن من الناحية المثالية ، نحن بحاجة إلى مرشحات مقاومة لمثل هذه التشوهات. إذا كان لدينا ، فلن يتم تشفير مقاطع الفيديو التمرير بسلاسة مع الكثير من تصحيحات القطع الأثرية ، والتي من شأنها أن تجعلها أقل ، أو أفضل ، أو كليهما.
إذا كنت معتادًا على مجال ضغط الفيديو ، فقد تتساءل لماذا نحتاج حتى إلى استخدام مرشح halfpel أكثر من مرة. في النهاية ، إذا طبقنا مرشح halfpel مرتين ، فسنقوم بالفعل بنقل بكسل واحد كامل ، فلماذا لا نستخدم البيانات من إطارين فقط ونستعيدها؟
الجواب ليس بهذه البساطة. أولاً ، كلما زاد عدد البيانات التي نحتاج إليها لتشفير البيانات ، قل الضغط الذي نحصل عليه. لذلك ، إذا بدأنا في الترميز دون الحاجة إلى الكثير من البيانات مثل "من أي إطار إلى أخذ البيانات" ، فلن يتم ضغط الفيديو بشكل جيد للغاية.
ولكن هذا ليس هو الأهم. المشكلة الرئيسية هي أنه إذا كنا بحاجة إلى أخذ المعلومات من الإطارات السابقة ،
فسوف يتعين علينا
تخزينها . للاحتفاظ بالإطارين السابقين ، بدلاً من الإطار ، يجب عليك تخمين أن لديك ضعف الذاكرة. بالنسبة لوحدات المعالجة المركزية الحديثة ، هذه ليست مشكلة خاصة ، فهي تحتوي على الكثير من الذاكرة ولا تزعجها هذه التافهة. ولكن هذه
مشكلة بالنسبة لك إذا كنت ترغب في إنشاء تنسيق فيديو سريع ومحمول يستخدم على نطاق واسع والذي يجب أن يعمل في الأجهزة التي تحتوي على كمية صغيرة من الذاكرة (الهواتف المحمولة ، والإلكترونيات المدمجة ، وما إلى ذلك).
نحن في الحقيقة لا نريد تخزين عدة إطارات من أجل التعويض عن الحركة فقط حتى لا نستخدم مرشح halfpel. لذلك ، تلقيت تعليمات لمعرفة ما يحدث بالضبط هنا ومعرفة ما إذا كان يمكنني إنشاء عامل تصفية لا يحتوي على مثل هذه المشكلات.
قبل ذلك ، لم أعمل مطلقًا مع المرشحات ولم يكن لدي أي فكرة عن كيفية تطويرها. من الغريب أن هذا الأمر كان في صالحي ، لأنه كان عليّ أن أنظر إلى هذه المشكلة دون تحيز.
الأساسيات
لقد أدركت بسرعة أن مرشحات halfpel الأكثر شيوعًا لها بنية مماثلة: لكل بكسل في صورة المخرجات ، يتم التقاط 2 إلى 8 بكسل من صورة الإدخال ، والتي يتم أخذ عينات منها ومزجها معاملات معينة. تختلف عوامل التصفية المختلفة فقط في عدد وحدات بكسل مصدر العينة (غالبًا في لغة مطوري برامج التصفية الذين يطلق عليهم اسم tap) وعوامل خلط البكسل. غالبًا ما تسمى هذه المعاملات "عامل تصفية عامل التصفية" وهذا كل ما هو مطلوب لوصف عامل التصفية بالكامل.
إذا كنت معتادًا على أي نوع من أخذ العينات أو إعادة تشكيل الصور (على سبيل المثال ، تحجيم الصور) ، فيجب أن يكون ذلك واضحًا لك. أساسا ، المرشحات تفعل الشيء نفسه. نظرًا لأن ضغط الفيديو هو مساحة شاسعة تُجرى فيها دراسات مختلفة ، فمن الواضح أن هناك العديد
من الطرق
الأخرى للتعويض عن الحركة بخلاف التصفية البسيطة. لكن برامج الترميز الشائعة عادةً ما تستخدم إجراءات تعويض الحركة مع مرشحات halfpel ، والتي تتطابق بشكل أساسي مع مرشحات تغيير حجم الصور: فهي تأخذ فقط وحدات البكسل الأصلية ، وتضاعفها ببعض الأوزان ، وتضيفها وتحصل على وحدات بكسل الإخراج.
الحاجة إلى "الحدة"
لذلك ، نحن بحاجة إلى تحويل الصورة بمقدار نصف بكسل. إذا كنت مبرمج رسومات ، لكنك لست معتادًا بشكل خاص على التصفية ، فقد تعتقد: "لدي مشكلة أيضًا ، استخدم فقط مرشح bilinear." هذه عملية قياسية في التعامل مع الرسومات ، عندما نحتاج إلى حساب القيم الوسيطة بين عنصري بيانات واردة ، كما يحدث هنا.
يمكن بسهولة وصف مرشح ثنائي الخط لنقل نصف البكسل بسهولة من خلال قلب المرشح التالي:
هذا سوف يعمل ، ولكن ليس من دون مشاكل. إذا كان هدفك هو الحصول على صور عالية الجودة ، وفي حالة ضغط الفيديو ، فإن الهدف هو ذلك تمامًا ، فالمرشح ذو الخطوط الثنائية ليس هو الحل الأفضل ، لأنه يضيف المزيد من الغموض إلى النتيجة أكثر من اللازم. ليس
كثيرًا ، ولكن
أكثر من المرشحات الأخرى التي تنشئها.
لإظهار ذلك بوضوح ، إليك صورة تقريبية لعين الفظ من الصورة الأصلية بعد تطبيق واحد للمرشحات الأكثر شيوعًا:
على اليسار هو الأصلي ، على اليمين هو تصفية خطية. بينهما هي المرشحات halfpel الأكثر استخداما من برامج الترميز الفيديو. إذا نظرت عن كثب ، يمكنك أن ترى أن جميع الصور تقريبًا تبدو متشابهة ،
باستثناء صورة ثنائية الخط ، وهي أكثر ضبابية بقليل. على الرغم من عدم وجود الكثير من الضبابية ، إذا كان هدفك الرئيسي هو جودة الصورة ، فهذا يكفي لتفضيل مرشح مختلف على مرشح bilinear.
فكيف "تحافظ" المرشحات الأخرى على الحدة وتجنب التشويش؟ دعنا نتذكر كيف يبدو جوهر التشوش الثنائي:
BilinearKernel[] = {1.0/2.0, 1.0/2.0};
انها بسيطة جدا. لتحويل الصورة بمقدار نصف بكسل ، نأخذ بكسل ونمزجها بنسبة 50٪ مع جارتها. هذا كل شيء. يمكن للمرء أن يتخيل كيف "يطمس" هذه الصورة ، لأنه في تلك الأماكن التي يكون فيها البيكسل الأبيض الساطع مجاورًا للأسود الداكن ، يتم حساب متوسط هذين البيكسلين أثناء التصفية الثنائية ، مما يؤدي إلى إنشاء بيكسل رمادي "يخفف" الحدود. يحدث هذا مع كل بكسل ، لذلك حرفيًا في كل منطقة يوجد فيها اختلاف واضح في اللون أو السطوع. خففت.
هذا هو السبب في الترميز الخطي عالي الجودة في برامج الترميز لا يستخدم للتعويض عن الحركة (على الرغم من أنه يمكن استخدامه في حالات أخرى). بدلاً من ذلك ، يتم استخدام المرشحات للحفاظ على الحدة ، على سبيل المثال ، مثل:
كما ترون ، حيث أخذ الترشيح الثنائي في الاعتبار فقط بكسلين ، تأخذ هذه المرشحات في الاعتبار ستة (h.264) أو حتى ثمانية (HEVC) بكسل. بالإضافة إلى ذلك ، فهي لا تحسب فقط القيم المتوسطة المرجحة المعتادة لهذه البيكسلات ، ولكنها تستخدم الأوزان
السالبة لبعض البيكسلات
لطرح هذه البيكسلات من قيم أخرى.
لماذا يفعلون هذا؟
في الواقع ، ليس من الصعب فهم ذلك: باستخدام القيم الإيجابية والسلبية ، وكذلك النظر في "نافذة" أوسع ، فإن المرشح قادر على أن يأخذ في الاعتبار
الفرق بين البكسلات المتجاورة ومحاكاة حدة أقرب بكسلين بالنسبة إلى أبعد جيرانهما. يتيح لك ذلك الحفاظ على حدة الصورة الناتجة في تلك الأماكن التي تختلف فيها البيكسلات بشكل كبير عن جيرانها ، وفي نفس الوقت ، لا يزال يتم استخدام المتوسط لإنشاء إزاحة "نصف بكسل" معقولة ، والتي يجب أن تعكس بالضرورة مجموعة البكسل من الصورة الواردة.
تصفية غير مستقرة
لذلك ، هل تم حل المشكلة؟ نعم ، هذا ممكن ، لكن إذا كنت بحاجة فقط إلى إزاحة نصف بكسل واحدة. ومع ذلك ، فإن عوامل التصفية "الحادة" هذه (وأنا أستخدم هذا المصطلح هنا عن قصد) تفعل فعلًا شيءًا خطيرًا ،
يشبه بشكل أساسي ما يفعله الترشيح الثنائي الخط. هم فقط يعرفون أفضل لإخفاء ذلك.
حيث
يقلل الترشيح الثنائي الخطي
من وضوح الصورة ، فإن هذه المرشحات القياسية تزيدها ، مثل عملية التوضيح في بعض برامج الرسومات. مقدار التوضيح صغير جدًا ، لذلك إذا قمنا بتنفيذ الفلتر مرة واحدة فقط ، فلن نلاحظ ذلك. ولكن إذا تم إجراء التصفية عدة مرات ، فقد يصبح هذا ملحوظًا جدًا.
ولسوء الحظ ، نظرًا لأن هذا التوضيح أمر إجرائي ويعتمد على الفرق بين البيكسلات ، فإنه
ينشئ حلقة ملاحظات ستستمر في زيادة حد الحدود مرارًا وتكرارًا حتى تدمر الصورة. يمكنك إظهار ذلك بأمثلة محددة.
أعلاه - الصورة الأصلية ، أدناه - مع تصفية ثنائية الخط ، تم تنفيذها على 60 إطارًا:
كما قد تتوقع ، يستمر التمويه ببساطة في تقليل حدة الصورة حتى تصبح ضبابية تمامًا. الآن سيكون الأصل في الأعلى ، ومرشح halfpel الترميز h.264 الذي سيتم تشغيله لـ 60 إطارًا في الأسفل:
ترى كل هذا القمامة؟ فعل المرشح نفس التأثير "الضبابي" للترشيح الخطي ، لكن
العكس - زاد "حدة الصورة" بحيث أصبحت جميع الأجزاء التي تحولت فيها التفاصيل إلى أنماط ضوئية / داكنة مشوهة بشدة.
هل يتصرف برنامج الترميز HEVC باستخدام 8 بكسل بشكل أفضل؟ حسنًا ، إنها بالتأكيد أفضل من h.264:
ولكن إذا قمنا بزيادة الوقت من 60 إطارًا (ثانية واحدة) إلى 120 إطارًا (ثانيتان) ، فسوف نرى أنه توجد ملاحظات وتدمير الصورة:
من أجل أولئك الذين يحبون معالجة الإشارات ، سأضيف عامل تصفية ذو إطارات نافذة (يُسمى مرشح Lanczos) كمرجع:
لن أشرح في هذا المقال لماذا قد يكون شخص ما مهتمًا بـ "windowed sinc" ، لكن يكفي أن أقول إن هذا الفلتر شائع لأسباب نظرية ، لذلك انظر كيف يبدو عند معالجة 60 إطارًا (ثانية واحدة):
وعند معالجة 120 لقطة (2 ثانية):
أفضل من h.264 ، وحوالي نفس HEVC.
تصفية مستقرة
كيف يمكننا تحقيق نتائج أفضل من h.264 ، HEVC و windowed sinc؟ وكيف يمكن أن يكون أفضل بكثير؟
كنت
أتوقع أن أرى أسئلة مماثلة في الأدبيات الخاصة بضغط الفيديو ويجب أن تكون معروفة جيدًا لمتخصصي الضغط ، لكن في الواقع (على الأقل لعام 2011) لم أجد أي شخص صرح على الأقل بأن هذه مشكلة. لذلك اضطررت للتوصل إلى حل وحيد.
لحسن الحظ ، فإن بيان المشكلة بسيط للغاية: قم بإنشاء عامل تصفية يمكن تطبيقه عدة مرات قدر الإمكان حتى تظهر الصورة بنفس الشكل كما في البداية.
أسمي هذا التعريف "تصفية مستقرة" لأنه ، في رأيي ، يمكن اعتباره خاصية تصفية. يكون المرشح "مستقرًا" إذا لم يقع في حلقة التعليقات الخاصة به ، أي أنه يمكن تطبيقه بشكل متكرر دون إنشاء قطع أثرية. يعد المرشح "غير مستقر" إذا كان يخلق قطع أثرية يتم تضخيمها عن طريق الاستخدام المتكرر وتدمير الصورة في النهاية.
أكرر ، لا أفهم لماذا لا يتم تناول هذا الموضوع في الأدبيات الخاصة بأدوات ترميز الفيديو أو معالجة الصور. ربما يستخدم مصطلحات مختلفة ، لكنني لم أتقابلها. مفهوم "ردود الفعل" راسخ في مجال العمل مع الصوت. ولكن ليست قضية مهمة في معالجة الصور. ربما لأنه عادة ما ينبغي تطبيق المرشحات مرة واحدة فقط؟
إذا كنت متخصصًا في هذا المجال ، فمن المرجح أن يكون لدي رأي حول هذا الموضوع ، وربما كنت أعرف هذه الأشكال من الأدب المتخصص حيث توجد بالفعل حلول لهذه المشكلة ، معروفة لدى قلة. ولكن ، كما قلت في بداية المقال ، لم أتمكن مطلقًا من إنشاء فلاتر من قبل ، لذلك قمت بالبحث فقط في مقالات معروفة جيدًا (على الرغم من أنه من الجدير بالذكر أن هناك شخصًا واحدًا على الأقل معروف في الأدب لم يسمع أي شيء مثل هذا أيضًا ).
لذلك ، أخبروني في الصباح أننا نحتاج إلى هذا الفلتر ، وحاولت إنشاءه طوال اليوم. كانت مقاربي بسيطة: لقد أنشأت برنامجًا نفذ المرشح مئات المرات ، وفي النهاية أنتجت صورة حتى أتمكن من رؤية نتيجة عمليات التشغيل الطويلة. ثم جربت معاملات مرشح مختلفة ولاحظت النتائج. كانت حرفيا تجربة اتجاهية وعملية خطأ.
بعد حوالي ساعة ، التقطت أفضل معاملات التصفية المناسبة لهذه المهمة (لكن كان بها عيب واحد ، والذي سأناقشه في الجزء الثاني من المقالة):
MyKernel[] = {1.0/32.0, -4.0/32.0, 19.0/32.0, 19.0/32.0, -4.0/32.0, 1.0/32.0};
هذا جوهر هو على وشك شحذ وعدم وضوح. نظرًا لأن الحدة تؤدي دائمًا إلى ردود فعل تخلق أشكالًا حية وواضحة ، فإن هذا المرشح الأساسي يفضل قليلاً من الضبابية بحيث تبدو الصورة "مملة" قليلاً.
هذا هو كيف يبدو بعد 60 لقطة. كمرجع ، لقد عرضت جميع المرشحات بهذا الترتيب: الصورة الأصلية (بدون تصفية) ، المرشح الخاص بي ، الخط الثنائي ، Lanczos ، h.264 ، HEVC:
كما ترون ، فإن المرشح الخاص بي يعطي نتائج ضبابية أكثر قليلاً من المرشحات الحادة ، لكن ليس به آثار حادة غير مقبولة بعد 60 إطارًا. ومع ذلك ، قد تفضل القطع الأثرية الضبابية لشحذ القطع الأثرية ، حتى تتمكن من الاختيار بين أفضل مرشح لشحذ (Lanczos) ومنجم. ومع ذلك ، إذا قمنا بزيادة الرقم إلى 120 إطارًا ، فسيكون المرشح خارج المنافسة:
بعد 300 إطار ، تصبح جميع المرشحات ، باستثناء بلدي ، مزحة سيئة:
بعد 600 إطار ، تصبح النكتة أكثر قسوة:
ليس عليك أن تقول ما يحدث بعد 900 إطار:
كيف مستقرة هو؟
في هذه المرحلة ، من الطبيعي أن نتساءل: هل الفلتر مستقر
حقًا ، أم أنه مجرد بطء شديد البطء ، أبطأ بكثير من الترشيح الثنائي الخط؟ ربما بعد الآلاف من التكرار ، فإن مرشح بلدي طمس الصورة
تدريجيا ؟
والمثير للدهشة أن الإجابة تبدو سلبية. على الرغم من إضافة القليل من التمويه على مدار حوالي مائة من التراكبات الأولى ، يبدو أن المرشح
يتحول إلى تمثيل ثابت للصورة ، والذي
لا يتحلل
أبدًا . إليكم صورة أخرى مكبرة لعين الفظ:
من اليسار إلى اليمين: الصورة الأصلية ، طبق الفلتر 60 مرة و 120 مرة و 300 مرة و 600 و 900 مرة. كما ترون ، تتحول الضبابية إلى حالة مستقرة ، والتي لم تعد تتحلل حتى بعد مئات الطبقات المتراكبة. على النقيض من ذلك ، قارن ذلك بالمزامنة ذات الإطارات لنفس العدد من العينات (انقر فوق) ، وانظر إلى أي مدى (وبسرعة!) تشكل القطع الأثرية ردود الفعل وإنشاء نتيجة غير مجدية:
يبدو الفلتر مستقرًا جدًا ، ومقارنة بجميع المرشحات التي رأيتها ، فإنه يخلق أفضل النتائج بعد الاستخدام المتكرر. يبدو أن لها خاصية "مقاربة" معينة ، حيث تتحول البيانات بسرعة إلى صورة ملساء (محدودة) ، ثم يتم حفظ هذه الصورة الملساء ولا تؤدي إلى تدهور غير محدود لاستكمال البيانات المهملة.
حتى أنني حاولت تطبيق المرشح
مليون مرة ، ويبدو أنه بعد المئات من التراكبات القليلة الأولى ، لا تتحلل أكثر. بدون تحليل رياضي أفضل (ولم أجد بعد حلًا رياضيًا يمكن أن يثبت ذلك تمامًا ، لكنني أعرف بالتأكيد أنه في مكان ما) ، لا أستطيع أن أقول بكل تأكيد أنه في مكان ما بعد مليارات أو تريليونات من التراكبات التي من لن يكسر. ضمن اختبار معقول ، لم أتمكن من اكتشاف مزيد من التدهور.
هل هو أفضل مرشح Halfpel مستقر لستة صنبور؟
في هذه المرحلة ، سيكون من المنطقي طرح السؤال: هل هذا حقًا أفضل ما يمكن العثور عليه؟ يخبرنا Intuition أنها ليست كذلك ، لأنني لم أكن أعرف على الإطلاق عن تطوير المرشحات ولم أكن أنظر إلى المؤلفات تقريبًا ، لقد التقطت هذا المرشح في غضون ساعة واحدة فقط. على الأقل يمكن
افتراض أنه بعد مثل هذه الدراسة المختصرة ، لم أكن لأجد مرشحًا رائعًا قهرًا كبيرًا.
هل هذا الافتراض صحيح؟ وإذا كان هذا صحيحًا ،
فما هو أفضل مرشح نهائي؟ سأناقش هذا بمزيد من التفصيل في الجزء الثاني من المقال.