
إنَّ الحمد لله نحمدهُ ونستعينهُ ونستغفره ونستهديهِ ونعوذ باللهِ من شرور أنفسنا وسيئات أعمالنا،
من يهدهِ اللهُ فلا مضلَّ له، ومن يضلل فلا هادي له، وأشهد أن لا إله إلا الله وحده لا شريك له،
وأشهد أنَّ محمداً عبده ورسوله .
تحية طيبة وبعد ..

المقصود من ضغط الصور هو تقليص عدد البتات المحجوزة لتمثيل كل نقطة من الصورة (bits par pixel) من أجل تخزينها أو إرسالها عبر الشبكة, و هذا باستغلال تكرار نفس الألوان داخل الصورة. يتم التفريق بين تقنيات الضغط حسب فعاليتها في الضغط, هناك طرق للضغط بدون فقدان معلومات وهناك أخرى للضغط مع فقدان بعض المعلومات.
يتم تمثيل الصور الرقمية الملونة بمصفوفة ذات بعدين من النقاط و كل نقطة يحجز لها ثلاث بايتات, بايت للون الأحمر (Red), بايت للون الأخضر (Green) و آخر للون الأزرق (Blue) و نعبر عن الثلاثة بـ RGB.

512x512x3(RBG)=768KOctets
إذا, من أجل صورة ملونة لها الأبعاد 512x512 نحصل على ملف بحجم 768 كيلو بايت, و إذا افترضنا أنه لدينا فيديو متكون من 16 صورة فقط سيكون حجمه مساويا لـ 768 x 16 و هذا يعطينا ملف فيديو بحجم 12 M bytes !!!, لذلك سنحتاج إلى ضغط تلك الصورة من أجل تقليص حجم الملف و تسريع نقلها.
التعرف على JPEG:
JPEG هو عبارة عن معيار قرر في 1980, يعتمد في ضغط الصور على TCD (Transformation de cosinus discrète) مطبق على كتل من 8x8 بيكسل (البيكسل هي النقطة من الصورة -pixel-), يمكن تمثيل مبدأ هذا الألغوريتم كما يلي:

لنلقي نظرة سريعة على مراحل JPEG:
1. Décomposition en blocs 8x8:
التقسيم في حد ذاته يعد من أحد المشاكل, هل نقسم إلى 16x16 أو 8x8 أو غيرهما, نحتاج إلى التقسيم لأن التحويل TCD يعتمد في حسابه لكل عنصر من المصفوفة على باقي عناصر المصفوفة و لذلك فإنه كلما كبرت المصفوفة استغرق الحساب وقتا أكثر و لذلك قررت لجنة JPEG التقسيم إلى 8x8, و سنرى لاحقا ايجابيات و سلبيات زيادة حجم التقسيم.
2. Transformation TCD:
هذا التحويل هو مفتاح ألغوريتم JPEG, وهذا التحويل عكسي طبعا, و سنستعمل التحويل العكسي في عملية توليد الصورة الأصلية انطلاقا من الملف المضغوط, نرمز إلى التحويل العكسي بـ TCDI.
تحويل TCD لمصفوفة معينة يتم بتطبيق الصيغة التالية على كل عناصر المصفوفة للحصول على مصفوفة TCD:

من أجل:
X(i, j) مصفوفة البكسالات الأصلية بحجم 8x8.
TCD(u, v) المصفوفة الناتجة من التحويل TCD.
ونطبق تلك الصيغة باستعمال قطعة كهذه من الكود:
for ( i = 0 ; i < N ; i++ )
for ( j = 0 ; j < N ; j++ ) {
temp = 0.0;
for ( x = 0 ; x < N ; x++ )
for ( y = 0 ; y < N ; y++ ) {
temp += Cosines[ x ][ i ] *
Cosines[ y ][ j ] *
pixel[ x ][ y ];
}
temp *= sqrt( 2 * N ) * Coefficients[ i ][ h ];
DCT[ i ][ j ] = INT_ROUND( temp );
}و كمثال:

المصفوفة X للبكسلات الأصلية

المصفوفة TCD الناتجة
أما التحويل العكسي TCDI فيتم باستعمال الصيغة التالية:

طبعا بتطبيق الصيغة TCDI على المصفوفة TCD سنحصل على المصفوفة الأصلية X.
3. Quantification:
هذه المرحلة هي التي تعطي صفة الضغط مع فقدان المعلومات للـ JPEG, و لكن و بما أننا نتعامل مع الصور فانه و حتى مع فقدان بعض المعلومات فإن العين المجرد لن تلاحظ ذلك و ستظهر الصورة بدون تشويه.
سنقوم هنا بتقليص عدد اليتات المحجوزة لتمثيل كل بيكسل و هذا بتصغير قيم المصفوفة TCD بقسمة قيمها على قيمة تدعى quantum:
Valeur quantifiée (i, j)= valeur TCD (i, j)/quantum (i, j)
و يتم حساب القيمة quantum كما يلي:
Quantum (i, j) =1+ (1+i+j)*quality
من أجل i,j = [0..7]
quality هو معامل الجودة, كلما كبر قلت جودة الصورة الناتجة و صغر معها حجمها, و العكس صحيح.
بالنسبة للمثال السابق, سنأخذ quality = 2 و نطبق ما سبق على المصفوفة TCD فنحصل على:

المصفوفة TCD بعد إجراء الـ Quantification.
أما بالنسبة للصيغة العكسية للـ Quantification فهي:
Valeur TCD ( i, j ) =Valeur quantifiée ( i , j ) x quantum ( i, j )
4. Codage:
المرحلة الأخيرة في الضغط باستعمال JPEG, نلاحظ بعد إجراء La quantification أن المصفوفة TCD أصبحت تحوي عددا معتبرا من الأصفار و هنا نستعمل طريقتين للتشفير, الطريقة RLE لتشفير الأصفار و نستعمل un codage entropique لتشفير باقي القيم(مثلا تشفير Huffman أو غيره حسب اختيار المبرمج).
لكن و قبل التشفير يجب تحول المصفوفة TCD ذات الأبعاد 8x8 إلى سلسلة من 64 عنصرا, نلاحظ أنه على مستوى المصفوفة TCD تكون الأصفار بكثرة في الركن الأيمن السفلي و لكي نجعل أكبر عدد ممكن من هاته الأصفار متجاور في سلسلة الـ 64 نقوم بمسح المصفوفة حسب طريقة Zig-zag

لنلاحظ هذه الصورة الأصلية:

بعد ضغطها باستعمال JPEG و بـ quality = 3 نحصل على:

أما باستعمال quality = 25:

نرى هناك بروز مربعات صغيرة كلما زدنا قيمة quality وهي تلك الكتل 8x8 التي حددناها من قبل, لذلك كلما كبر حجم الكتل, مثلا 32x32 نحصل على مربعات أكبر ولكن البرنامج سيستغرق وقتا أكبر في حساب مصفوفة DCT, لا تفكر أن تجعل الكتل كتلة واحدة بحجم كل الصورة أي 512x512, جرب لترى النتيجة.
هنا ننهي الكلام حول JPEG و لننتقل إلى صلب الموضوع و هو طريقة الضغط SPHIT.
يتبع...


















