تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
درس -- تعلم فلتر التحديد Sharpening مع شرح مفصل و مثال توضيحي
#1
كاتب الموضوع : المبرمج الطموح vb6


<< بسم الله الرحمن الرحيم >>

السلام عليكم إخواني القرآء , كما هو حال الدرس السابق في إضافة الضبابية بما يعرف فلتر ال Blur
اليوم تعالوا لنتعلم ما هو عكس ال Blur و هو ما يعرف بال Sharpening أو التحديد و كل هذه الكلمات معروفة بالنسبة لمصمم ال Photoshop فهذه الفلاتر هي فلاتر محورية في التصميم .


تعريف بفلتر ال Sharpening :
زيادة نسبة التباين ( الفرق في اللون ) بين كل Pixel و مجاوراتها و يجب الانتباه جدا بأن المقصود ليس التباين الكلي للصورة Contrast و إنما تباين Pixel عن أخرى .


قبل البدء :
فقط لتكون أخي القارئ جاهزا لهذا الدرس عليك بالإطلاع على فكرة تنفيذ فلتر Blur ليسهل الأمر عليك هنا .
فكرة الفلتر :
بما أننا نريد أن نجعل كل Pixel متباينة عن الأخرى فنحن بحاجة لجعلها تبرز أكثر عن مجاوراتها لكن كيف العمل هنا ؟؟ , بمعنى آخر ما هي العملية المعاكسة للمتوسط الحسابي ( العملية التي تعتمد عليها فلترة Blur ) ؟!؟!


فكرة تنفيذ :
إننا إذا بحاجة لزيادة نسبة الألوان في كل Pixel لكن بنسبة معقولة لا تجعلها غامقة جدا .

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

إن فكرة الحل هذه هي و يكون الكود هو الباقي علينا لنثبت الفكرة أكثر و أكثر :


إنشاء المشروع :
- نبدأ مشروع Windows Forms Application و نضع على الفورم الأداوت التالية باسمائها الافتراضية :
1 - ProgressBar للإستدلال على تقدم عملية الفلترة .
2 - Button للبدء بالفلترة .
3 - PictureBox تحوي على الصورة المراد تنفيذ الفلتر عليها .

و هذا الكود مشروح سطرا بسطر :

اقتباس:
[TABLE="width: 100%"]
[TR]
[TD="class: alt2"]
[SIZE=3]'بداية أمر الضغط على الزر
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click


'إرجاع قيمة صغرية لشريط التقدم
ProgressBar1.Value = 0


'جعل القيمة الأعظمية لشريط التفدم مساوية القيمة الرقمية لارتفاع الصورة في مربع الصور
ProgressBar1.Maximum = Val(PictureBox1.Image.Height)


'تعريف متغير على أنه صورة و إعطائه الصورة الموجودة في مربع الصور
Dim AHED As New Bitmap(PictureBox1.Image)


'إرجاع قيمة المتغير إلى مربع الصورة لتتأثر بالتغيرات الحاصلة
PictureBox1.Image = AHED


'تعريف متغيرات للألوان و الاحداثيات
Dim Red, Green, Blue, I, J As Integer


'عبارة الاختصار
With AHED


'جملة تكرار للإحداثي الصادي
For I = 1 To .Height - 2


'جملة تكرار للاحداثي السيني
For J = 1 To .Width - 2


'أخذ قيمة اللون الأحمر من النقطة و إضافة نصف الفرق بين " الأحمرين " و هذا ما تحدثنا عنه
Red = CInt(.GetPixel(J, I).R) + (0.5 * (CInt(.GetPixel(J, I).R) - CInt(.GetPixel(J - 1, I - 1).R)))


'إن كانت القيمة سالبة ترجع موجبة باستخدام الضرب بالواحد السالب
If Red < 0 Then Red = Red * -1


'العملية نفسها على اللون الأخضر
Green = CInt(.GetPixel(J, I).G) + (0.5 * (CInt(.GetPixel(J, I).G) - CInt(.GetPixel(J - 1, I - 1).G)))
If Green < 0 Then Green = Green * -1


