تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
تعلم إضافة الضبابية للصور - بواسطة فلتر ال Blur - مع مثال توضيحي
#1
<< بسم الله الرحمن الرحيم >>


السلام عليكم إخواني أما بعد , كل من يعمل على ال PhotoShop يعرف فلتر ال Blur أو ما يعرف بالضبابية و من الفلاتر المهمة في مجال تصميم الصور و تعديلها
اليوم بإذن الله سوف نتعلم سويا كيف يمكن عمل هذذا الفلتر باستخدام Visual Basic.Net

نبدأ باسم الله الرحمن الرحيم درسنا :


- إن فكرة الفلتر بسيطة جدا فهي تعتمد على أخذ المتوسط الحسابي لكل لون في كل Pixel مع ثمانٍ من مجاوراتها و إعادة قيمته لل Pixel مرة أخرى .
لنستفهم أنا و إياكم عن كيفية تنفيذ الفلتر Filter :

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

- بما أننا سوف نتعامل مع ال Pixels لذلك لابد من أن يدور ذهننا للدالتين GetPixel و SetPixel و هما أساس هذا الكود .

- في الكود سنلاحظ جملة تكرار For لأخذ كل إحداثي في الصورة على المحورين X , Y و من ثم ننسبهما إلى إحداثيات الدالة GetPixel و إلحاقها بالوسيط R أو G أو B و أخذ نسبة كل من الألوان ( أحمر , أخضر , أزرق ) من كل Pixel و مع جمعها ( + ) مع نسبة اللون نفسه من ال Pixels المجاورة لهذه ال Pixel مقسمة على العدد الكلي ( 9 )

( أعلم أن هذه الخطوة تدوخ لكن تابع الدرس لأن هذه الفكرة مشروحة في الكود بالتفصيل )

- من ثم ننسب القيم الثلاثة المعدلة إلى ثلاث متغيرات Red , Green , Blue و بعدها نستخدم الدالة SetPixel لإرجاع القيم الجديدة لنسب الألوان إلى تلك ال Pixel .

- و من ثم تتكرر العملية لتشمل كل Pixels الصورة بلا استثناء .

الآن سأعطيكم الكود مشروحاً سطرا بسطر لتثبيت الفكرة أكثر
:



كود :
' هذا حدث الضغط على الزر
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
   ' إرجاع القيمة الصفرية لشريط التقدم
        ProgressBar1.Value = 0

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

       'ننسب صورة مربع الصورة إلى المتغير حيث لا يشعر المستخدم بهذا الخطوة
        'لكن الفائدة منها أنه عندما يتم تعديل بقية الكود يرى المستخدم التغيير أمامه
        PictureBox1.Image = AHED

        'تعريف متغيرات لنسب الألوان
        Dim Red, Green, Blue As Integer

        'تعريف متغيرات للإحداثيات
        Dim I, J As Integer

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

   'عبارة لاختصار الكود نظرا للاستخدام الكبير للمتغير فيصبح ليس بحاجة لكتابة المتغير
        'و إنما مباشرة النقطة فيعرف الجهاز أن الخاصية بعد النقطة عائدة لمتغير الصورة
        With AHED

      'جعل قيمة الإحداثي الصادي من الواحد إلى قبل نهاية الصورة بنقطتين لأنه يمثل طرف هذه الصورة
            'لاحظ أنه في الكود لم نكتب اسم المتغير بل مباشرة استدعينا خاصيته و ذلك بفضل العبارة السابقة
            For I = 1 To .Height - 2

                'أما هذا فللإحداثي السيني
                For J = 1 To .Width - 2

        'نجعل قيمة متغير اللون الأحمر مساوية قيم اللون الأحمر ل 8 نقاط حول النقطة المدروسة
                    'و تقسيمها على 9 عدد النقاط للمتوسط الحسابي
                    Red = CInt((CInt(.GetPixel(J - 1, I - 1).R) + CInt(.GetPixel(J - 1, I).R) + CInt(.GetPixel(J - 1, I + 1).R) + _
            (CInt(.GetPixel(J, I - 1).R)) + CInt(.GetPixel(J, I).R) + CInt(.GetPixel(J, I + 1).R) + _
            CInt(.GetPixel(J + 1, I - 1).R) + CInt(.GetPixel(J + 1, I).R) + CInt(.GetPixel(J + 1, I + 1).R)) / 9)


                    'هذا كود المتوسط الحسابي للون الأخضر
                    Green = CInt((CInt(.GetPixel(J - 1, I - 1).G) + CInt(.GetPixel(J - 1, I).G) + CInt(.GetPixel(J - 1, I + 1).G) + _
            (CInt(.GetPixel(J, I - 1).G)) + CInt(.GetPixel(J, I).G) + CInt(.GetPixel(J, I + 1).G) + _
            CInt(.GetPixel(J + 1, I - 1).G) + CInt(.GetPixel(J + 1, I).G) + CInt(.GetPixel(J + 1, I + 1).G)) / 9)


                    'أما هذا فللون الأزرق
                    Blue = CInt((CInt(.GetPixel(J - 1, I - 1).B) + CInt(.GetPixel(J - 1, I).B) + CInt(.GetPixel(J - 1, I + 1).B) + _
            (CInt(.GetPixel(J, I - 1).B)) + CInt(.GetPixel(J, I).B) + CInt(.GetPixel(J, I + 1).B) + _
            CInt(.GetPixel(J + 1, I - 1).B) + CInt(.GetPixel(J + 1, I).B) + CInt(.GetPixel(J + 1, I + 1).B)) / 9)

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

                    'إنتهاء عبارة التكرار الخاصة بالمتغير السيني
                Next

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

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

                'إنتهاء عبارة التكرار الخاصة بالمتغير الصادي
            Next

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

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

        'إنتهاء الحدث
    End Sub



