اذهب إلى المحتوى

السؤال

نشر

أريد توضيح أكبر للمرشح medianBlur وهل هناك إمكانية للتعامل مع حدود الصورة، فمن خلال  قراءتي عنها فهمت أنه يتم تمرير القناع (النواة أو الكيرنل Kernal) ذات الحجم الفردي k*k على بكسلات الصورة (عن طريق الالتفاف convlution على بكسلات الصورة) حيث يتم أخذ الوسيط لهذه البكسلات. واستبدال البكسل المركزي بقيمته. وأنه مفيد جداً  مع الصور التي تعاني من ضجيج Salt& Pepper .  لكن ماذا بشأن البكسلات الحدودية أي مثلاً ماذا يحدث للصفين الأولين ، حيث لا يمكن أن يكون هناك عناصر في الصفين الأولين والتي تمثل العنصر المركزي لأي نافذة؟  أي مثلاً هنا  في حال تطبيق نواة 3*3 سيتم استبدال العنصر المركزي 14 بالعنصر الوسيط 13. لكن ماذا عن الحدود؟ كيف سيتم التعامل معها؟

      [[12,  3, 22,  16,  17],
       [ 6, 13,  0, 12, 1],
       [25, 18, 14, 19, 23],
       [ 7, 11, 15, 10,  5],
       [12, 13, 5,  4,  0]] 

 

Recommended Posts

  • 1
نشر (معدل)

المرشح الوسيط يعمل تماماً كما شرحت في سؤالك، وفي OpenCV التابع cv.medianBlur يتم استخدامه لتطبيقه حيث تحتاج وسيطين:

cv2.medianBlur(src, ksize)

يمثل الوسيط الأول الصورة، ويمثل  الثاني حجم القناع الذي سبتم تطبيقه على الصورة. أما بالنسبة للحدود فهو يستخدم مايسمى BORDER_REPLICATE داخلياً لمعالجة بكسلات الحدود. لذلك يكرر وحدات البكسل المجاورة حتى تصبح جميع وحدات البكسل في منتصف بكسل النافذة. وبالتالي في حالتك عندما نريد تطبيق نواة 3*3 سيتم التعامل مع مصفوفتك وكأنها بالشكل التالي:

[[12,12, 3, 22,  16,17,17]
 [12,12, 3, 22,  16,17,17],
 [6, 6, 13,  0, 12, 1, 1],
 [25,25,18, 14, 19, 23,23],
 [7, 7, 11, 15, 10, 5 ,5],
 [12,12,13, 5,  4,  0, 0]
 [12,12,13, 5,  4,  0, 0]] 

بينما لو كنت تطبق نواة بحجم 5*5 سيكون:

[[12,12,12, 3, 22,  16,17,17,17],
 [12,12,12, 3, 22,  16,17,17,17],
 [12,12,12, 3, 22,  16,17,17,17],
 [6,6, 6, 13,  0, 12, 1, 1, 1 ],
 [25,25,25,18, 14, 19, 23,23,23],
 [7,7, 7, 11, 15, 10, 5 ,5, 5 ],
 [12,12,12,13, 5,  4,  0, 0, 0 ],
 [12,12,12,13, 5,  4,  0, 0, 0 ],
 [12,12,12,13, 5,  4,  0, 0, 0 ]] 

وبنفس الآلية تبعاً لحجم النواة يتم تكرار البكسلات.

تم التعديل في بواسطة Ali Haidar Ahmad
  • 1
نشر

كما قلت فإن median blur يقوم بأخذ المتوسط لمجموعة من البيكسلات المجاورة واستبدال القيمة القديمة للبيكسل بقيمة ذلك المتوسط ويتم تحديد عدد البيكسل التي يتم أخذ المتوسط منها عن طريق ال kernel ، فمثلا المثال التالي يوضح ال median filter ل kernel  ذو أبعاد 3*3:

Example-of-Median-Filtering-using-a-33-sampling-window-keeping-border-values-unchanged.png.bef58e4f187a651648334fa580ca558e.png

لاحظ في المثال السابق انه لم يأخض الحدود borders مع في الحسبان.

لكن في التطبيق الفعلى يتم ضمن الحدود بطريقة من اثنتين:

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

Capture.PNG.6b34e844517253f59096361ad1c99bb0.PNG

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...