سؤال

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

هل هناك خوارزمية بسيطة يمكنني استخدامها لضغط بيانات البكسل بلا خاسرة؟

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

تحديث: منصتي هي FPGA

هل كانت مفيدة؟

المحلول

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

نصائح أخرى

كم عدد الموارد التي لديك على نظامك المضمن؟

هل يمكنك المنفذ زلب وهل ضغط GZIP؟ حتى مع موارد محدودة ، يجب أن تكون قادرًا على نقل شيء ما LZ77 أو LZ88.

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

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

ضع في اعتبارك أنه إذا كان لديك كل البكسلات السابقة ، فلديك معلومات أكثر صلة من البكسل السابق. أي إذا كنت تحاول التنبؤ بقيمة X ، فيجب عليك استخدام البكسلات:

..OOO ...
..ثور

أيضًا ، لن ترغب في استخدام البكسل السابق ، B ، في الدفق للتنبؤ X في الموقف التالي:

oo ... b <- نهاية الصف
x <- بداية الصف القادم

بدلاً من ذلك ، ستجعل قاعدة التنبؤ الخاصة بك على نظام التشغيل.

كيف "خسارة" تحتاج؟
إذا كان هذا هو الماسح الضوئي الحقيقي ، فهناك حد لعرض النطاق الترددي/الدقة ، لذلك حتى لو كان بإمكانه إرسال قيم +/- 64 كيلو ، فقد يكون من غير المساواة بالنسبة للبكسلات المجاورة أن يكون لها اختلاف أكثر من 8 بتات.

في هذه الحالة ، يمكنك القيام بقيمة Pixel START لكل صف ثم القيام باختلافات بين كل بكسل.

سيؤدي ذلك إلى تشويه القمم ، لكن قد يكون أي قمم أكثر من "n'bits ضوضاء على أي حال.

يمكن أن تحصل Hybrid LZ77/RLE جيدة مع أجراس و Whistles على ضغط رائع سريع إلى حد ما في الضغط. ستكون أيضًا ضواغطًا أكبر ، على ملفات أصغر بسبب نقص المكتبة. من أجل جيد ، ولكن تبرع GPLD لهذا ، تحقق من pucrunch

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top