اذهب إلى المحتوى

Ali Haidar Ahmad

الأعضاء
  • المساهمات

    1068
  • تاريخ الانضمام

  • تاريخ آخر زيارة

  • عدد الأيام التي تصدر بها

    43

إجابات الأسئلة

  1. إجابة Ali Haidar Ahmad سؤال في كيفية استخراج جدول من موقع ويب باستخدام BeautifulSoup في بايثون كانت الإجابة المقبولة   
    علينا الوصول إلى الموقع ثم تحليل ملف ال HTML من خلال bs4. ثم كخطوة ثانية نذهب إلى الصفحة التي تطلبها، ستجد أن اسم ال class للجدول المطلوب يحمل اسم wikitable كما ويحوي عدة وسوم tr تمثل صفوف الجدول. بحيث أن علامة tr الأولى مخصصة لعناوين الجدول وأن وسوم tr الثانية مخصصة لبيانات الجدول.

    لذا تابع الكود:
    ###################################### خطوة 1##################################### # استيراد الوحدات اللازمة from bs4 import BeautifulSoup import requests # تحديد الموقع الهدف URL = "https://en.wikipedia.org/wiki/2019_Ballon_d%27Or" # والحصول على كائن الاستجابة URL طلب عنوان responseObj = requests.get(URL) # BeautifulSoup تحليل النص الذي تم الحصول عليه من خلال soup = BeautifulSoup(responseObj.text, 'lxml') # للأعمدة td يستخدم لإنشاء صفوف الجدول والوسم tr تذكر أن الوسم ###################################### خطوة 2##################################### # class وتحديد اسم ال find الآن سنقوم بالإمساك بالجدول من خلال استخدام الدالة gdp_table = soup.find("table", attrs={"class": "wikitable"}) # سنقوم بالامساك كل الصفوف المكون منها هذا الجدول gdp_table_data = gdp_table.tbody.find_all("tr") # إنشاء قائمة لوضع أسماء الأعمدة فيها headings = [] for th in gdp_table_data[0].find_all("th"): # أزل أي أسطر جديدة ومسافات زائدة من اليسار واليمين headings.append(th.text.replace('\n', ' ').strip()) # طباعتها print(headings) # ['Rank', 'Player', 'Club(s)', 'Points'] ###################################### خطوة3 ##################################### # إنشاء قائمة لنضع فيها البيانات table_data=[] # الإمساك بكل الصفوف عدة الصف الأول الذي يمثل العناوين for tr in gdp_table_data[1:]: # سنضع هنا بيانات كل سطر على حدى ثم سنضيفه للقائمة الأساسية row=[] for td in tr.find_all("td"): # أزل أي أسطر جديدة ومسافات زائدة من اليسار واليمين row.append(td.text.replace('\n', ' ').strip()) table_data.append(row) # طباعة بعض من بيانات الجدول print(table_data[0:3]) """ [['1', 'Lionel Messi', 'Barcelona', '686'], ['2', 'Virgil van Dijk', 'Liverpool', '679'], ['3', 'Cristiano Ronaldo', 'Juventus', '476']] """  
  2. إجابة Ali Haidar Ahmad سؤال في تحميل ملفات PDF باستخدام BeautifulSoup في بايثون كانت الإجابة المقبولة   
    لتحميل ملف PDF، يمكنك اتباع الخطوات التالية:
    1. استيراد مكتبتي BeautifulSoup  و requests.
    2. طلب عنوان URL والحصول على الاستجابة (من خلال مكتبة requests يمكننا تقديم الطلب والحصول على كائن استجابة).
    3. البحث عن جميع الروابط الموجودة على صفحة الويب.
    4. التحقق من وجود روابط PDF في تلك الروابط.
    5. الحصول على ملف ال PDF من خلال كائن الاستجابة.
    # استيراد الوحدات from bs4 import BeautifulSoup import requests # تحديد رابط الموقع الهدف url = "page_link" # والحصول على كائن الاستجابة url طلب عنوان responseObj = requests.get(url) # BeautifulSoup تحليل النص الذي تم الحصول عليه من خلال soup = BeautifulSoup(responseObj.text, 'lxml') # إيجاد كل الروابط allLinks = soup.find_all('a') pdfNum = 0 # نقوم بتحميله pdf الآن نقوم بالمرور على كل الروابط، وعند العثور على ملف for link in allLinks: if ('.pdf' in link.get('href', [])): pdfNum += 1 print("Downloading file number: ", pdfNum) # الحصول على كائن استجابة للرابط responseObj = requests.get(link.get('href')) # pdf كتابة المحتوى في ملف pdf = open("pdf"+str(pdfNum)+".pdf", 'wb') pdf.write(responseObj.content) pdf.close() print("File ", pdfNum, " downloaded") print("All PDF files downloaded")  
  3. إجابة Ali Haidar Ahmad سؤال في استخراج النصوص من الفقرات في صفحات الويب باستخدام BeautifulSoup في بايثون كانت الإجابة المقبولة   
    يمكنك القيام بذلك بالشكل التالي:
    # استيراد الوحدات from bs4 import BeautifulSoup import requests # تحديد العنوان url="https://undergrad.cs.umd.edu/what-computer-science" # والحصول على الصفحة GET إرسال طلب page = requests.get(url) # BeautifulSoup تحليل مكونات الصفحة باستخدام soup = BeautifulSoup(page.content, "lxml") # lxml استخدمنا المحلل # استخلاص كل الفقرات وعرضها for para in soup.find_all("p"): print(para.get_text()) الخرج:
    Computer Science is the study of computers and computational systems. Unlike electrical and computer engineers, computer scientists deal mostly with software and software systems; this includes their theory, design, development, and application. Principal areas of study within Computer Science include artificial intelligence, computer systems and networks, security, database systems, human computer interaction, vision and graphics, numerical analysis, programming languages, software engineering, bioinformatics and theory of computing. Although knowing how to program is essential to the study of computer science, it is only one element of the field. Computer scientists design and analyze algorithms to solve programs and study the performance of computer hardware and software. The problems that computer scientists encounter range from the abstract-- determining what problems can be solved with computers and the complexity of the algorithms that solve them – to the tangible – designing applications that perform well on handheld devices, that are easy to use, and that uphold security measures. Graduates of University of Maryland’s Computer Science Department are lifetime learners; they are able to adapt quickly with this challenging field. Contact Our Office  
  4. إجابة Ali Haidar Ahmad سؤال في استخراج قيمة سمة attribute ضمن ال tags باستخدام beautifulsoup في Python كانت الإجابة المقبولة   
    يمكنك القيام بذلك بالشكل التالي:
    # Import Beautiful Soup from bs4 import BeautifulSoup htmlDoc=''' <html> <h2 class="first second third"> Heading 1 </h2> <h1> Heading 2 </h1> </html> ''' # تحليل المكونات soup = BeautifulSoup(htmlDoc, "lxml") # الحصول على الوسم tag = soup.h2 #الحصول على قيمة السمة المطلوبة attribute = tag['class'] # طباعتها print(attribute) # ['first', 'second', 'third'] وبفرض كان لديك أكثر من وسم من نفس النوع استخدم findall:
    # Import Beautiful Soup from bs4 import BeautifulSoup htmlDoc=''' <html> <h2 class="v0"> Heading 1 </h2> <h2 class="v1"> Heading 2 </h2> <h2 class="v2"> Heading 3 </h2> <h1> Heading 2 </h1> </html> ''' # تحليل المكونات soup = BeautifulSoup(htmlDoc, "lxml") tags = soup.find_all('h2') for tag in tags: attribute = tag['class'] print(attribute) """ ['v0'] ['v1'] ['v2'] """ وبالتالي في مثال يمكنك القيام بذلك بالشكل التالي:
    # استيراد الوحدات from bs4 import BeautifulSoup import requests # تحديد العنوان url="https://www.imdb.com/title/tt5648202/" # GET إرسال طلب page = requests.get(url) # BeautifulSoup تحليل مكونات الصفحة باستخدام soup = BeautifulSoup(page.content, "lxml") # lxml استخدمنا المحلل # main الحصول على كل الوسوم التي تحمل اسم tags = soup.find_all('main') # نقوم بالمرور عليها واحدة تلو الأخرى for tag in tags: # الحصول على قيمة السمة المطلوبة attribute = tag['class'] # طباعتها print(attribute)  
  5. إجابة Ali Haidar Ahmad سؤال في البحث عن نص داخل tag محدد باستخدام BeautifulSoup في بايثون كانت الإجابة المقبولة   
    يمكنك اتباع الخطواط التالية:
    أولاً: استيراد الوحدات اللازمة وهما bs4 و request. ثانياُ: تحديد الصفحة الهدف وإرسال طلب GET. ثالثاً:  تحديد ال tag المطلوب واستخدام الدالة findall لإيجاده. رابعاً:  تحديد النص الهدف. خامساً: للبحث عن نص داخل ال tag، نحتاج إلى التحقق من شرط الاحتواء بمساعدة ال string function، حيث أن  ال string function ستُرجع النص الموجود داخل ال tag. وبالتالي نختبر احتواءه ونطبعه في حالة تحقق الشرط. كما في الكود التالي:
    # استيراد الوحدات from bs4 import BeautifulSoup import requests # https://academy.hsoub.com/ # تحديد رابط الموقع الهدف url = 'https://academy.hsoub.com/learn/computer-science/' # للصفحة GET إرسال طلب page = requests.get(url) # soup وإنشاء كائن BeautifulSoup تحليل مكونات الصفحة من خلال soup = BeautifulSoup(page.content, "html.parser") # والبحث عنه tag تحديد ال child_soup = soup.find_all('h2') # تحديد النص المطلوب text = 'دورة علوم الحاسوب' # سنبحث في العلامة التي يتطابق فيها النص مع النص المحدد for i in child_soup: if(i.string in text): print(i) # الخرج: # <h2 class="no-margin clr-white font-bold">دورة علوم الحاسوب</h2> في الكود السابق استخدمت حلقة for للبحث عن النص. وكحل بديل يمكنك استخدام lambda:
    # استيراد الوحدات from bs4 import BeautifulSoup import requests # تحديد رابط الموقع الهدف url = 'https://wiki.hsoub.com/?utm_source=academy.hsoub.com&utm_medium=Links&utm_campaign=HsoubFooter' # للصفحة GET إرسال طلب page = requests.get(url) # soup وإنشاء كائن BeautifulSoup تحليل مكونات الصفحة من خلال soup = BeautifulSoup(page.content, "html.parser") # النص text = 'Python' TAG="a" # عملية البحث نفسها لكن من خلال لمدا res = soup.find_all(lambda tag: tag.name == TAG and text in tag.text) # طباعة النتيجة print(res) # [<a href="/Python" title="Python">Python</a>]
  6. إجابة Ali Haidar Ahmad سؤال في إيجاد الوسوم tags من خلال فئة CSS باستخدام BeautifulSoup في بايثون كانت الإجابة المقبولة   
    اتبع الخطوات التالية: 
    أولاً: استيراد مكتبة bs4. ثانياً:  الحصول على مستند ال HTML المطلوب. ثالثاً: تحليل المحتوى ووضعه في كائن BeautifulSoup.
    رابعاً: البحث حسب فئة CSS : يمكننا القيام بذلك من خلال الوسيط المسمى  _class  (لا يمكن استخدام "class" لأن class كلمة محجوزة في بايثون وسيعطي المترجم خطأ قواعدي إذا تم استخدام "class" ك keyword argument). 
    خامساً: نستخدم الدالة find_all مع الوسيط المسمى class_ للعثور على جميع العلامات باستخدام فئة CSS المحددة (يمكنك استخدام الدالة find إذا أردت العثور على tag واحدة فقط). وأخيراً نقوم بطباعة ال tags المستخرجة.
    from bs4 import BeautifulSoup # HTML مستند document = """ <html> <head> <title> Hsoub Academy </title> </head> <body> <div class="ext" >Extract this tag</div> </body> </html> """ # بناء دالة لاستخراج العلامات def find_tags_from_class(htmlDoc): # HTML تحليل محتويات ملف ال soup = BeautifulSoup(htmlDoc, "html.parser") # css البحث عن العلامات حسب فئة res = soup.find("div", class_= "ext") # طباعتها print(res) # استدعاء الدالة find_tags_from_class(document) # الخرج: # <div class="ext">Extract this tag</div> مثال آخر، في حالة استخدام الدالة find_all من أجل إيجاد جميع ال tags:
    # Import Module from bs4 import BeautifulSoup document = """ <html> <head> <title> Hsoub Academy </title> </head> <body> <table> <tr> <td class = "table-row"> t1 </td> <td class = "table-row"> t2 </td> <td class = "table-row"> t3 </td> </tr> </table> </body> </html> """ def find_tags_from_class(htmlDoc): soup = BeautifulSoup(htmlDoc, "html.parser") res = soup.find_all("td", class_= "table-row") for row in res: print(row) find_tags_from_class(document) # الخرج: """ <td class="table-row"> t1 </td> <td class="table-row"> t2 </td> <td class="table-row"> t3 </td> """ مثال آخر عن البحث عن العلامات بواسطة فئة CSS من موقع ويب:
    from bs4 import BeautifulSoup import requests # تعيين الموقع import requests URL = "https://academy.hsoub.com/" HTML_DOC = requests.get(URL) # Function to find tags def find_tags_from_class(html): soup = BeautifulSoup(html.content, "html5lib") div = soup.find("div", class_= "body") print(div) find_tags_from_class(HTML_DOC)  
  7. إجابة Ali Haidar Ahmad سؤال في تثبيت مكتبة beautifulsoup4 في بايثون كانت الإجابة المقبولة   
    Windows Machine:
    قم بفتح التيرمينال وقم بتنفيذ السطر التالي:
    pip install beautifulsoup4 Linux Machine:
    لتثبيت bs4 على Debian أو Ubuntu linux باستخدام مدير حزمة النظام ، قم بتشغيل الأمر التالي:
    $sudo apt-get install python-bs4 (for python 2.x) $sudo apt-get install python3-bs4 (for python 3.x) كما يمكنك تثبيت bs4 باستخدام easy_install أو pip (في حالة وجود مشكلة في التثبيت باستخدام برنامج حزم النظام).
    $easy_install beautifulsoup4 $pip install beautifulsoup4 هذا ما تحتاجه بالنسبة لتحميل الحزمة بالنسبة للأنظمة المختلفة.
    Installing a Parser:
    الآن بالنسبة لتثبيت المحلل، فبشكل افتراضي ، يدعم Beautiful Soup محلل HTML المضمن في مكتبة Python ، ولكنه يدعم أيضاً العديد من محللات python الخارجية مثل lxml parser أو html5lib parser. ولتثبيتهم:
    Linux Machine: $apt-get install python-lxml $apt-get insall python-html5lib Windows Machine: $pip install lxml $pip install html5lib بشكل عام ، يُفضل استخدام lxml لأنه أسرع.
  8. إجابة Ali Haidar Ahmad سؤال في على ماذا نعتمد عند تحديد حجوم المرشحات؟ كانت الإجابة المقبولة   
    يعتمد حجم وعدد المرشحات على مدى تعقيد الصورة وتفاصيلها. بالنسبة للصور الصغيرة والبسيطة (مثل Mnist) ، ستحتاج إلى مرشحات 3x3 أو 5x5 وبعضها (4 ، ثم 8 ، حتى 16) لاكتشاف الخطوط المستقيمة والمنحنيات والأشكال المائلة وربما بعض درجات الألوان ؛ بينما بالنسبة للصور الأكبر (مثل الوجوه أو المناظر الطبيعية) ، قد تكون هناك حاجة إلى حقل تقبلي أكبر مع مرشحات 7 × 7 أو 9 × 9 أو 11 × 11 ، والبدء بـ 32 ثم 64 وما إلى ذلك لتمييز المزيد من الأشكال والأنسجة. ونستخدم مضاعفات العدد 2 لعدد المرشحات لأن المرشحات ترتبط بخرائط الميزات التي سيتم تسويتها في النهاية، لذلك فإن الأمر يتعلق بتنظيم ذاكرة الوصول العشوائي بشكل أفضل. أنا بالنسبة لقيم هذه المرشحات فالشبكات العصبية التلافيفية هي (عادةً) طرق خاضعة للإشراف للتعرف على الصور / الأشياء. هذا يعني أنك بحاجة إلى تدريب CNN باستخدام مجموعة من الصور المصنفة. وهذا يسمح بتحسين أوزان المرشحات التلافيفية، وبالتالي فإن المرشحات تشكل نفسها، بحيث تسعى لتقليل الخطأ. إذاً يمكنك تهيئتها بقيم عشوائية، والسماح للتعلم بالقيام بالعمل (خوارزمية Gradient descent). كما يمكنك بالطبع تعريف مرشحات بقيم محددة (اسخدام مرشحات مثل سوبل وغيره) لكن لاداعي لذلك.
  9. إجابة Ali Haidar Ahmad سؤال في هل يمكن تحميل تطبيق Cobra IPTV للكمبيوتر مجانا ؟ كانت الإجابة المقبولة   
    سبق وأجبتك هنا أخي الكريم... تحتاج إلى محاكي آندرويد، بعد ذلك قم بتحميل تطبيقك وتثبيته.
  10. إجابة Ali Haidar Ahmad سؤال في كيفية تغيير سطوع الصورة brightness باستخدام OpenCV في بايثون كانت الإجابة المقبولة   
    قم بتحويل فضاء الألوان إلى HSV، حيث أن فضاء الألوان HSV  مكون من اللونية Hue ودرجة الإشباع Saturation و درجة الإضاءة Value وبالتالي يمكننا التحكم بدرجة الإضاءة من خلال قيمة ال Value. وبالتالي نقوم بالتحويل إلى هذا الفضاء  ثم باستخلاص قناة ال v (value) ثم قم بزيادة قيمتها بالدرجة التي تحتاجها ثم أعد تركيب القنوات. وأخيراً قم بالتحويل من جديد إلى BGR أو RGB.
    def incb(image, value=0): #HSV التحويل إلى فضاء hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV) # value استخلاص قناة ال h, s, v = cv2.split(hsv) # في حالة كانت القيمة التي نريد إضافتها تجعل قيمة البكسل أكبر من 255 نقوم بتثبيت # القيمة على 255 لأن الصورة يجب أن تكون أعلى قيمة فيها 255 l = 255 - value v[v > l] = 255 v[v <= l] += value image = cv2.merge((h, s, v)) return cv2.cvtColor(image, cv2.COLOR_HSV2BGR) مثال. لدينا الصورة التالية:

    import cv2 # قراءة صورة image=cv2.imread("/content/test.jpg") # زيادة السطوع بمقدار 30 درجة im=incb(image,30) # عرضها from google.colab.patches import cv2_imshow cv2_imshow(im) النتيجة:

  11. إجابة Ali Haidar Ahmad سؤال في عرض الرسوم البيانية plot في Matplotlib في بايثون كانت الإجابة المقبولة   
    1.  إنشاء الرسوم البيانية الخاصة بك ثم عرضها في النهاية من خلال الدالة plt.show:
    matplotlib.pyplot.imshow(X, cmap=None, alpha=None) # X: الصورة # cmap: اسم خريطة الألوان التي تريد استخدامها (وسيط اختياري) # alpha: شفافية الصورة وتأخذ قيمة بين 0 و 1 (اختياري) مثال:
    import matplotlib.pyplot as plt # تعريف بيانات عشوائية x = np.linspace(-2, 2, 50) y1 = x**3 y2 = x**2 # رسمها plt.plot(x, y1) plt.plot(x, y2) # تسمية المحاور plt.xlabel('x - axis') plt.ylabel('y - axis') # وضع عنوان عام plt.title('My first graph!') # لعرضهم show استخدام الدالة plt.show() 2. إنشاء الرسوم البيانية الخاصة بك وعرضها في لحظة إنشاءها من خلال استدعاء الوحدة interactive وتفعيلها:
    import matplotlib.pyplot as plt import numpy as np from matplotlib import interactive interactive(True) # تفعيلها # تعريف بيانات عشوائية x = np.linspace(-2, 2, 50) y1 = x**3 y2 = x**2 # رسمها plt.plot(x, y1) input('press return to continue') plt.plot(x, y2) input('press return to end') 3. توفر مكتبة matplotlib الأداة savefig لتخزين الرسم البياني الناتج:
    savefig(fname, dpi=None, format=None,bbox_inches=None) حيث أن الوسيط الأول يمثل المسار الذي تود فيه حفظ الملف الناتج، وال dpi أو dots per inch (وهي وحدة قياس تحدد عدد النقاط الفردية التي يمكن وضعها في مربع 1 × 1 بوصة) وزيادتها تؤدي لزيادة حجم الصورة. أما الوسيط الثالث فهو لتحديد الصيغة التي سيتم فيها حفظ الشكل البياني أي 'png', 'pdf', 'svg' ...إلخ. أما الوسيط الأخير ففي حال ضبطه على tight سيتم إزالة المسافة البيضاء الغير مرغوب فيها التي تكون حول الرسم البياني.
    import matplotlib.pyplot as plt fig, ax = plt.subplots( nrows=1, ncols=1 ) #figure إنشاء ax.plot([0,1,2], [10,20,3]) fig.savefig('to.png') # حفظه plt.close(fig) # figure إغلاق ال  
  12. إجابة Ali Haidar Ahmad سؤال في حذف ال legend من ال figure في Matplotlib في بايثون كانت الإجابة المقبولة   
    سأعطيك طريقتين لحذفها، الأولى من خلال استخدام الدالة ()ax.get_legend().remove :
    import numpy as np import matplotlib.pyplot as plt # تعريف بيانات عشوائية x = np.linspace(-2, 2, 50) y1 = x**3 y2 = x**2 # رسم الدوال fig, ax = plt.subplots() ax.plot(x, y1, c = 'black',label = 'x^3') ax.plot(x, y2, c = 'c',label = 'x^2') # إنشاء صندوق البيانات leg = plt.legend() # حذفه ax.get_legend().remove() plt.show() في حالة وجود أكثر من supplot ، يمكننا أن نذكر الكائن axes المطلوب الذي نريد إزالة ال legend الخاص بك:
    import numpy as np import matplotlib.pyplot as plt # تعريف بيانات عشوائية x = np.linspace(-2, 2, 50) y1 = x**3 y2 = x**2 # رسم الدوال fig, axs = plt.subplots(2, 1) axs[0].plot(x, y1, c = 'r',label = 'x^3') axs[1].plot(x, y2, c = 'black',label = 'x^2') axs[0].legend(loc = 'upper left') # صندوق بيانات للرسم الأول axs[1].legend(loc = 'upper left') # صندوق للرسم الثاني # سنحذف صندوق البيانات من الرسمة الثانية axs[1].get_legend().remove() plt.show() أو عن طريق الدالة ax.get_legend().set_visible(False) كما في المثال التالي:
    import numpy as np import matplotlib.pyplot as plt # تعريف بيانات عشوائية x = np.linspace(-2, 2, 50) y1 = x**3 y2 = x**2 # رسم الدوال fig, ax = plt.subplots() ax.plot(x, y1, c = 'black',label = 'x^3') ax.plot(x, y2, c = 'c',label = 'x^2') # إنشاء صندوق البيانات leg = plt.legend() # حذفه ax.get_legend().set_visible(False) plt.show()  
  13. إجابة Ali Haidar Ahmad سؤال في عرض الصورة بالصيغة الرمادية باستخدام الدالة imshow من Matplotlib في بايثون كانت الإجابة المقبولة   
    يمكنك القيام بذلك بالشكل التالي:
    import numpy as np import matplotlib.pyplot as plt from PIL import Image # مسار الصورة path = r"/content/test.jpg" # PIL فتح الصورة من خلال الحزمة image = Image.open(path) # عرضها plt.imshow(image) plt.show() الآن لعرض صورة بالتدرج الرمادي نفتح الصورة باستخدام الدالة open من الحزمة PIL ونقوم بتحويلها إلى الوضع L  من خلال الدالة convert  وهذا يعني أنها صورة ذات قناة واحدة أي تفسر على أنها تدرج رمادي. يخزن فقط التدرج الرمادي وليس اللون. ثم نقوم برسم الصورة من خلال الدالة imshow مع ضبط الخريطة اللونية  cmap على "gray":
    import numpy as np import matplotlib.pyplot as plt from PIL import Image # مسار الصورة path = r"/content/test.jpg" # PIL فتح الصورة من خلال الحزمة image = Image.open(path).convert("L") # عرضها بالصيغة الرمادية plt.imshow(image, cmap='gray') plt.show() وإذا كنت تريد عرض عكس التدرج الرمادي ، فقم بضبط cmap على gray_r.
  14. إجابة Ali Haidar Ahmad سؤال في إضافة ضجيج Gaussian أو salt and pepper إلى الصورة في OpenCV في بايثون كانت الإجابة المقبولة   
    لا يوجد تابع جاهز. لكن المثال التالي يبين لك كيفية إضافته، فكما نعلم إن الضجيج الغاوصي هو ضوضاء أو تشويش له دالة كثافة احتمالية مساوية لدالة الكثافة الاحتمالية للتوزيع الطبيعى (normal distrbution). وبالتالي يمكننا استخدام الدالة np.random.normal التي تعطي عينات عشوائية من التوزيع الطبيعي (غاوسي)، لتشكيل مصفوفة من هذه العينات (مطابقة بالحجم لحجم الصورة) ثم إضافتها إلى الصورة الأصلية ( هو ضجيج جمعي). 
    random.normal(loc=0.0, scale=1.0, size=None) حيث نمرر للوسيط Size أبعاد الصورة نفسها، والوسيط loc يمثل الوسيط Mean أي مركز التوزيع، والوسيط scale يمثل الانحراف المعياري (الانتشار أو العرض) للتوزيع. ويجب أن تكون غير سالبة.  انظر للمثال:
    import cv2 as cv import numpy as np import matplotlib.pyplot as plt # قراءة الصورة image=cv.imread("/content/gray.png",0) # قراءتها بالحالة الرمادية # إضافة الضجيج الغاوصي لها بشكل يدوي gauss=np.random.normal(0,1.0,image.shape).astype('uint8') gauss_image=cv.add(image,gauss) # عرض النتائج plt.figure(figsize=(25,15)) plt.subplot(131) plt.imshow(image, cmap='gray') plt.title("gray_image") plt.subplot(132) plt.imshow(gauss_image, cmap='gray') plt.title("gray_image with noise") والنتيجة:

    وهنا قمت بإنشاء تابع لك لإضافة الضجيج الغاوصي:
    import cv2 import numpy as np def gausseanNoise(image): gauss = np.random.normal(0,1.0,image.shape).astype('uint8') return cv2.add(image,gauss) وهنا تابع لإضافة ضجيج الملخ والفلفل حيث أن هذا الضجيج هو عبارة عن ثقوب بيضاء (ملح) وسوداء (فلفل) في الصورة وبالتالي أصفار و واحدات. كما تجدر الملاحظة إلى أن هذا الضجيج يطبق فقط على الصور الرمادية:
    import random import cv2 def s_p_noise(img): row , col = img.shape # أبعاد الصورة # اختيار بعض وحدات البكسل في الصورة عشوائياً لتلوينها باللون الأبيض number_of_pixels = random.randint(300, 10000) # بين ال 300 و 10000 وحدة for i in range(number_of_pixels): # اختيار إحداثي عيني بشكل عشوائي y_coord=random.randint(0, row - 1) # إحداثي سيني عشوائي x_coord=random.randint(0, col - 1) # جعله أبيض img[y_coord][x_coord] = 255 # الآن نفس الأمر لكن نريد الأسود number_of_pixels = random.randint(300 , 10000) for i in range(number_of_pixels): y_coord=random.randint(0, row - 1) x_coord=random.randint(0, col - 1) img[y_coord][x_coord] = 0 return img  
  15. إجابة Ali Haidar Ahmad سؤال في مشكلة في استخدام الرمز n\ مع الدالة putText في OpenCV في بايثون كانت الإجابة المقبولة   
    الدالة putText لا تتعامل مع رموز مثل n\، لذا أنت مجبر على التعامل مع هذا الأمر بشكل يدوي، لذا إليك حل لمشكلتك:
    نقوم بقسم النص إلى عدة أسطر من خلال الدالة split حيث تكون عملية التقسيم على أساس ظهور الرمز n\:
    your_text.split('\n') ==> ['Yesterday I was clever.. ', 'so I wanted to change the world.'] ثم نقوم بالمرور على هذه الأسطر وإضافتها واحداً تلو الآخر، لكن قبل ذلك يجب أن نقوم بتحديد الموضع الابتدائي للإحداثي y (ارتفاع المكان الذي سنضع فيه أول سطر):
    y0= 50 # 100 فلن نتلاعب به وسيبقى كما حددته في البداية أي x أما الإحداثي y الإحداثي ثم يجب أن نقوم بتحديد مسافة الانتقال بالبكسل (الانتقال من السطر الأول للثاني):
    dy = 40 # 40 بكسل ثم داخل الحلقة يجب أن نعرَف معادلة لطباعة باقي الأسطر وتحقيق الانتقال:
    for i, line in enumerate(your_text.split('\n')): y = y0 + i*dy cv2.putText(image,line , (100,y), font, fontScale, color, thickness, cv2.LINE_AA) وبالتالي يكون الكود بعد التعديل:
    import cv2 # قراءة الصورة image = cv2.imread("/content/test.jpg") # الخط font = cv2.FONT_HERSHEY_SIMPLEX # الإحداثيات org = (100, 50) # fontScale fontScale = 1 # red color in BGR color = (0, 0, 255) # السماكة thickness = 2 # استخدام cv2.putText() your_text='Yesterday I was clever.. \nso I wanted to change the world.' y0= 50 dy = 40 for i, line in enumerate(your_text.split('\n')): y = y0 + i*dy cv2.putText(image,line , (100,y), font, fontScale, color, thickness, cv2.LINE_AA) cv2.imshow( image) cv2.waitKey(0) cv2.destroyAllWindows() والنتيجة:

  16. إجابة Ali Haidar Ahmad سؤال في إضافة أسماء labels للمحاور X و Y في Matplotlib أو Pandas في بايثون كانت الإجابة المقبولة   
    في حالة كنت تستخدم الدالة plot من pandas أو Matplotlib فلا فرق، حيث في كلاهما يمكنك استخدام الوسيط xlabel لتسمية المحور الأفقي والوسيط ylabel لتسمية المحور العمودي، كما ويمكنك إضافة عنوان للرسم من خلال الوسيط title كما يلي:
    import numpy as np import pandas as pd # إنشاء داتافريم مكون من عمودين d = {'col_1' : np.arange(20), 'col_2' : np.arange(20,60,2)**8} df = pd.DataFrame(d) # تمثيلهما بيانياً df.plot(x='col_1', y='col_2', style='-',xlabel='X Label', ylabel='Y Label', title='Plot Title') والنتيجة:

    أو يمكنك كذلك تسمية المحور الأفقي والعمودي (بشكل غير مباشر) من خلال كائن ال axes (الذي يمثل ال plot) حيث أن الدالة plot تعيد (ترجع return) كائن matplotlib.axes.AxesSubplot يمكنك أن تستخدم معه الدالة set_xlabel و set_ylabel لتأدية المطلوب:
    import numpy as np import pandas as pd # إنشاء داتافريم مكون من عمودين d = {'col_1' : np.arange(20), 'col_2' : np.arange(20,60,2)**8} df = pd.DataFrame(d) # تمثيلهما بيانياً ax=df.plot(x='col_1', y='col_2', style='-') ax.set_xlabel("x label") ax.set_ylabel("y label") أو من خلال الدالتين plt.xlabel و plt.ylabel كما يلي:
    import numpy as np import pandas as pd # إنشاء داتافريم مكون من عمودين d = {'col_1' : np.arange(20), 'col_2' : np.arange(20,60,2)**8} df = pd.DataFrame(d) # تمثيلهما بيانياً df.plot(x='col_1', y='col_2', style='-') plt.xlabel('xlabel') plt.ylabel('ylabel')
  17. إجابة Ali Haidar Ahmad سؤال في تحديد عدد النقاط التي تظهر ضمن ال Legend في Matplotlib في بايثون كانت الإجابة المقبولة   
    يمكنك استخدام الوسيط numpoints لتحديد عدد النقاط التي ستظهر:
    import matplotlib.pyplot as plt import numpy as np x = np.linspace(-10, 10, 1000) f=x**2+30 plt.plot(x, f, label="Gradient descent") i = 0 j = 30 plt.plot(i, j, "ko",color="red", label="Global Optimum") plt.legend(numpoints=2) plt.xlabel("X") plt.ylabel("Y") plt.show() والنتيجة:

    أو يمكنك استخدام rcParams لتحديدها بالشكل التالي (هنا ستطبق التغيرات على كامل الرسوم في الملف):
    import matplotlib as mpl mpl.rcParams['legend.numpoints'] = 1 # تحديد نقطة وحيدة
  18. إجابة Ali Haidar Ahmad سؤال في حذف المسافات البيضاء التي تظهر حول الصورة بعد حفظها في Matplotlib في بايثون كانت الإجابة المقبولة   
    لا يكفي استخدام bbox_inches وحده. الوسيطتان bbox_inches و pad_inches هما من يتحكمان بهذا الأمر سويَاً. فمهمة bbox_inches عندما تقوم بضبطه على "tight" هي ملائمة وضع (position) ال figure ضمن الصورة أو الملف أي أنه يستخدم لملاءمة الشكل المحفوظ بشكل مناسب. و pad_inches تستخدمه ((معه)) لتحديد المساحة المتروكة (الفارغة) حول الشكل المحفوظ. لاحظ المثال التالي (قمت بتلوين الخلفية باللون الأصفر للوضوح أكثر):
    import matplotlib.pyplot as plt # سأقوم برسم هيستوغرام لبيانات عشوائية plt.hist([1, 4, 9, 16, 25, 36, 49, 64, 81, 100]) # حفظ الشكل plt.savefig("squares1.png", bbox_inches ="tight", transparent = True, facecolor ="y", edgecolor ='b', orientation ='landscape') # عرضه plt.show() والنتيجة:

    الآن لو قمنا بعرض الصورة التي تم حفظها ستظهر لنا مشكلتك:
    from IPython.display import Image Image(filename='/content/squares1.png') والنتيجة:

    لاحظ وجود الهوامش.
    الآن لو قمنا بضبط الوسيط pad_inches على 0 (أي الهوامش من كل الاتجاهات تساوي 0 بوصة):
    import matplotlib.pyplot as plt # سأقوم برسم هيستوغرام لبيانات عشوائية plt.hist([1, 4, 9, 16, 25, 36, 49, 64, 81, 100]) # حفظ الشكل plt.savefig("squares2.png", bbox_inches ="tight", pad_inches =0.0, transparent = True, facecolor ="y", edgecolor ='b', orientation ='landscape') ثم لو قمنا بعرض الصورة التي تم حفظها:
    from IPython.display import Image Image(filename='/content/squares2.png') والنتيجة:

  19. إجابة Ali Haidar Ahmad سؤال في تغيير نمط style نقاط البيانات على الخط line عند استخدام الدالة plot في Matplotlib في بايثون كانت الإجابة المقبولة   
    الدالة plot لديها بعض ال kwargs التي تعطيك القدرة على تنفيذ ماتحتاجه حيث يمكنك استخدام الوسيط linestyle لتحديد نمط الخط نفسه (الخط الواصل بين نقاط البيانات) و الوسيط marker لتغيير نمط نقاط البيانات. وهناك العديد من الأنماط التي يمكنك استخدامها لنقاط البيانات marker:
    ================ =============================== character description ================ =============================== - solid line style -- dashed line style -. dash-dot line style : dotted line style . point marker , pixel marker o circle marker v triangle_down marker ^ triangle_up marker < triangle_left marker > triangle_right marker 1 tri_down marker 2 tri_up marker 3 tri_left marker 4 tri_right marker s square marker p pentagon marker * star marker h hexagon1 marker H hexagon2 marker + plus marker x x marker D diamond marker d thin_diamond marker | vline marker _ hline marker ================ =============================== والخط linestyle:
    lineStyles '-' : '_draw_solid' '--' : '_draw_dashed' '-.' : '_draw_dash_dot' ':' : '_draw_dotted' 'None' : '_draw_nothing' ' ' : '_draw_nothing' '' : '_draw_nothing' مثال:
    import matplotlib.pyplot as plt import numpy as np x = np.linspace(-10, 10, 30) plt.plot(x, x,linestyle='--', marker='x',color="red") plt.legend(['y = x'], loc='upper left') plt.show() النتيجة:

  20. إجابة Ali Haidar Ahmad سؤال في إضافة إطار إلى الصورة باستخدام OpenCV في بايثون كانت الإجابة المقبولة   
    يمكنك استخدام الدالة copyMakeBorder للقيام بالمطلوب:
    cv2.copyMakeBorder(src, top, bottom, left, right, borderType, value) حيث أن الوسيط الأول هو الصورة، والثاني هو عرض الإطار العلويَ الذي سيضاف إلى الصورة مقدراً بالبكسل، والثالث عرض الإطار السفلي، والرابع اليساري والخامس اليميني، أما borderType فهو نوع الحدود المراد إضافتها. يتم تعريفه بواسطة واصفات مثل:
    cv2.BORDER_CONSTANT: يضيف حداً ملوناً ثابتاً (نضع قيمة للوسيط value).
    cv2.BORDER_REFLECT: ستكون الحدود انعكاساً عكسياً لعناصر الحدود. أي مثلاً إذا كانت الصورة تحتوي على أحرف "abcdefg" ، فسيكون الإخراج "gfedcba | abcdefg | gfedcba".
    cv2.BORDER_REFLECT_101 أو cv2.BORDER_DEFAULT: يقوم بنفس عمل cv2.BORDER_REFLECT ولكن مع تغيير طفيف. أي مثلاً إذا كانت الصورة تحتوي على أحرف "abcdefgh" ، فسيكون الإخراج "gfedcb | abcdefgh | gfedcba".
    cv2.BORDER_REPLICATE: يكرر العنصر الأخير. لنفترض إذا كانت الصورة تحتوي على أحرف "abcdefgh" ، فسيكون الإخراج "aaaaa | abcdefgh | hhhhh".
    أما الوسيط الأخير فهي وسيطة اختيارية تحدد لون الحدود إذا كان نوع الحد هو cv2.BORDER_CONSTANT.
    مثال:
    import cv2 # تحديد مسار الصورة path = r'/content/test.jpg' # قراءة الصورة image = cv2.imread(path) # إضافة الإطار سماكته 7 بكسل بكل الاتجاهات image = cv2.copyMakeBorder(image, 7, 7, 7, 7, cv2.BORDER_CONSTANT, None, value = (0,0,255)) # عرض الصورة from google.colab.patches import cv2_imshow cv2_imshow(image) النتيجة:

  21. إجابة Ali Haidar Ahmad سؤال في رسم خطوط شبكة grid للرسم البياني في Matplotlib كانت الإجابة المقبولة   
    نستخدم الدالة grid لإضافة شبكة إلى البيان الخاص بك أيَاً كان نوعه:
    matplotlib.pyplot.grid(b=None, which=’major’, axis=’both’, **kwargs) حيث أن الوسيط الأول قيمة منطقية لتحديد ما إذا كان سيتم إظهار خطوط الشبكة أم لا. الافتراضي هو True. أما الوسيط which لتحديد الخطوط التي ستطبق عليها التغيرات وتأخذ القيم {‘major’, ‘minor’, ‘both’} أي على كلا الخطوط أو على الخطوط الثانوية فقط أو الرئيسية فقط (الافتراضي). والوسيط axis  لتحديد المحور المراد تطبيق التغييرات عليه {‘both’, ‘x’, ‘y’}. وأخيراً kwargs تمثل مجموعة خيارات أخرى مثل حجمها ولونها ونوع الخطوط وسماكتها يمكنك إضافتها (سأذكر أهمها في المثال).
    وبالتالي يكون الكود:
    import matplotlib.pyplot as plt import numpy as np from matplotlib import colors from matplotlib.ticker import PercentFormatter # إنشاء بيانات عشوائية N_points = 984 n_bins = 15 # إنشاء توزيع x = np.random.randn(N_points) y = .8 ** x + np.random.randn(984) + 25 legend = ['distribution'] # إنشاء الهيستوغرام fig, axs = plt.subplots(1, 1, figsize =(10, 7), tight_layout = True) #ticks حذف العلامات axs.xaxis.set_ticks_position('none') axs.yaxis.set_ticks_position('none') # إضافة شبكة إلى الخلفية axs.grid(b = True, color ='grey', linestyle ='-.', linewidth = 0.5, alpha = 0.6) # إضافة نص للشكل fig.text(0.9, 0.15, 'Histogram', fontsize = 13,color ='red',ha ='right', va ='top',alpha = 0.7) # plot حذف خطوط حاويةال for s in ['top', 'bottom', 'left', 'right']: axs.spines[s].set_visible(False) #وضع مسافة بين التسميات وبين المحاور axs.xaxis.set_tick_params(pad = 4) axs.yaxis.set_tick_params(pad = 8) # إنشاء الهستوغرام N, bins, patches = axs.hist(x, bins = n_bins) # تحديد الألوان fracs = ((N**(9)) / N.max()) norm = colors.Normalize(fracs.min(), fracs.max()) for thisfrac, thispatch in zip(fracs, patches): color = plt.cm.viridis(norm(thisfrac)) thispatch.set_facecolor(color) # تسمية للمحاور plt.xlabel("X-axis") plt.ylabel("y-axis") plt.legend(legend) # عنوان plt.title('Histogram') # عرض plt.show() الخرج:

  22. إجابة Ali Haidar Ahmad سؤال في تحويل نمط الصورة من float64 إلى uint8 في بايثون و OpenCV كانت الإجابة المقبولة   
    نعم، الحل يتجلى بعمل تقييس لبياناتك، أو ما ندعوه في علم معالجة الصورة بال normalization وهو تخفيض مجال تمثيل البيانات دون الإخلال بالمجال الديناميكي للصورة (نطاق اختلاف الدرجة اللونية بين الضوء الأفتح والأغمق في الصورة). حيث سنقوم بقسمة قيمة كل بكسل على أكبر قيمة محتملة لنوع البيانات الخاص بصورتك وهذا نحصل عليه من خلال الدالة np.iinfo التي تعطيك القيمة القصوى المحتملة (ضمن حدود الآلة الخاصة بك) لنمط البيانات. وبالتالي نحصل على صورة بقيم بين ال 0 وال 1، وبعد ذلك نقوم بضرب الناتج ب 255 وهكذا نكون حصلنا على  المطلوب، ثم يتبقى لنا الإعلان بشكل صريح عن أن المصفوفة بالنمط uint8  لذا نستخدم الدالة astype
    # .. # .. info = np.iinfo(data.dtype) # normalization data = (data.astype(np.float64) / info.max)*255 img = data.astype(np.uint8) # .. # .. كحل آخر،  بالنسبة لعمليةالتنعيم يمكنك استخدام الدالة cv2.normalize مع تحديد النوع NORM_MINMAX لتنفيذ خطوة ال normalization اعتماداً على استخدام معادلة الmin-max لتطبيق عملية التقييس:
    zi=(xi−min(x))/(max(x)−min(x)) وبالتالي تكون خطوة التقييس:
    cv2.normalize(src=image, alpha=0, beta=255, norm_type=cv2.NORM_MINMAX, dtype=cv2.CV_8U)  
  23. إجابة Ali Haidar Ahmad سؤال في صورة المعكوس أو المتمم باستخدام OpenCV في بايثون كانت الإجابة المقبولة   
    يمكنك استخدام الدالة bitwise_not لإيجاد صورة المعكوس (المتمم) للصورة الأصلية، حيث نمرر الصورة للدالة وهي تتكفل بإنتاجها حيث تكون قيمة كل بكسل في الصورة الناتجة هي المتمم إلى 255 لقيمة البكسل الأصلية. فمثلاً لو كانت قيمة البكسل في الصورة الأصلية 100 ستكون قيمته في الصورة الناتجة 155 لأن:
    255-100=155 مثال:
    import cv2 import numpy as np # قراءة الصورة image = cv2.imread('/content/test.jpg') # تحويلها إلى الصيغة الرمادية image=cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # عكس الصورة inverted = cv2.bitwise_not(image) from google.colab.patches import cv2_imshow cv2_imshow(image) cv2_imshow(inverted) الصورة الأصلية:

    الصورة الناتجة:

    كما يمكنك استخدام الدالة np.invert التي تؤدي نفس الغرض:
    import cv2 import numpy as np image = cv2.imread('/content/test.jpg') # تحويلها إلى الصيغة الرمادية image=cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # عكس الصورة inverted = np.invert(image) from google.colab.patches import cv2_imshow cv2_imshow(image) cv2_imshow(inverted)  
  24. إجابة Ali Haidar Ahmad سؤال في رسم دوائر فارغة لتمثيل نقاط البيانات باستخدام Matplotlib في بايثون كانت الإجابة المقبولة   
    يمكنك استخدام الوسيط edgecolors لتحديد لون الحدود و الوسيط facecolors لتحديد لون الدائرة نفسها، وفي حالة أردت أن تكون الدوائر بدون لون (مفرغة) قم بتعيين القيمة none لل facecolors كما في المثال التالي:
    import matplotlib.pyplot as plt import numpy as np dataX = np.random.randn(100) dataY = np.random.randn(100) plt.scatter(dataX, dataY, facecolors='none', edgecolors='black',s=70) plt.show() حيث يمكنك التحكم بحجم الدوائر من خلال الوسيط s الذي يمثل حجمها. والنتيجة:

  25. إجابة Ali Haidar Ahmad سؤال في كيفية رسم مستطيل على الصورة باستخدام Matplotlib في بايثون كانت الإجابة المقبولة   
    يمكنك استخدام الدالة Rectangle من الوحدة patches لإضافة حقل يمثل مستطيل:
    matplotlib.pyplot.patches.Rectangle(xy, width, height, angle=0.0, **kwargs) xy: النقطة اليسرى السفلية لبدء رسم المستطيل.  width: عرض المستطيل. height: ارتفاع المستطيل. angle: زاوية دوران المستطيل. مثال:
    import matplotlib.patches as patches import matplotlib.pyplot as plt from PIL import Image import numpy as np # قراءة الصورة im = Image.open('/content/test.jpg') # تحويل الصورة إلى مصفوفة im = np.array(im, dtype=np.uint8) plt.imshow(im) # axes و figure تعريف fig, axs = plt.subplots(1) axs.imshow(x) # إنشاء مستطيل rectangle =patches.Rectangle((317, 60), 200, 100, linewidth=1, edgecolor='r', facecolor='None') # إضافة ال المستطيل axs.add_patch(rectangle) # عرض plt.show() الوسيط edgecolor يتحكم بلون حدود المستطيل والوسيط facecolor يتحكم بلونه. والوسيط linewidth يتحكم بسماكة الحدود. والدالة add_patch نستخدمها لإضافة الشكل (الذي يمثل المستطيل) إلى الصورة الموجودة ضمن ال axes.
    النتيجة:


×
×
  • أضف...