Fractal image compression

Fractal image compression هو تطبيق مثير للنظرية الكسورية، وخاصة في ضغط الصور.

الوصف

مع هذا التطبيق، يمكنك:

  • ضغط الصور مع هذه الطريقة كسورية
  • فك ضغط الصور المضغوطة مسبقًا بتنسيق مختلف

الاستفادة من مكتبات المنصة، والتي تشمل الميزات التالية:

  • متعدد اللغات
  • شكلي متعدد الدقة التكبير
  • خيار الوضع المظلم
  • إشعار الإصدار الجديد


الايجابيات:

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


سلبيات:

  • عملية الضغط بطيئة للغاية
  • لا تحقق نسب ضغط عالية جدًا (على الأقل مع المعلمات التي استخدمتها)

وصف الكود

إنه تنفيذ لهذا الأمر.fractal image compression خوارزميةنشرت في IEEE خلال أيام جامعتي

يستخدم التطبيق مكتبة Delaunay التثليث التدريجي ، والذي يستخدم أيضا فيتطبيق Morphing


خوارزمية عالية المستوى:

  • ضغط:
    • يركز الضغط الكسري على تخزين العلاقات بين مناطق الصورة بدلاً من قيم البكسل الفعلية ، وتحديدًا بين المثلثات في هذه الحالة.
    • تنقسم الصورة إلى شبكة ثلاثية تتكون من مثلثات متعددة ، تشكل مجالًا ثلاثيًا.
    • تنقسم الصورة إلى مجموعة جديدة من التثليثات التي تضم مثلثات أكبر مخصصة لكتاب التعليمات البرمجية.
    • التثليثات ديناميكية ، ويتم تطبيق خوارزمية الانقسام والدمج بناءً على تباين بكسل المثلث.
    • بمجرد تحديد التثليث لكتاب التعليمات البرمجية ، يتم اختيار المثلثات الأكثر تمثيلاً 2 n لتشكيل كتاب التعليمات البرمجية. تؤثر قيمة n بشكل كبير على وقت الضغط بينما يكون لها تأثير بسيط على نسبة الضغط والجودة المحققة.
    • لكل مثلث نطاق ، يتم البحث عن التعيين الأمثل مع مثلث من كتاب التعليمات البرمجية باستخدام معيار الحد الأدنى لمتوسط الخطأ التربيعي (MSE)
    • تم العثور على رسم الخرائط الأمثل بين المثلثات عن طريق صنع مجموعات من:
      • تبديل القمم (6 احتمالات)
      • تحديد تعويض للمتوسط
      • إيجاد عامل مقياس بين 0 و 1 ، والذي يتم تطبيقه على الانحراف عن المتوسط. يجب أن يظل عامل المقياس هذا بين 0 و 1 لمنع الاختلاف أثناء عملية إزالة الضغط التكراري
      بالإضافة إلى ذلك ، يجب تحديد هذه المعلمات باستخدام عدد محدود من البتات لضمان أن يكون كل من وقت الضغط والنسبة معقولين ومتوافقين مع الجودة المطلوبة.
  • المعلومات المخزنة في الملف المضغوط لكل قناة:
    • المعلومات لإعادة إنتاج التثليثين:
      • المثلثات التي تنقسم في كل تكرار
      • القرح التي تمت إزالتها نتيجة للدمج (بعد الانتهاء من التكرارات المقسمة)
    • اختيار مثلثات 2n من كتاب التعليمات البرمجية
    • رسم الخرائط الأمثل لكل مثلث مجال:
      • مثلث الترميز الذي يستخدمه لرسم خريطة (n بت)
      • تبديل الرأس الأمثل (6 مجموعات ، 3 بت)
      • أوفست (يشير المؤلفون إلى أن الإزاحة ممثلة بشكل فعال مع 6 بت)
      • مقياس (يشير المؤلفون إلى أن المقياس يتم تمثيله بفعالية مع 6 بت)
  • تخفيف الضغط (لكل قناة):
    • يتم الحصول على مثلثات المثلثين.
    • يتم الحصول على مثلثات الشفرات.
    • وتتكرر هذه العملية حتى يتحقق التقارب:
      • تعيين جميع مثلثات المجال إلى التناظر الأمثل مع مثلثات كتاب التعليمات البرمجية