ملاحظات :

- سنلاحظ أن تنفيذ الكود بطيء ذلك بسبب حلقتي التكرار و العمليات الحسابية في كل منهما لكن لجعل العملية أسرع يمكننا أن نننقل السطر PictureBox1.Image = AHED
إلى نهاية الكود قبل جملة End Sub و بذلك لن يشاهد المستخدم التغيير إلا بعد إنتهاء العملية لأن الصورة تبقى محفوظة في الذاكرة لحين الانتهاء من أداء الفلتر .
- لقد قمت بإرفاق مثال للتوضيح أكثر .
- الموضوع و المثال و الشرح من كتابتي أتمنى أن يعجبكم .



تحياتي للجميع .
المبرمج الطموح vb6


حصريا للمنتدى :
درس: كيفية حساب عدد الأسطر في نص

-- إذا لم تزد على الحياة شيئاً فأنت زائد عليها --
-- المبرمج الطموح vb6 --


الرد }}}}
تم الشكر بواسطة:


المواضيع المحتمل أن تكون متشابهة .
الموضوع : الكاتب الردود : المشاهدات : آخر رد
  [مقال] إضافة خاصية التحجيم التلقائي - AutoSize - إلى أداة مربع النص - TextBox sooriaty03 9 2,893 11-02-16, 10:47 PM
آخر رد: العواد الصغير
  موضوع الاستاذ رامي مثال \ لطريقة تفعيل برنامجك عند العميل وتغيير كلمة مرور اRamilove سعود 7 2,037 26-01-16, 08:07 PM
آخر رد: سعود
  [درس فيديو] تشغيل اوامر Run من البرنامج & مثال غلق الويندوز بعد وقت محدد باستخدام VB.net أحمد النجار 1 536 23-12-15, 04:26 AM
آخر رد: الماجيك مسعد
  هل تعلم؟ Aly El-Haddad 7 1,258 17-08-15, 01:59 AM
آخر رد: عبد الله
  بشرى لكل من يريد تعلم البرمجة بالفيجوال بيسك دوت نت arbtech 8 1,591 21-08-13, 11:32 PM
آخر رد: arbtech
  مثال القراءة والكتابه على ملف تيكست Txt على الانترنت + مثال + شرح m.sami.ak 9 2,261 20-08-13, 01:12 PM
آخر رد: m.sami.ak
  تعلم أستخدام My.Settings لحفظ التغييرات عند الإغلاق Aly El-Haddad 15 2,718 13-06-13, 05:32 PM
آخر رد: ابراهيم
  الإصدار الاول من إضافة الرسائل ( Msge ) والصور مجانآ ali.alfoly 12 1,676 25-05-13, 01:10 PM
آخر رد: shaker.soft
  تعلم إضافة ألعاب الفلاش و مقاطع الفيديو الفلاشية إلى برنامجك Aly El-Haddad 1 762 13-04-13, 06:46 PM
آخر رد: Sajad
  ابسط مثال لتشغيل ملفات mp3 مستضافة على موقع سعود 4 1,339 01-04-13, 04:04 AM
آخر رد: سامى ابوسريع

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


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