تقييم الموضوع :
  • 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
}}}
تم الشكر بواسطة:


المواضيع المحتمل أن تكون متشابهة .
الموضوع : الكاتب الردود : المشاهدات : آخر رد
  معلومة :: تعلم كيف تحفظ صورة في My.Settings بدون الإحتياج إلى مسارها! أسامة أحمد 13 6,272 15-04-24, 01:13 AM
آخر رد: أبو جودة
  مثال للتعامل مع الجداول المرتبطة - عن طريق الكلاسات ابو ليلى 25 15,208 04-10-20, 06:16 PM
آخر رد: محمد بن عطية
  [مشروع] تعلم كيف تصنع برنامج لنشر منشورات لحساب الفيس بوك الخاص بك Basil Abdallah 8 6,273 01-07-18, 01:21 AM
آخر رد: YousefOkasha
  مثال القراءة والكتابه على ملف تيكست Txt على الانترنت + مثال + شرح m.sami.ak 11 8,411 02-06-18, 09:46 PM
آخر رد: YousefOkasha
  [درس فيديو] مثال بسيط لبرنامج إجازات فقط لأغراض الشرح (الدرس الأول) عبدالله الدوسري 7 11,547 28-04-18, 06:55 PM
آخر رد: moniam
  موضوع الاستاذ رامي مثال \ لطريقة تفعيل برنامجك عند العميل وتغيير كلمة مرور اRamilove سعود 8 7,703 06-10-17, 01:43 AM
آخر رد: حمادة دراز
  [نقاش] هل تعلم هذا عن Select Case ali.alfoly 3 3,403 30-12-16, 07:00 PM
آخر رد: Basil Abdallah
  [درس فيديو] تشغيل اوامر Run من البرنامج & مثال غلق الويندوز بعد وقت محدد باستخدام VB.net أحمد النجار 1 3,859 23-12-15, 04:26 AM
آخر رد: الماجيك مسعد
  هل تعلم؟ Aly El-Haddad 7 4,488 17-08-15, 01:59 AM
آخر رد: عبد الله
  تعلم أستخدام My.Settings لحفظ التغييرات عند الإغلاق Aly El-Haddad 15 8,803 13-06-13, 05:32 PM
آخر رد: ابراهيم

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


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