You are on page 1of 16

‫جامعة دمشق‬

‫كلية الهندسة المعلوماتية‬


‫قسم الذكاء الصنعي‬

‫المنطق الضبابي‬
‫في معالجة الصور‬

‫إعداد‪ :‬محمد وسيم ابوزينة‬


‫ازالة الضجيج باستخدام المنطق الضبابي ‪:‬‬
‫فً السنوات الماضٌة دخلت التقنٌات الضبابٌة مجال الرؤٌة الحاسوبٌة ومعالجة الصور بقوة وامست تنافس الطرق الكالسٌكٌة من حٌث الجودة واالداء ‪,‬‬
‫ونذكر بالتحدٌد الفالتر الغٌر خطٌة لمعالجة الصور‪ .‬العدٌد من الطرق والمنهجٌات تم العمل علٌها وطرحها حتى اآلن ‪ .‬كما تتبٌن اهمٌة وقوة االستدالل‬
‫الضبابً فً اوجها بحاالت عدم الٌقٌن ‪ uncertainty‬التً تؤثر على عملٌة استخراج المعلومات من المعطٌات المخربة بالضجٌج فً الصور على سبٌل‬
‫المثال ال الحصر ‪.‬‬

‫معامالت االستدالل الضبابً المقادة بالقواعد ‪ If Else action‬هً معامالت غٌر خطٌة بحٌث تتبنى قواعد ضبابٌة ‪ fuzzy rule‬لمعالجة معطٌات الصور ‪.‬‬
‫ٌوجد العدٌد من المعامالت ‪ operators‬الضبابٌة المتوفرة لحل العدٌد من مشاكل معالجة الصور بما فً ذلك تنعٌم الصورة ‪ , somoothing‬استخراج‬
‫الحواف ‪ ,‬شحذ الصور ‪ . Sharpening‬الخ ‪.....‬‬

‫ٌوجد صنف جدٌد من معامالت االستدالل الضبابً التً تتعامل مع ازالة وحذف الضجٌج من الصور ٌدعى الفلتر ‪ PWL-Fire‬هذا الفلتر مبنً على‬
‫‪ piecewise linear fuzzy‬بحٌث ٌتغٌر شكل هذا الفلتر بشكل دٌنامٌكً بحٌث ٌعتمد على خصائص الصورة المحلٌة باالعتماد على هذا التصمٌم ٌمكن‬
‫تقدٌم طرٌقة فعالة إلزالة الضجٌج بحٌث ال تؤثر سلبا على دقة وجودة الصورة ‪.‬‬

‫الفلتر الذي سنتعامل معه ٌعتمد بشكل اساسً على معالجة نافذة جوارات البكسل ‪ Window-Based‬بحٌث نجد اننا ال نعالج فقط كل بكسل لوحدة وانما‬
‫نعالج اٌضا ً مجموعة البكسالت المجاورة الثمانٌة حسب حجم النافذة التً نتعامل معها وعندما ٌختلف حجم النافذة تختلف القواعد التً سنتعامل معها ولكن‬
‫الحجم ‪ 3*3‬هو الحجم المثالً للعمل وهو ما سنعتمد علٌه فً الطرٌقة المطروحة ‪.‬‬

‫تقوم عملٌة المعالجة على تطبٌق قواعد ضبابٌة لتقدٌر معدل التصحٌح الالزم اجراؤه وفق قواعد من الشكل ‪if then else‬‬

‫وفً حال تحققت احدى القواعد نقوم بعملٌة تصحٌح قٌمة البكسل اللونٌة الرمادٌة ‪ Luminance‬بٌنما ال نقوم باي تعدٌل فً حال عدم تحقق اي من القواعد ‪.‬‬