بعد حصوله على درجة الماجستير في الذكاء الاصطناعي، وأنا أتصور ابتكار كيفية استخلاص مثلثات أهم لكتاب التعليمات البرمجية من خلال تطبيق K-ميدويدس.

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


يتم تقسيم معالجة الصور إلى قنوات ، وعادة ما تكون RGB.

يستخدم Multiprocessing ، مع موضوع واحد مخصص لكل قناة.


مع الإصدار v1.1 ، تمت إضافة قارئ متوافق مع معيار ImageIO.

لذلك ، يمكنك فتح صورة مضغوطة (.dfc) مع التطبيق ببساطة عن طريق القيام بما يلي:

BufferedImage image = ImageIO.read("image.dfc");

ويندوز

Fractal image compression v1.0 (2022-2024)

مشاهدة vdeo
تحميل

Fractal image compression v1.1 (2026)

تحميل

إصدارات الإصدار

image

يقوم التطبيق بتنفيذ خوارزمية fractal image compression موصوفة في ورقة IEEE من أيام جامعتي. وهو يعتمد على تثليث Delaunay وترميز كتلة.

تعاونت مع زميل جامعي لتطوير النسخة الأولية من هذه الخوارزمية خلال فترة تدريب للدورة الأخيرة من Teleco Television (الخطة 64 لبرشلونة).

كان الإنترنت لا يزال في مراحله الأولى، وأي تقدم يعتمد كليا تقريبا على الجهود الفردية والوثائق المادية.

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

الآن، بعد 25 سنة، أقدم لكم هذا التطبيق الجديد للخوارزمية، تم تطويره بالكامل وإكماله في وقت قياسي من أسبوعين.

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

هذه المرة باستخدام مكتبة تثليث Delaunay مبرمجة من قبل المهنيين.

من الواضح أنه عندما لا تضطر إلى صنع الطوب بنفسك ، كلما كان بإمكانك بناء الجدران بشكل أسرع...


فيديو مظاهرة

image

الميزة الجديدة في الإصدار v1.1 هي إضافة قارئ صور مضغوط كسوري داخل التطبيق متوافق مع ImageIO.

لذلك ، يمكنك قراءة صورة مضغوطة (.dfc) مع التطبيق على النحو التالي:


BufferedImage image = ImageIO.read("image.dfc");


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

لكن النتيجة ليست سيئة على الإطلاق.

ومع ذلك ، نظرًا لوقت المعالجة الطويل اللازم للانضغاط ، فإن هذا النوع من الضغط وتنفيذه في التطبيق له أهمية أكاديمية فقط.


2026/05/04 - 2026/12/04 - 2026/12/04 . بعد استعادة تطور هذا التطبيق ، أقترح إجراء اختبارات مع صور حقيقية ، وأحاول ذلك باستخدام واحد من "4000 3000" بكسل.

أواجه العديد من المشاكل:

  • تستغرق العملية إلى الأبد في التكرارات المقسمة (بسبب التثليثات الواسعة التي تصل إلى 400،000 مثلث ، وأن فحص حالة الانقسام تكرر لجميع المثلثات في كل تكرار)
  • تنفد الذاكرة بعد الوصول إلى حد 23 غيغابايت الذي كان لدي على نظامي. لأن:
    • تم تخزين نتيجة الانقسام ودمج التكرارات في قائمة منطقية (حوالي 16 تكرارًا نوعين من التثليث 3 قنوات 400،000 عنصر!!!!!). وهذا يجعل ما مجموعه حوالي 40،000،000 عنصر ، وهو أمر لا يزال مقبولًا)
    • بالإضافة إلى ذلك ، تم اختيار كتاب المثلثات الأكثر تمثيلاً (مجموعة إلى 256) باستخدام K-medoids (أكثر من عناصر 400,000) (أعتقد أن الذاكرة المستخدمة بواسطة هذه الخوارزمية هي O (n 2). الآن هو الخروج عن السيطرة...)
    • ولمزيد من INRI ، تم إجراء هذه الحسابات بالتوازي مع القنوات الثلاث (rgb)!!
  • بمجرد حل هذه المشاكل ، تمكنت من ضغط الصورة (4000 3000) ، لكنني أرى أن الأمر يستغرق ما بين 6 و 8 ساعات لإكمال العمل.

