طريقة بسيطة ولكنها فعالة لتخزين سلسلة من التغييرات الصغيرة على الصورة؟

StackOverflow https://stackoverflow.com/questions/2550188

سؤال

لدي سلسلة من الصور. كل واحد عادة ما يكون (ولكن ليس دائمًا) مشابهًا للمنطقة السابقة ، مع تحديث 3 أو 4 مناطق مستطيلة صغيرة. أحتاج إلى تسجيل هذه التغييرات باستخدام الحد الأدنى من مساحة القرص.

لا يتم ضغط الصور المصدر ، لكنني أود ضغط Deltas.

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

أفكر في شيء على غرار:

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

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

هل هناك خوارزمية سهلة التنفيذ أو مكتبة جافا مجانية مع هذه الإمكانية؟

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

المحلول

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

نصائح أخرى

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

تخيل الصور بقيم بكسل التالية ...

0 0 0 1 1 1 2 2 3 3
0 0 1 1 0 0 1 1 2 2
0 0 1 1 0 0 0 1 1 2
0 0 1 1 0 0 0 1 1 2
0 1 1 0 0 3 0 0 1 1
0 1 1 0 0 3 0 0 1 1
0 0 1 1 0 0 0 1 1 2
0 0 1 1 0 0 0 1 1 2
0 0 0 1 1 1 1 1 0 2
2 2 2 2 2 1 1 2 2 2

...و...

0 0 0 1 1 1 2 2 3 3
0 1 1 1 0 0 1 1 2 2
0 1 2 4 0 0 0 1 1 2
0 1 2 3 0 0 0 1 1 2
0 1 1 0 0 3 0 0 1 1
0 1 1 0 0 3 0 0 1 1
0 0 1 1 0 3 3 2 1 2
0 0 1 1 0 3 3 2 1 2
0 0 0 1 1 2 2 2 0 2
2 2 2 2 2 1 1 2 2 2

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

    0 1 1 1 0 1 1 1 0 0

0   0 0 0 0 0 0 0 0 0 0
1   0 1 0 0 0 0 0 0 0 0
1   0 1 1 1 0 0 0 0 0 0
1   0 1 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
1   0 0 0 0 0 1 1 1 0 0
1   0 0 0 0 0 1 1 1 0 0
1   0 0 0 0 0 1 1 1 0 0
0   0 0 0 0 0 0 0 0 0 0

تعطينا بيانات الصف والعمود إرشادات حول المكان الذي قد يكون فيه مستطيلات ...

    0 1 1 1 0 1 1 1 0 0

0   0 0 0 0 0 0 0 0 0 0
1   0 ? ? ? 0 ? ? ? 0 0
1   0 ? ? ? 0 ? ? ? 0 0
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
1   0 ? ? ? 0 ? ? ? 0 0
1   0 ? ? ? 0 ? ? ? 0 0
1   0 ? ? ? 0 ? ? ? 0 0
0   0 0 0 0 0 0 0 0 0 0

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

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

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

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