تقييم الموضوع :
  • 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 --


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


المواضيع المحتمل أن تكون متشابهة .
الموضوع : الكاتب الردود : المشاهدات : آخر رد
  إضافة و نسخ الخطوط الخاصّة لمجلّد خطوط الوينداوز عبد العزيز البسكري 2 3,700 08-05-23, 12:03 AM
آخر رد: ابو محمد محمد محمد
  [مقال] إضافة تقارير Crystal report إلى فيجوال 2010 اسامه الهرماوي 3 5,304 05-10-21, 01:38 PM
آخر رد: mohameddahab867
  معلومة :: تعلم كيف تحفظ صورة في My.Settings بدون الإحتياج إلى مسارها! أسامة أحمد 4 6,097 18-07-21, 02:53 AM
آخر رد: kebboud
  [مقال] إضافة خاصية التحجيم التلقائي - AutoSize - إلى أداة مربع النص - TextBox sooriaty03 10 12,034 21-03-21, 09:53 PM
آخر رد: عبد الهادي بهاب
Photo [VB.NET] فلاتر والوان للصور 3booody 0 1,825 14-03-21, 06:53 PM
آخر رد: 3booody
  مثال للتعامل مع الجداول المرتبطة - عن طريق الكلاسات ابو ليلى 25 15,192 04-10-20, 06:16 PM
آخر رد: محمد بن عطية
  طريقة إضافة اختصار للصنف في شاشة المبيعات ملهمـ 5 5,905 14-07-20, 12:24 PM
آخر رد: ابراهيم ايبو
  إضافة نغمات إفتتاحيّة أثناء تسطيب البرنامج عبد العزيز البسكري 11 7,248 23-01-19, 08:35 PM
آخر رد: عبد العزيز البسكري
  [مشروع] تعلم كيف تصنع برنامج لنشر منشورات لحساب الفيس بوك الخاص بك Basil Abdallah 8 6,264 01-07-18, 01:21 AM
آخر رد: YousefOkasha
  مثال القراءة والكتابه على ملف تيكست Txt على الانترنت + مثال + شرح m.sami.ak 11 8,398 02-06-18, 09:46 PM
آخر رد: YousefOkasha

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


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