03-10-12, 02:09 PM
كاتب الموضوع : المبرمج الطموح 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]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
[/TR]
[/TABLE]
ملاحظة مهمة : للتحكم بشدة الفلتر يمكننا تغيير 0.5 الموجودة في الكود بشكل طردي ( زيادة زيادة أو نقصان نقصان ) مع الانتباه لجعلها متساوية في كل الألوان لكي لا تتغير ألوان الصورة
كما في موضوعي السابق Blur سأقدم لكم مثال للتوضيح
و أحب أن أنوه مرة أخرى بأن الدرس و الشرح و المثال من تأليفي الشخصي .
تحياتي للجميع
أخوكم المبرمج الطموح vb6