وأقترح حلها:

  • من أجل الأبدية من الانقسامات. الحل:
    • أقوم بزيادة الحد الأدنى لحجم المثلثات للتقسيم ، بطريقة تدريجية تتناسب مع عدد وحدات البكسل في الصورة. مما أدى إلى انخفاض في عدد المثلثات في المثلثات. في الصورة المستخدمة (4000 3000) يتم تقسيم عدد المثلثات على أكثر من 4 (ذهبنا من حوالي 400،000 مثلث إلى حوالي 100،000 مثلث).
    • بالإضافة إلى ذلك ، أقوم بإنشاء مجموعة مع المثلثات التي لا تفي بمعيار الانقسام (بالنسبة إلى تباين قيم وحدات البكسل الخاصة بها) ، حتى لا أكررها في كل تكرار. الآن يطير!!
  • النظام ينفذ من الذاكرة. الحل:
    • نتيجة الانقسامات والدمج المحفوظة في القوائم المنطقية. الحل:
      • مع تقدم التكرارات المقسمة ، يكون عدد المثلثات التي تنقسم أصغر بشكل جذري ، ويتم حفظ الذاكرة المستخدمة عن طريق تخزين مؤشرات المثلثات التي تنقسم في مجموعة.
    • ذاكرة K-medoids (يفترض O (n 2)). الحل:
      • بما أننا قسمنا عدد المثلثات على 4... ، الذاكرة اللازمة لتلك الخوارزمية ، فإن هذا التخفيض للمثلثات ينطوي على قسمة الذاكرة المستخدمة على عامل يبلغ حوالي 16.
      • ثلاثة K-medoids بالتوازي (واحد لكل قناة). الحل:
        • نقوم بتسلسل حسابات التثليث واختيار المثلثات الأكثر تمثيلًا لكتاب التعليمات البرمجية (مع K-medoids).
      • لقد قسمنا الذاكرة اللازمة لـ K-medoids من 48!!
  • يستغرق وقت المعالجة مع الصور "الحقيقية" إلى الأبد (يستغرق ضغط صورة المثال ما بين 6 و 8 ساعات) مع 3 خيوط ، واحدة لكل قناة. الحل:
    • جعل عدد من المواضيع شكلي. (من خلال تكوينه إلى 23 المواضيع (نظام بلدي لديه 24 النوى)، يتم تقليل وقت المعالجة إلى ثلاث ساعات ونصف).
  • آثار الحل:
    • من الواضح أن تأثير قسمة عدد المثلثات على 4 يؤدي إلى خسارة ملحوظة في جودة الصورة المضغوطة. ولكن مع الكثير من الدقة ، ليس من المهم.
    • عند قسمة عدد المثلثات على 4 ، فإنه يؤدي أيضًا إلى تقسيم حجم الملف المضغوط ، من المفترض أيضًا أن يكون من ترتيب 4.

وأهدف أيضًا إلى محاولة تقليل حجم الملف المضغوط إلى الحد الأدنى ، وإعادة تنظيم المعلومات المراد تخزينها.

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

أنا وضع خوارزمية في محاولة لتقليل حجم اللازمة لتخزين كل من تلك مجموعات الفهرس.

أعتقد أنه لا يضيع... إذا كنت فضوليًا على هذا الموقع أقول النقاط الرئيسية التي اعتمدت عليها.

على الرغم من أنه ربما كان من الأجدر البحث عن ضاغط عام بدون خسارة مثل zip أو 7z وتطبيقه على عالمية الملف المضغوط... ربما في المرة القادمة.


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

باستخدام هذا التطبيق الجديد الصغير على زوج من الملفات مع الترميز الأصلي (واحد من 143 143 وآخر من 4000 3000) ، يتم تقليل حجم الملف المضغوط بحوالي 4٪ فيها.

فيديوهات

التنزيلات