‫لنفرض على سبٌل المثال اننا امام صورة ‪ X‬وٌكون )‪ X(n‬هو قٌمة البكسل اللونٌة الرمادٌة فً المكان ‪ n‬فً الصورة الممٌزة بالضجٌج لٌكن لدٌنا )‪W(n‬‬
‫الذي ٌمثل مجموعة من بكسالت الجوار للبكسل المعالج بحٌث نجد ان البكسالت المجاورة هً البكسالت التً تقع ضمن النافذة ‪ 3*3‬حول البكسل المعالج‬
‫)‪. X(n‬‬

‫; )‪W(n)= { Xj(n‬‬ ‫} ‪j=1,2,3,4,5,6,7,8‬‬

‫ٌمكن تعرٌف متحوالت الدخل للمعامل بانها الفروق بٌن تدرجات الرمادي ‪. luminance differences‬‬

‫)‪Xj (n) = Xj (n) – X(n‬‬

‫ان متحول الخرج )‪ٌ y(n‬مثل التعدٌل الالزم القٌام به واضافة هذه القٌمة الى قٌمة لون البكسل االصلٌة )‪ , X(n‬االمر الذي ٌؤدي الى قٌمة تدرج رمادي‬
‫جدٌدة ممثلة بالمعادلة ‪:‬‬

‫‪Y(n) = X(n) + Y(n) old‬‬

‫باستعمال القواعد الضبابٌة ٌقوم المعامل الالخطً بالمطابقة ‪ maping‬بٌن مجموعة متحوالت الدخل ومتحول الخرج ‪ ,‬بحٌث ٌنتج بالنهاٌة معامل التعدٌل‬
‫الذي ٌقوم بحذف اشارة الضجٌج ‪.‬‬

‫كً نقوم بزٌادة فعالٌة هذه الطرٌقة نقوم بتطبٌق الفلتر بشكل عودي على معطٌات الصورة بحٌث تعطً قٌمة )‪ y(n‬الجدٌدة قٌمة التدرج الرمادي للبكسل‬
‫المعالج )‪ X(n‬فً نهاٌة المعالجة ‪.‬‬

‫الشكل التالً ٌبٌن نافذة ‪3*3‬‬


‫عندما نتعامل مع ‪ L‬مستوى تدرج رمادي فإن القٌم التً تاخذها متحوالت الدخل والخرج تكون ضمن المجال ]‪[-L+1, L-1‬‬

‫بالنسبة للمجموعات الضبابٌة التً تمثل دخل للعملٌة فإننا نقوم بتعرٌف مجموعتٌن ضبابٌتٌن ‪. LP,LN‬‬
‫‪ . large positive , large Negative‬ان قٌمة تابع االنتماء ‪ mLN‬للمجموعة الضبابٌة ‪ٌ LN‬مثل بكل بساطة بالشكل التالً ‪:‬‬

‫)‪mLN(u) = mLP(-u‬‬

‫بٌنما تاخذ المجموعة الضبابٌة ‪ mLP‬الشكل ‪: 2‬‬


‫تتعامل القواعد الضبابٌة مع العدٌد من االشكال والنماذج المختلفة للنافذة كً تقوم بالكشف عن الضجٌج ‪ .‬على سبٌل المثال ٌمكن اعتبار النموذج التالً‬
‫المشكل من تدرجات لونٌة ل ‪ 3‬بكسالت ‪ . x2,x4,x6‬بالتالً نجد ان الفروق بٌن التدرجات اللونٌة سٌتم تقٌمها وفق التالً ‪x2=x2-x, x4=x4-x,x6=x6-x‬‬
‫‪ .‬بسبب التناظرٌة فً عملٌة المعالجة فإنه ٌمكننا تولٌد زوج من القواعد الضبابٌة بحٌث‬
‫تكون معرفة بالشكل التالً ‪:‬‬

‫تعنً ‪ PO‬موجب ‪ positive‬و تعنً ‪ NE‬سلبً ‪ negative‬التً تمثل ‪singeltons‬‬


‫متمركزة حول ‪ L-1‬و ‪. –L+1‬‬

‫تم استعمال القواعد التالٌة على النافذة ‪:‬‬

‫ٌجدر الذكر بان هذه القواعد السابقة هً مصممة لمعالجة موجات الضجٌج السالبة والموجبة ‪,‬‬

‫بالنسبة للخرج ٌتم تقٌمه رقمٌا ً وفق التالً ‪:‬‬


‫‪New Luminance = Old Luminance + Variance‬‬

‫‪Variance = (L-1) (λ1 – λ2) :‬‬

‫}‪λ1 = Max { Min { mLP (ΔXj) : j  Ai} , I = 1 .. N‬‬

‫}‪λ2 = Max { Min { mLN (ΔXj) : j  Ai} , I = 1 .. N‬‬

‫ان آلٌة حفظ التفاصٌل للفلتر تعتمد بشكل رئٌسً على اختٌار برامٌترات المجموعة الضبابٌة ‪ . a,b‬بالتاكٌد فإن تحدٌد شكل المجموعات الضبابٌة ‪LP,LN‬‬
‫ٌهدف فً النهاٌة الى اداء تصحٌح كامل للضجٌج فً حال كان كمٌة مطال الضجٌج عالٌا ً ‪.‬فً حال وجود مطال صغٌر من الضجٌج فإنه على العكس عملٌة‬
‫التحسٌن ‪ smoothing‬تقلل كً تقدم حفظ افضل للصورة واالكساء ‪ .‬ان الضجٌج المعالج ٌدعى ضجٌج من النوع ‪ Salt and pepper noise‬وهو شكل‬
‫من اشكال الضجيج الذي يحدث للصورة بحيث نالحظ ظهور بكسالت عشوائية بيضاء وسوداء‪ .‬يوجد العديد من المنهجيات والتقنيات الكالسيكية كفلتر‬
‫ميديان ‪ , median‬او فالتر التشكيلي الثنائية ‪... morphological‬الخ تحدث هذه الظاهرة في حاالت عندما يكون التقاط سريع للصورة‬

‫نتائج تجرٌبٌة ‪:‬‬


‫كشف الحواف باستعمال المنطق الضبابي‬
‫ماهي الحواف في الصورة الرقمية ؟‬

‫ٌمكن تعرٌف الحافة بانها االختالف ما بٌن المستوٌات اللونٌة المختلفة او بمعنى آخر هً التباٌن المتفاوت والكبٌر بٌن بكسل وآخر لونٌا ً ‪ .‬تتضمن الحواف‬
‫معلومات هامة فً الصور الرقمٌة بحٌث تقدم لنا معلومات عن مكان الغرض بحٌث ٌفٌد هذا االمر الحقا ً فً تحدٌد االغراض المختلفة فً الصورة‬
‫ومالحقتها كما فً الصور المتتالٌة الفٌدٌو ‪ .‬وكشف الحواف هو امر حٌوي وهام فً الرؤٌة الحاسبة ومعالجة الصور ألنها تستعمل فً كشف خصائص‬
‫االغراض ومالحقتها ونجد اهم تطبٌقات الكشف عن الحواف فً الصور الطبٌة ‪ ,‬تحدٌد االغراض فً الفٌدٌو والصور الثابتة ‪ ,‬استخراج الخلفٌة الخ ‪.‬‬

‫ما هو تعريف الحواف رياضيا ً في الصورة الرقمية ؟‬

‫بداٌة تعرف الصورة الرقمٌة على انها اشارة رقمٌة تحمل بكل بكسل قٌمة لونٌة محددة ‪ٌ .‬مكن كشف الحواف من هذه االشارة الرقمٌة التً تمثل الصورة‬
‫عن طرٌق تعرٌف الحافة والتً هً التغٌرات المفاجئة بالقٌم اللونٌة بٌن بكسل واخر هذا التغٌر ٌتم التعبٌر عنه عند المرور الصفري بالمشتق الثانً ‪zero‬‬
‫‪crossing‬‬
‫ماهي الطرق المختلفة للكشف عن الحواف ؟‬

‫ٌوجد العدٌد من طرق الكشف عن الحواف واشهر الفالتر المطبقة على الصور الرقمٌة هً‬

‫كما ٌمكن تصنٌف الطرق المتبعة فً كشف الحواف الى ‪:‬‬

‫طرق خطٌة ‪ :‬كمعامل سوبل ‪ , Sobel‬معامل برٌوٌت ‪ , Prewitt‬معامل روبرت ‪Robert‬‬ ‫‪‬‬

‫طرق غٌر خطٌة ‪ :‬كما فً الطرق التً تعتمد المنطق الضبابً ‪FIS‬‬ ‫‪‬‬

‫معامل سوبل‬

‫معامل برٌوٌت‬
‫معامل روبرت‬

‫الطريقة الضبابية للكشف عن الحواف ‪:‬‬

‫ٌمكن تمثٌل الصورة الرقمٌة بمصفوفة ثنائٌة ‪ Matrix‬بحٌث ٌكون كل عنصر من هذه المصفوفة ٌملك قٌمة محددة او خاصٌة لكل بكسل ‪.‬وخوارزمٌتنا‬
‫تعتمد بشكل اساسً على ‪ 3‬مراحل فً العمل‬

‫‪Image fuzzification ‬‬

‫‪Modification of membership value ‬‬

‫‪Image defuzzification ‬‬

‫‪ٌ -1‬تم بالمرحلة االولى لضبضبة الصورة ‪fuzzification‬‬


‫تحوٌل المصفوفة من شكلها النظامً " كل بكسل ٌملك قٌمة لونٌة " الى الشكل الضبابً "بحٌث ٌتملك كل بكسل فٌها قٌمة لدرجة انتماء هذا العنصر‬
‫لمجموعة ضبابٌة محددة وفً مثالنا هل سٌكون هذا البكسل حافة ام ال ‪. " edge‬‬

‫ٌتم بداٌة العمل على تحوٌل الصورة من قٌم اللونٌة ‪ rgb‬الى قٌم التدرج الرمادي ‪ . Gray scale‬بحٌث نجد عندها ان لكل بكسل قٌمة لونٌة تتراوح ما بٌن‬
‫ال ‪ 0‬الى ‪255‬‬

‫‪ -2‬عملٌة المعالجة الضبابٌة ‪:‬‬


‫العملٌات التً تطبق على الصورة الضبابٌة وهذه العملٌات ستؤثر على درجة االنتماء لكل بكسل ‪ .‬من ثم ٌتم تطبٌق قواعد محددة لتحدٌد درجة انتماء البكسل‬
‫المعالج لٌكون حافة ‪.‬‬

‫‪-3‬فً المرحلة االخٌرة ‪ٌ defuzzification‬تم تحوٌل الصورة بطرٌقة معاكسة للمرحلة ‪ 1‬بحٌث ٌتم التحوٌل من مصفوفة قٌم ضبابٌة الى مصفوفة تدرج‬
‫بالرمادي ‪.‬‬

‫وٌمكن تلخٌص مراحل العمل النظام الثالث بما ٌلً ‪:‬‬


‫نظام االستدالل الضبابً )‪Fuzzy Inference System (FIS‬‬

‫الخطوات االساسٌة لعمل النظام ‪:‬‬

‫ٌتم ادخال الصورة لٌتم تحوٌلها الى صورة ذات تدرج رمادي بحٌث ٌأخذ كل بكسل قٌمة ما بٌن ‪ 0‬و ‪ 255‬لتكون دخل للنظام الضبابً ٌتم تحوٌل الصورة‬
‫من شكلها التقلٌدي الى الشكل الضبابً بحٌث تملك البكسالت قٌم ضبابٌة وذلك تبعا ً لقٌم تابع االنتماء المخصص للمجموعة الضبابٌة حافة بحٌث نجد ان‬
‫البكسل ذو درجة االنتماء ‪ 1‬لكونه حافة سٌتم مقابلته فً المرحلة االخٌرة باللون االسود الغامق وٌقل تدرج االلوان كلما قلت درجة انتماء البكسل الى‬
‫المجموعة الضبابٌة حافة ‪.‬‬

‫الطرٌقة المقترحة للمعالجة الضبابٌة تفترض تقسٌم الصورة الى مقاطع باستعمال مصفوفة ‪ 3*3‬ثنائٌة ‪.‬‬

‫بكسالت الحواف ٌتم مقابلتها بدرجة انتماءها الى المجموعة حافة ‪ .‬بٌنما تأخذ بقٌة البكسالت اللون االبٌض ‪.‬‬

‫المجموعات الضبابٌة ‪:‬‬

‫قمنا بالعمل على تمثٌل مجموعتٌن ضبابٌتٌن اخرٌٌن وهما االبٌض واالسود الموضحان بالشكل ‪ :‬كما ٌبٌن الشكل ‪ b‬عملٌة ال ‪defuzzyfication‬‬

‫بالنسبة للفالتر والقواعد الضبابٌة المطبقة فهً كالتالً ‪:‬‬

‫بحٌث نقوم بالمقارنة بحالة الفلتر فان وافق احدى االشكال التالٌة فان البكسل المعالج هو بكسل حافة وٌتم حساب درجة انتماء هذا البكسل لٌكون حافة فٌما‬
‫بعد ‪.‬‬
‫شرح آلية العمل‬
‫تسريع عمل الخوارزمية ‪:‬‬

‫العدٌد من تطبٌقات معالجة الصور تعتمد بشكل كبٌر على المعالجة التفرعٌة فً العمل وذلك بسب ان الخوارزمٌة المطبقة تطبق على كل بكسل بنفس‬
‫الخطوات ‪ ,‬وجاءت المعالجات الحدٌثة ذات االنوٌة المتعددة ‪ multicore‬بتدعٌم طرق جدٌدة بالبرمجة بحٌث اصبح باالمكان استغالل القدرة الخارقة‬
‫للمعالج بالشكل االفضل ‪.‬‬

‫بما ان الخوارزمٌة نفسها مطبقة على كل بكسل فقت قمنا بتقسم العمل الى قسمٌن بحٌث ٌأخذ كل معالج قسم من الصورة وٌعالجها ولقد استعملنا مكتبة ‪TPL‬‬
‫لما وجدنا فٌها سهولة بالتعامل وقوة فً االداء ‪.‬‬

‫حول مكتبة ‪: TPL‬‬

‫ان مكتبة المهام المتوازٌة )‪ Task Parallel Library (TPL‬هً جزء من مكتبة امتداد التوازي فً الدوت نت ‪,‬وكما هو ظاهر من خالل االسم فهً مبنٌة‬
‫على مفهوم المهام ‪.‬ان مصطلح توازي المهام ٌشٌر الى مهمة او اكثر مستقلة اي الٌوجد ارتباط معطٌات او الى ما ذلك ‪ ,‬بحٌث ٌتم تنفٌذ هذه المهام بشكل‬
‫متوازي ‪.‬ان المهمة تمثل عملٌة متزامنة وفً بعض الحاالت هً تشبه انشاء نٌسب جدٌد او عنصر من ساحة نٌاسب ‪, ThreadPool‬ولكن على مستوى‬
‫اعلى من التجرٌد ‪.‬توفر المكتبة بنى تفرعٌة كما فً تعلٌمة ‪ parallel For‬و‪ , ForEach‬باستعمال توابع معتادة و ‪.delegates‬كما ٌمكن استعمال تلك‬
‫البنى والتعلٌمات من خالل اي لغة برمجة تدعم الدوت نت ‪.‬ان مهمة انشاء مهمات ابناء وانهاء المهام والنٌاسب كما اٌضا مهمة اضافة عدد مهام اضافٌة‬
‫بحسب عدد المعالجات المتوفرة كل ذلك ٌتم من خالل المكتبة نفسها ‪.‬‬

‫ان مكتبة ‪ TPL‬اٌضا تضم بنى اخرى كما فً ‪. Task,Future‬ان البنٌة ‪ Task‬تمثل حدث ٌمكن تنفٌذه بشكل مستقل عن باقً اجزاء البرنامج ‪.‬وٌمكن القول‬
‫بانه ٌكافً النٌسب ماعدا انه اقل خفة من النٌسب وٌحول دون انشاء نظام التشغٌل لنٌسب مما ٌؤدي الى سرعة الحركة والعمل ‪.‬المهام ٌتم وضعها فً‬
‫غرض من النمط مدٌر المهام ضمن رتل وٌتم جدولة تلك المهام لتعمل على عدة نٌاسب فً حوض الٌانسب عندما ٌحٌن دورها فً التنفٌذ‪.‬‬

‫البنٌة ‪ Future‬هً ‪ task‬التً تعٌد نتٌجة ‪ .‬النتٌجة ٌتم حسابها فً نٌاسب الخلفٌة مكبسلة بغرض من النمط ‪ , future‬والنتٌجة ٌتم وضعها فً خازن مؤقت‬
‫‪ buffer‬لرٌثما ٌتم اعادة نتٌجتها ‪.‬اذا تم محاولة استرجاع النتٌجة قبل ان ٌتم حسابها عندها فان النٌسب الطالب سٌتم حجبه مؤقتا رٌثما تعاد النتٌجة ‪.‬البنٌة‬
‫االخرى فً مكتبة ‪ TPL‬هً الصف ‪ Parallel‬توفر المكتبة ‪ TPL‬صٌغة اساسٌة لبنٌة التفرع من خالل ‪ 3‬توابع ستاتٌكٌة فً الصف ‪.Parallel‬‬

‫‪ Parallel.Invoke‬الذي ٌنفذ مصفوفة من ‪ Action delegates‬فً التوازي ‪ ,‬من ثم ٌنتظرهم لٌنهً نفسه‬

‫‪ Parallel.For‬مكافئة لحلقة ال ‪ for‬المعروفة فً ‪C#‬‬

‫‪ Parallel.ForEach‬مكافئة لحلقة ال ‪ foreach‬المعروفة فً ‪C#‬‬


‫المعمارٌة ‪:‬‬

‫ان المفهوم العام فً مكتبة االمتداد التفرعٌة فً الدوت نت هً المهمة ‪,‬والتً هً قسم صغٌر من الرماز المصدري ‪,‬عادة ماٌتم تمثٌله كتابع المبدا}‪ ,{1‬الذي‬
‫ٌمكن تنفٌذه بشكل مستقل ‪.‬كال من ‪ PLINQ‬و ‪ TPL‬تقدم منهجٌات وتوابع النشاء المهام –‪ PLINQ‬تقسم الطلب ‪ query‬الى عدة مهام اصغر‪,‬كما ان توابع‬
‫‪ٌ Parallel.Invoke Parallel.For, Parallel.ForEach‬قسمون الحلقة الى مهام ‪.‬‬

‫تتضمن المكتبة االمتدادٌة التفرعٌة ‪ PFX‬غرض من نمط مدٌر مهام الذي ٌقوم بجدولة المهام للتنفٌذ ‪.‬ان مدٌر المهام ٌحتوي على رتل من المهام عام لكل‬
‫البرنامج بحٌث ٌتم وضع المهام ضمن هذا الرتل ومن ثم ٌتم التنفٌذ ‪.‬باالضافة الى انه ٌقوم بكبسلة مجموعة من النٌاسٌب الى ماتنفذه المهام ‪.‬بشكل افتراضً‬
‫ٌتم تشكٌل عدد من النٌاسب بعدد المعالجات المتوفرة او النوى فً النظام على الرغم من ان هذا الرقم ٌمكن تعدٌله بشكل ٌدوي ‪.‬كل نٌسب ٌرتبط برتل‬
‫خاص للنٌاسب والمهام ‪.‬كل نٌسب عندما ٌصبح فً حالة الخمول ٌقوم باخذ مجموعة من المهام وٌضعها فً الرتل المحلً الخاص بها‪,‬من ثم ٌنفذها الواحدة‬
‫تلو االخرى ‪.‬اذا كان الرتل العام فارغا ً فان النٌسب سٌبحث عن المهام التً فً االرتال وسٌاخذ المهام التً كانت فً الرتل الطول فترة ‪.‬عند التنفٌذ فان‬
‫المهام سٌتم تنفٌذها بشكل مستقل مع تغٌٌر فً الحالة لكل مهمة ‪.‬كنتٌجة لذلك اذا كانت المهام تستعمل مصدر مشترك فٌجب ان ٌتم مزامنة فٌما بٌن المهام‬
‫بشكل ٌدوي باستعمال االقفال او السٌمافورات ‪.‬‬

‫إن المهام تقدم فائدتين اساسيتين ‪:‬‬

‫‪-1‬فعالٌة اكثر وامكانبة استعمال الموارد بشكل اكبر ‪.‬‬

‫‪-2‬تحكم برمجً اكثر من التحكم المتوفر من النٌاسب او عناصر العمل ‪:‬‬

‫تحوي مكتبة ‪ TPL‬على مجموعة غنٌة من التوابع والمنهجٌات الداعمة لعمل المهام والنٌاسب كتوابع الغاء المهام او االنتظار او االستمرار او معالجة اخطاء‬
‫المهام ‪,‬جدولة محددة والعدٌد من امور التحكم ‪.‬‬

‫من اجل هذٌن السببٌن فقد تم تضمٌن مكتبة للتعامل مع توازي المهام وادارة عملٌة البرمجة التفرعٌة فً بٌئة دوت نت ‪. 4‬بحٌث تم توفٌر ‪ API‬لكتابة كود‬
‫متعدد النٌاسب ‪,‬متزامن وٌعمل على التفرع مستغال تعدد االنوٌة والمعالجات فً االجهزة الحدٌثة ‪.‬‬

‫النتائج ‪:‬‬

You might also like