![]() |
|
درس -- تعلم فلتر التحديد Sharpening مع شرح مفصل و مثال توضيحي - نسخة قابلة للطباعة +- منتدى فيجوال بيسك لكل العرب | منتدى المبرمجين العرب (http://vb4arb.com/vb) +-- قسم : قسم لغة الفيجوال بيسك VB.NET (http://vb4arb.com/vb/forumdisplay.php?fid=182) +--- قسم : قسم مقالات VB.NET (http://vb4arb.com/vb/forumdisplay.php?fid=184) +--- الموضوع : درس -- تعلم فلتر التحديد Sharpening مع شرح مفصل و مثال توضيحي (/showthread.php?tid=5016) |
درس -- تعلم فلتر التحديد Sharpening مع شرح مفصل و مثال توضيحي - RaggiTech - 03-10-12 كاتب الموضوع : المبرمج الطموح 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]'بداية أمر الضغط على الزر
[/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 |