'مرة أخرى على اللون الأزرق
Blue = CInt(.GetPixel(J, I).B) + (0.5 * (CInt(.GetPixel(J, I).B) - CInt(.GetPixel(J - 1, I - 1).B)))
If Blue < 0 Then Blue = Blue * -1


'من الممكن بعد العملية الحسابية أن تكون القيمة أكبر من 255 و هذا خطأ
'نصلح الأمر بالدالة الرياضية التي تختار القيمة الأصغر من القيمتين المرجعتين لها
'و بذلك لن تتعدى القيمة فوق سقف ال 255
Red = Math.Min(Red, 255)


'نفس الحركة بالنسبة للون الأزرق
Blue = Math.Min(Blue, 255)


'مرة أخرى للون الأخضر
Green = Math.Min(Green, 255)


'إعادة القيم مرة أخرى إلى النقطة بعد التعديل
.SetPixel(J, I, Color.FromArgb(Red, Green, Blue))


'إنهاء عبارة التكرار الأولى
Next


'تحديث الصورة
PictureBox1.Refresh()


'زيادة قيمة شريط التقدم خطوة
ProgressBar1.Value = ProgressBar1.Value + 1


'إنهاء التكرار الثاني
Next


'إنهاء عبارة الاختصار
End With


'تحديث الصورة
PictureBox1.Refresh()


'إنهاء العملية بإكمال شريط التقدم
ProgressBar1.Value = ProgressBar1.Maximum

' نهاية الحدث
End Sub
[/SIZE][/TD]
[/TR]
[/TABLE]


ملاحظة مهمة : للتحكم بشدة الفلتر يمكننا تغيير 0.5 الموجودة في الكود بشكل طردي ( زيادة زيادة أو نقصان نقصان ) مع الانتباه لجعلها متساوية في كل الألوان لكي لا تتغير ألوان الصورة

كما في موضوعي السابق Blur سأقدم لكم مثال للتوضيح


و أحب أن أنوه مرة أخرى بأن الدرس و الشرح و المثال من تأليفي الشخصي .


تحياتي للجميع
أخوكم المبرمج الطموح vb6
}}}}
تم الشكر بواسطة:


المواضيع المحتمل أن تكون متشابهة .
الموضوع : الكاتب الردود : المشاهدات : آخر رد
  موضوع الاستاذ رامي مثال \ لطريقة تفعيل برنامجك عند العميل وتغيير كلمة مرور اRamilove سعود 7 2,046 26-01-16, 08:07 PM
آخر رد: سعود
  [درس فيديو] تشغيل اوامر Run من البرنامج & مثال غلق الويندوز بعد وقت محدد باستخدام VB.net أحمد النجار 1 538 23-12-15, 04:26 AM
آخر رد: الماجيك مسعد
  هل تعلم؟ Aly El-Haddad 7 1,264 17-08-15, 01:59 AM
آخر رد: عبد الله
  بشرى لكل من يريد تعلم البرمجة بالفيجوال بيسك دوت نت arbtech 8 1,598 21-08-13, 11:32 PM
آخر رد: arbtech
  مثال القراءة والكتابه على ملف تيكست Txt على الانترنت + مثال + شرح m.sami.ak 9 2,264 20-08-13, 01:12 PM
آخر رد: m.sami.ak
  تعلم أستخدام My.Settings لحفظ التغييرات عند الإغلاق Aly El-Haddad 15 2,734 13-06-13, 05:32 PM
آخر رد: ابراهيم
  تعلم إضافة ألعاب الفلاش و مقاطع الفيديو الفلاشية إلى برنامجك Aly El-Haddad 1 763 13-04-13, 06:46 PM
آخر رد: Sajad
  ابسط مثال لتشغيل ملفات mp3 مستضافة على موقع سعود 4 1,344 01-04-13, 04:04 AM
آخر رد: سامى ابوسريع
  مثال تشغيل ملف صوتى او فيديو RainBow 0 499 14-03-13, 08:37 PM
آخر رد: RainBow
  مثال راع لى برنامج الرسام RainBow 0 607 02-03-13, 03:36 AM
آخر رد: RainBow

التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم