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

Ali Haidar Ahmad

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

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

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

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

    43

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

  1. إجابة Ali Haidar Ahmad سؤال في رسم عدة خطوط بألوان مختلفة ضمن نفس الشكل figure في Matplotlib كانت الإجابة المقبولة   
    يمكنك استخدام الدالة plot مع الوسيط color كما في المثال التالي:
    import matplotlib.pyplot as plt import numpy as np x = np.linspace(-10, 10, 30) plt.plot(x, x,color="red") plt.plot(x, 8 * x,color="blue") plt.plot(x, 6 * x,color="black") plt.plot(x, 5 * x,color="c") plt.plot(x, 4 * x,color="brown") # ويمكنك إضافة صندوق توضيح للبيانات كما يلي plt.legend(['y = x', 'y = 8x', 'y = 6x', 'y = 5x', 'y = 4x'], loc='upper left') plt.show() النتيجة:

    كما يمكنك التحكم بالألوان من خلال الدالة set_color_cycle:
    plt.gca().set_color_cycle(['color1', 'color2', 'color3', 'color4','color5']) مثال2: سنقوم هنا برسم عدة رسوم وسنعطيها ألواناً مختلفة من خريطة لونية محددة:
    import matplotlib.pyplot as plt import numpy as np # عدد الخطوط التي تريدها num_plots = 25 # colormaps اختيار خريطة لونية معينة # Accent هنا سمختار الخريطة اللونية colormap = plt.cm.Accent plt.gca().set_prop_cycle(plt.cycler('color', plt.cm.jet(np.linspace(0, 1, num_plots)))) # رسم الخطوط x = np.random.normal(1, 2, 5000) # تحديد بيانات عشوائية labels = [] for i in range(1, num_plots + 1): plt.plot(x, i * x + 5 * i) labels.append(r'$y = %ix + %i$' % (i, 5*i)) # رسم صندوق بيانات للتوضيح plt.legend(labels, ncol=4, loc='upper center', bbox_to_anchor=[0.5, 1.1], columnspacing=1.0, labelspacing=0.0, handletextpad=0.0, handlelength=1.5, fancybox=True, shadow=True) plt.show() النتيجة:

    وفي الرابط التالي تجد أنواع خرائط لونية مختلفة، يمكنك اختيار ماتفضله:
    https://matplotlib.org/1.2.1/examples/pylab_examples/show_colormaps.html
  2. إجابة Ali Haidar Ahmad سؤال في تقليل عدد علامات التجزئة ticks في Matplotlib في بايثون كانت الإجابة المقبولة   
    يمكنك استخدام الأداة pyplot.locator_params كما يلي:
    # للمحور Y matplotlib.pyplot.locator_params(axis='y', nbins=3) # للمحور X matplotlib.pyplot.locator_params(axis='x', nbins=3) # للمحورين معاً وهي الحالة الافتراضية matplotlib.pyplot.locator_params(nbins=3) حيث أن nbins تشير إلى عدد ال ticks  التي تريدها أن تظهر.  ولتقليل العدد الأعظمي من العلامات واستخدام حدود ضيقة أيضاً نضبط الوسيط tight على true: 
    plt.locator_params(tight=True, nbins=n) مثال:
    import numpy as np import matplotlib.pyplot as plt plt.locator_params(axis ='x', nbins = 5) # نريد إظهار 5 علامات فقط x = np.random.normal(1, 2, 5000) y = np.random.normal(-1, 3, 2000) bins = np.linspace(-10, 10, 30) # الخاص بك axes أخذ غرض يمثل ال ax = plt.axes() ax.set_facecolor('black') # هنا فقط لإضافة خطوط شبكة للرسم أي يمكنك تجاهلها ax.grid(b = True, color ='w', linestyle ='-.', linewidth = 0.5, alpha = 0.6) plt.hist([x,y], bins = 15,label=[x,y],color=["red","blue"]) legend = ['Data1','Data2'] plt.legend(legend) plt.show() والنتيجة:

  3. إجابة Ali Haidar Ahmad سؤال في كيفية إزالة الفجوات gaps بين ال subplots في Matplotlib في بايثون كانت الإجابة المقبولة   
    يمكنك استخدام subplots_adjust وضبط المساحة طولاً وعرضاً على 0 (أو بالشكل الذي تريده) وذلك من خلال الوسيطين wspace و hspace كما يلي:
    import matplotlib.pyplot as plt for i in range(4): axs = plt.subplot(2, 2, i+1) axs.grid(b = True, color ='red', linestyle ='-.', linewidth = 0.5, alpha = 0.6) axs.set_xticklabels([]) axs.set_yticklabels([]) # بعد الانتهاء من الرسم فقط أضف التعليمة التالية قبل عرض أو حفظ الصورة plt.subplots_adjust(wspace=0, hspace=0) plt.show() والنتيجة:

    لكن تجدر الملاحظة في أنه في حالة استخدامك ل set_aspect('equal') أثناء رسم ال subplots أي إذا كنت قد أضفت التعليمة التالية أثناء رسم ال subplots : 
    axs.set_aspect('equal')  فلن يفيدك الحل السابق في تجنب الفراغات الأفقية، لاحظ:
    import matplotlib.pyplot as plt for i in range(4): axs = plt.subplot(2, 2, i+1) axs.grid(b = True, color ='red', linestyle ='-.', linewidth = 0.5, alpha = 0.6) axs.set_xticklabels([]) axs.set_yticklabels([]) # هنا أضفنا التعليمة axs.set_aspect('equal') plt.subplots_adjust(wspace=0, hspace=0) plt.show() ستكون النتيجة:

    الاختلاف في هذه الحالة الثانية هو أنك أجبرت المحورين x و y على الحصول على نفس عدد البكسلات.  ونظراً لأن المحاور تنتقل من 0 إلى 1 بشكل افتراضي (أي قبل رسم أي شيء) ، فإن استخدام set_aspect('equal')  تؤدي إلى جعل المحورين x و y في كل subplot متساويين (أي مربع). ونظراً لأن ال figure ليس مربعاً ، فإن pyplot يضيف مسافات إضافية بين المحاور أفقياً. ولحل المشكلة يجب أن تقوم بتحديد أبعاد ال figure للحصول على نسبة العرض إلى الارتفاع الصحيحة:
    import matplotlib.pyplot as plt fig = plt.figure(figsize=(4,4)) # subplot نحدد أبعاده بحيث يتطابق مع عدد ال for i in range(4): axs = plt.subplot(2, 2, i+1) axs.grid(b = True, color ='red', linestyle ='-.', linewidth = 0.5, alpha = 0.6) axs.set_xticklabels([]) axs.set_yticklabels([]) # هنا أضفنا التعليمة axs.set_aspect('equal') plt.subplots_adjust(wspace=0, hspace=0) plt.show() والنتيجة:

  4. إجابة Ali Haidar Ahmad سؤال في رسم الوقت باستخدام matplotlib في بايثون كانت الإجابة المقبولة   
    يمكنك رسمها من خلال استدعاء التابع autofmt_xdate بالشكل التالي:
    import matplotlib import matplotlib.pyplot as plt import numpy as np import datetime # إنشاء بيانات زمنية y = [ 2,4,6,8,10,12,14,16,18,20 ] x = [datetime.datetime.now() + datetime.timedelta(hours=i) for i in range(len(y))] # plot plt.plot(x,y) plt.gcf().autofmt_xdate() plt.show() النتيجة:

    وإذا أردت البدء من تاريخ محدد ، قم بإنشاء طابع زمني (timestamp ) جديد باستخدام datetime.datetime (السنة ، الشهر ، اليوم ، الساعة ، الدقيقة).
    import matplotlib import matplotlib.pyplot as plt import numpy as np import datetime # إنشاء بيانات customdate = datetime.datetime(2016, 1, 1, 13, 30) y = [ 2,4,6,8,10,12,14,16,18,20 ] x = [customdate + datetime.timedelta(hours=i) for i in range(len(y))] # رسمها plt.plot(x,y) plt.gcf().autofmt_xdate() plt.show()
  5. إجابة Ali Haidar Ahmad سؤال في إنشاء صورة RGB باستخدام OpenCV في Python كانت الإجابة المقبولة   
    يمكنك استخدام الدالة CreateImage للقيام بما تريده:
    import cv2 as cv # تحديد الأبعاد width=500 hight=500 # تحديد عدد البتات لكل بكسل في كل قناة لونية no_of_bits=8 # تحديد عدد القنوات channels=3 # إنشاء الصورة image=cv.CreateImage((width,hight),no_of_bits,channels) # حقظ الصورة cv.imwrite('im.jpg', image) أو: 
    import cv2 import numpy as np # إنشاء صورة بلون محدد # أسود (0, 0, 0) # أبيض (255,255, 255) # أحمر (255,0, 0) # وهكذا.. def create(width, height, rgb=(0, 0, 0)): # إنشاء صورة بقيم صفرية image = np.zeros((height, width, 3), np.uint8) # BGR نظامها هو opencv عكس ترتيب الألوان لأن color = tuple(reversed(rgb_color)) image[:] = color return image # الآن سنقوم بإنشاء مصفوفة فارغة سوداء blank_image = (0, 0, 0) image = create_blank(400, 400, rgb=blank_image) cv2.imwrite('red.jpg', image)
  6. إجابة Ali Haidar Ahmad سؤال في اكتشاف النص واستخراجه باستخدام OpenCV كانت الإجابة المقبولة   
    يمكنك أن تستخدم OpenCV و OCR، لذا  بدايةً تحتاج إلى تثبيت الملف tesseract.exe  التالي من غيتهاب https://github.com/UB-Mannheim/tesseract/wiki إضافةً إلى الحزمة pytesseract كما يلي:
    pip install pytesseract الآن اتبع التعليمات التالية:
    import cv2 import pytesseract # pip install pytesseract # حدد المسار الذي قمت فيه بتثبيت الملف pytesseract.pytesseract.tesseract_cmd = 'tesseract.exe' # إقرأ الصورة img = cv2.imread("sample.jpg") # قم بتحويل الصورة إلى الصيغة الرمادية gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) والآن قم بتطبيق إحدى تقنيات التعتيب وهناك 3 أنواع للتعتيب يمكنك تطبيقها في CV2  : التعتيب البسيط+التعتيب المتكيف+تعتيب أوتسو وسنستخدم تعتيب أوتسو هنا:
    ret, thresh1 = cv2.threshold(gray, 0, 255, cv2.THRESH_OTSU | cv2.THRESH_BINARY_INV) حدد شكل البنية وحجم النواة. حيث أن حجم النواة يزيد أو ينقص مساحة المستطيل المراد اكتشافه. قيمة أصغر مثل (10 ، 10) ستكتشف كل كلمة بدلاً من جملة:
    rect_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (18, 18)) ونطبق عملية تمديد للصورة:
    dilation = cv2.dilate(thresh1, rect_kernel, iterations = 1) اكتشاف الملامح contours:
    contours, hierarchy = cv2.findContours(dilation, cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE) إنشاء نسخة من الصورة وملف نصي:
    im2 = img.copy() # إنشاء ملف نصي file = open("recognized.txt", "w+") file.write("") file.close() نقوم بالتكرار بحلقة على ال contours  ثم يتم اقتصاص الجزء المستطيل وتمريره إلى pytesseract لاستخراج النص منه ثم كتابة النص المستخرج في الملف النصي:
    for cnt in contours: x, y, w, h = cv2.boundingRect(cnt) # رسم مستطيل على الصورة المنسوخة rect = cv2.rectangle(im2, (x, y), (x + w, y + h), (0, 255, 0), 2) # اقتصاص كتلة النص لإعطاء مدخلات إلى التعرف الضوئي على الحروف cropped = im2[y:y + h, x:x + w] # append فتح الملف ونحدد له وضع التحديث file = open("recognized.txt", "a") # OCR تطبيق text = pytesseract.image_to_string(cropped) # كتابة النص إلى الملف file.write(text) file.write("\n") # إغلاقه # Close the file file.close
  7. إجابة Ali Haidar Ahmad سؤال في تدوير الصور بمقدار محدد باستخدام OpenCV في بايثون كانت الإجابة المقبولة   
    نحتاج بدايةً إلى إنشاء مصفوفة التحويل والتي نسميها M وفي حالة التدوير تكون من الشكل:

    لكن لحسن الحظ لن تكون مضطراً لتعيين هذه القيم حيث أننا نستخدم الدالة cv2.getRotationMatrix2D لإنشاء مصفوفة التحويل ثم نمررها إلى الدالة warpAffine لتطبيق التحويل على الصورة (تطبيق مصفوفة التحويل)، والمثال التالي يوضح العملية حيث سنقوم فيه بتدوير الصورة بمقدار 90 درجة:
    import cv2 import numpy as np # قراءة الصورة img = cv2.imread('/content/road.jpg') # استخراج أبعادها rows,cols,_ = img.shape # تدوير الصورة M = cv2.getRotationMatrix2D((cols/2,rows/2),90,1) # warpAffine استخدام الدالة dst = cv2.warpAffine(img,M,(cols,rows)) cv2.imshow('img',dst) cv2.waitKey(0) cv2.destroyAllWindows() """ # في حالة كنت تستخدم غوغل كولاب from google.colab.patches import cv2_imshow cv2_imshow(dst) """ حيث أن التابع cv2.getRotationMatrix2D يحدد لنا زاوية الدوران التي نريد تدوير الصورة بها والوسيط الأول لهذا التابع يمثل مركز دوران الصورة ( وهذا يكافئ (cols/2,rows/2) ). أما الوسيط الثاني فيمثل مقدار الدوران بالدرجات (هنا حددنا 90 درجة). أما الوسيط الثالث فيحدد حجم صورة الخرج.
  8. إجابة Ali Haidar Ahmad سؤال في تحويل تنسيق صورة opencv إلى تنسيق صورة PIL والعكس في بايثون كانت الإجابة المقبولة   
    تستخدم Pillow و OpenCV تنسيقات مختلفة من الصور. لذلك لا يمكنك فقط قراءة صورة في Pillow ومعالجتها في OpenCV. تستخدم الوسادة تنسيق RGB ، ويستخدم OpenCV تنسيق BGR. لذلك ، أنت بحاجة إلى محول للتحويل من تنسيق إلى آخر. وبالتالي للتحويل من صورة PIL إلى OpenCV استخدم:
    import cv2 import numpy as np from PIL import Image pil_image=Image.open("im.jpg") # PIL فتح الصورة باستخدام # 1 إجراء التحويل # pil_image --> numpy array numpy_image=numpy.array(pil_img) # 2 إجراء التحويل # openCV2 image --> numpy_image + BGR إلى RGB نحول النظام اللوني من opencv_image=cv2.cvtColor(numpy_image, cv2.COLOR_RGB2BGR) وللتحويل المعاكس أي من OpenCV إلى صورة PIL نستخدم التابع fromarray:
    import cv2 import numpy as np from PIL import Image # openCV قراءة الصورة من خلال opencv_image=cv2.imread("im.jpg") # BGR --> RGB color_coverted = cv2.cvtColor(opencv_image, cv2.COLOR_BGR2RGB) # openCV2 --> PIL pil_image=Image.fromarray(color_coverted)
  9. إجابة Ali Haidar Ahmad سؤال في تحميل الصورة من سلسلة بايت byte string في OpenCV في بايثون كانت الإجابة المقبولة   
    يمكنك استخدام الكود التالي للقيام بعملية تحويل سلاسل byte string إلى صورة، ياستخدام التابع cv2.imdecode  و التابع fromstring، كما يلي:
    from cv2 import cv import numpy as np import cv2 # من ملف أو قاعدة بيانات string تحميل الصورة ك my_f = open('foo.jpg') im_string = my_f.read() # هي السلسلة النصية التي تحوي البيانات im_string الآن أصبحت # إغلاق الملف my_f.close() # 1-D array الآن سيتم إنشاء مصفوفة # im_string المصفوفة سيتم تشكيلها من البيانات التي تم تحميلها من السلسلة arr = np.fromstring(im_string, np.uint8) # image format الآن نستخدم التابع التالي لفك تشفير الصورة وجعلها بتنسيق صورة # cv2.IMREAD_COLOR img_np = cv2.imdecode(arr, cv2.CV_LOAD_IMAGE_COLOR) # CV img_ipl = cv.CreateImageHeader((img_np.shape[1], img_np.shape[0]), cv.IPL_DEPTH_8U, 3) cv.SetData(img_ipl, img_np.tostring(), img_np.dtype.itemsize * 3 * img_np.shape[1]) # ولاختبار الأنواع print type(im_string) # <type 'str'> print type(arr) # <type 'numpy.ndarray'> print type(img_ipl) # <type 'cv2.cv.iplimage'>
  10. إجابة Ali Haidar Ahmad سؤال في تغيير حجم النطاقات bins في Matblotlib في بايثون كانت الإجابة المقبولة   
    يمكنك تعديل حجمها من خلال ضبطهم بشكل يدوي، بدلاً من تمرير عدد ال bins،  كالتالي:
    from matplotlib.ticker import PercentFormatter import matplotlib.pyplot as plt import numpy as np from matplotlib import colors N_points = 50 # تحديد نطاق المجالات يدوياً bins=[0, 50, 70, 90,255] # وبالتالي سيكون لدينا 4 مجالات وأكبرها حجماً هو المجال من 90 ل 255 x1 = abs(np.random.randn(N_points)*50) plt.hist(x1,bins = bins) plt.xlabel("X-axis") plt.ylabel("y-axis") plt.show() وإذا كنت ترغب فقط في توزيعها بالتساوي (جعل النطاقات متساوية):
    from matplotlib.ticker import PercentFormatter import matplotlib.pyplot as plt import numpy as np from matplotlib import colors N_points = 50 x1 = abs(np.random.randn(N_points)*50) # في حالة كانت بياناتك تحوي أعداد حقيقية استخدم: bins=np.arange(min(x1), max(x1) + binwidth, binwidth) # أما في حالة كانت أعداد صحيحية فقط يمكنك استخدام: # bins=range(min(x1), max(x1) + binwidth, binwidth) plt.hist(x1,bins = bins) plt.xlabel("X-axis") plt.ylabel("y-axis") plt.show()
  11. إجابة Ali Haidar Ahmad سؤال في رسم خريطة حرارية heatmap  ثنائية الأبعاد باستخدام Matplotlib | بايثون كانت الإجابة المقبولة   
    خريطة التمثيل اللوني ثنائية الأبعاد هي أداة عرض بيانات تساعد على تمثيل حجم الظاهرة في شكل ألوان. وفي بايثون ، يمكننا رسم خرائط حرارية ثنائية الأبعاد باستخدام حزمة Matplotlib. وتحديداً من خلال الدالة imshow مع تحديد الوسيط autumn كقيمة للوسيط cmap (أو hot) الذي يمثل الخريطة اللونية:
    import numpy as np import matplotlib.pyplot as plt # توليد بيانات عشوائية data = np.random.random(( 20 , 20 )) # imshow استخدام الدالة plt.imshow( data , cmap = 'autumn' , interpolation = 'nearest' ) # وضع عنوان plt.title( "2-D Heat Map" ) plt.show() والنتيجة:

    أو من خلال الدالة pcolormesh حيث نمرر لها البيانات واسم الخريطة اللونية كما يلي:
    import matplotlib.pyplot as plt import numpy as np data = np.random.rand( 20 , 20 ) plt.pcolormesh( data , cmap = 'hot' ) plt.title( '2-D Heat Map' ) plt.show() كما يمكنك استخدام الدالة heatmap من seaborn كالتالي:
    import numpy as np import seaborn as sns import matplotlib.pylab as plt data = np.random.rand( 20 , 20 ) ax = sns.heatmap( data , cmap = 'hot' ) plt.title( "2-D Heat Map" ) plt.show()
  12. إجابة Ali Haidar Ahmad سؤال في قراءة وعرض الصور باستخدام Matplotlib | بايثون كانت الإجابة المقبولة   
    لقراءة الصورة من خلال Matplotlib يمكنك استخدام الدالة imread من الوحدة image:
    matplotlib.image.imread(path) أما لعرضها فنستخدم التابع imshow من الوحدة pyplot:
    matplotlib.pyplot.imshow(X, cmap=None, alpha=None) # X: الصورة # cmap: اسم خريطة الألوان التي تريد استخدامها # alpha: شفافية الصورة وتأخذ قيمة بين 0 و 1 مثال لقراءة وعرض صورة:
    import matplotlib.pyplot as plt from matplotlib.image import imread # تحديد المسار path="/content/test1 closedeye.jpg" # قراءة الصورة img = imread(path) # عرضها plt.imshow(img) النتيجة:

    وعموماً يمكنك استخدام طرق أخرى للقراءة والعرض مثلاً من خلال الحزمة PIL:
    from PIL import Image image = Image.open(path) image.show() أو من خلال الحزمة IPython :
    from IPython.display import display, Image im=Image(filename=path) display(im) لكن الأفضل استخدام Matplotlib  فهي توفر لك الكثير من الخيارات. 
  13. إجابة Ali Haidar Ahmad سؤال في رسم خط على صورة في OpenCV | بايثون كانت الإجابة المقبولة   
    يمكنك استخدام الدالة line كما يلي:
    cv2.line(image, start_point, end_point, color, thickness) حيث أن الوسيط الأول يمثل الصورة، والوسيط الثاني يمثل إحداثيات نقطة البداية للخط (X coordinate value, Y coordinate value)، والوسيط الثالث إحداثيات نقطة النهاية، بينما الوسيط الرابع يمثل لون الخط المطلوب، أما الرابع فهو سماكته بواحدة البكسل. مثال:
    import cv2 import numpy as np # تحديد إحداثيات نقطة البداية x1, y1 = 0, 0 # نقطة النهاية x2, y2 = 200, 400 # إنشاء صورة عشوائية image = np.ones((height, width)) * 255 # تحديد سمك الخط line_thickness = 2 # رسم الخط cv2.line(image, (x1, y1), (x2, y2), (0, 255, 0), thickness=line_thickness) مثال آخر:
    import cv2 # مسار الصورة path = '/content/test1 closedeye.jpg' # قراءتها image = cv2.imread(path) # اسم للنافذة التي ستعرض ضمنها الصورة window_name = 'Image' # إحداثيات نقطة البدء # الزاويا العليا اليسارية start_point = (0, 0) # إحداثيات النهاية (250, 250) end_point = (250, 250) # الزاويا السفلى اليمينية # تحديد اللون الأحمر color = (0, 0, 255) # سمك الخط thickness = 2 # تطبيق التابع image = cv2.line(image, start_point, end_point, color, thickness) # عرض الصورة #cv2.imshow(window_name, image) from google.colab.patches import cv2_imshow cv2_imshow(image) الخرج:

  14. إجابة Ali Haidar Ahmad سؤال في المرشح medianBlur في OpenCV|بايثون كانت الإجابة المقبولة   
    المرشح الوسيط يعمل تماماً كما شرحت في سؤالك، وفي OpenCV التابع cv.medianBlur يتم استخدامه لتطبيقه حيث تحتاج وسيطين:
    cv2.medianBlur(src, ksize) يمثل الوسيط الأول الصورة، ويمثل  الثاني حجم القناع الذي سبتم تطبيقه على الصورة. أما بالنسبة للحدود فهو يستخدم مايسمى BORDER_REPLICATE داخلياً لمعالجة بكسلات الحدود. لذلك يكرر وحدات البكسل المجاورة حتى تصبح جميع وحدات البكسل في منتصف بكسل النافذة. وبالتالي في حالتك عندما نريد تطبيق نواة 3*3 سيتم التعامل مع مصفوفتك وكأنها بالشكل التالي:
    [[12,12, 3, 22, 16,17,17] [12,12, 3, 22, 16,17,17], [6, 6, 13, 0, 12, 1, 1], [25,25,18, 14, 19, 23,23], [7, 7, 11, 15, 10, 5 ,5], [12,12,13, 5, 4, 0, 0] [12,12,13, 5, 4, 0, 0]] بينما لو كنت تطبق نواة بحجم 5*5 سيكون:
    [[12,12,12, 3, 22, 16,17,17,17], [12,12,12, 3, 22, 16,17,17,17], [12,12,12, 3, 22, 16,17,17,17], [6,6, 6, 13, 0, 12, 1, 1, 1 ], [25,25,25,18, 14, 19, 23,23,23], [7,7, 7, 11, 15, 10, 5 ,5, 5 ], [12,12,12,13, 5, 4, 0, 0, 0 ], [12,12,12,13, 5, 4, 0, 0, 0 ], [12,12,12,13, 5, 4, 0, 0, 0 ]] وبنفس الآلية تبعاً لحجم النواة يتم تكرار البكسلات.
  15. إجابة Ali Haidar Ahmad سؤال في رسم أطر بيانات DataFrames منفصلة ك Subplots في Pandas | Matplotlib | بايثون كانت الإجابة المقبولة   
    يمكنك القيام بذلك من خلال رسم كل كتلة بيانات ضمن axes محدد ضمن ال figure، حيث نقوم أولاً بتعريف عدد ال Subplots  (والذي يجب أن يطابق عدد الرسوم التي تحتاجها -عدد كتل البيانات-)، ثم نقوم باستخدام الأمر plot مع الوسيط ax لتحديد رقم ال axes، كما يلي:
    import pandas as pd import numpy as np import matplotlib.pyplot as plt # إنشاء 4 أطر بيانات مختلفة df1 = pd.DataFrame(np.random.rand(15,2)*5, columns=['A', 'B']) df2 = pd.DataFrame(np.random.rand(15,2)*5, columns=['A', 'B']) df3 = pd.DataFrame(np.random.rand(15,2)*5, columns=['A', 'B']) df4 = pd.DataFrame(np.random.rand(15,2)*5, columns=['A', 'B']) # subplots كونه لدينا 4 أطر بيانات سنحتاج إلى 4 nrow=2 ncol=2 # قم بوضعهم ضمن قائمة df_list = [df1 ,df2, df3, df4] # تعريف الشكل والمحاور fig, axes = plt.subplots(nrow, ncol) # رسمهم count=0 for r in range(nrow): for c in range(ncol): # سنرسنهم عمود عمود df_list[count].plot(ax=axes[r,c]) count+=1 والخرج:

  16. إجابة Ali Haidar Ahmad سؤال في رسم بيانات عمودين من إطار بيانات dataframe في Matplotlib | Pandas | بايثون كانت الإجابة المقبولة   
    يمكنك القيام برسمهما مباشرةً باستخدام Pandas من خلال الدالة plot كالتالي:
    df.plot(x='col_name_1', y='col_name_2', style='o') حيث أن الوسيط style يحدد شكل النقاط بالترتيب، أي أن النقط ستأخذ الشكل "o" أي دوائر. مثال:
    import numpy as np import pandas as pd # إنشاء داتافريم مكون من عمودين d = {'col_1' : np.arange(20), 'col_2' : np.arange(20,40)} df = pd.DataFrame(d) # تمثيلهما بيانياً df.plot(x='col_1', y='col_2', style='o') والخرج سيكون:

    كما يمكنك استخدام الدالة scatter في Matplotlib كما يلي (تجد رابطها في الأسفل لمزيد من التفاصيل):
    import matplotlib.pyplot as plt plt.scatter(df['col_1'], df['col_2']) plt.show()  
  17. إجابة Ali Haidar Ahmad سؤال في إزالة الضجيج الغاوصي باستخدام المرشح الغاوصي gussianBlur في OpenCV | بايثون كانت الإجابة المقبولة   
    لتطبيق المرشح الغاوصي على الصورة نقوم أولاً بقراءة الصورة، ثم نقوم بتطبيق التابع GaussianBlur على الصورة:
    GaussianBlur(src, ksize, sigmaX,sigmaY) حيث أن الوسيط الأول يمثل الصورة المراد تطبيق الترشيح عليها، والوسيط الثاني يمثل حجم الكيرنل (النواة) التي سيتم تطبيقها على الصورة (عبارة عن مصفوفة ذات بعد فردي، يتمتمريرها على الصورة نسميها Gaussian Kernal)،  أما الوسيط  الثالث و الأخير فيمثلان الانحراف المعياري على كل محور (زيادة الانحراف تؤدي إلى زيادة التنعيم -تشويه الحواف-).  في المثال التالي سأقوم بإضافة ضجيج غاوصي إلى صورة، ثم سأقوم بإزالته باستخدام المرشح الغاوصي:
    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,0.5,image.shape).astype('uint8') gauss_image=cv.add(image,gauss) # تطبيق المرشح filtered_image= cv.GaussianBlur(gauss_image,(5,5),1) # عرض النتائج 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") plt.subplot(133) plt.imshow(filtered_image, cmap='gray') plt.title("image after applying gaussian filter") الخرج:

  18. إجابة Ali Haidar Ahmad سؤال في تحويل صورة RGB إلى أبيض وأسود في OpenCV | بايثون كانت الإجابة المقبولة   
    لتحويل الصورة الملونة RGB إلى صورة أبيض وأسود، نقوم أولاً بتحويلها إلى صورة رمادية إما من خلال قراءتها مباشرةً كصورة رمادية في التابع imread أو من خلال استخدام كود التحويل COLOR_BGR2GRAY في التابع cvtColor، ثم تعتيبها بإحدى طرق التعتيب في OpenCV وهما التعتيب البسيط والتعتيب المتكيف (روابطهما في الأسفل):
    import cv2 import numpy as np # قراءة الصورة img = cv2.imread(r'/content/me.jpg') # Gray تحويل الصورة إلى gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # أو cv2.imread(r'/content/me.jpg',0) # تحويل الصورة إلى أبيض وأسود عن طريق التعتيب _,Black_white_img=cv2.threshold(gray_img,127,255,cv2.THRESH_BINARY) # عرض الصورة الناتجة cv2.imshow('res',Black_white_img) cv2.waitKey(0) cv2.destroyAllWindows() الخرج:

     
     
  19. إجابة Ali Haidar Ahmad سؤال في استنساخ (clone) صورة في OpenCV | بايثون كانت الإجابة المقبولة   
    يمكنك القيام بذلك ببساطة من خلال الأمر copy:
    # قراءة صورة img_src = cv2.imread('image.png') # نسخها img_clone = img_src.copy()  
  20. إجابة Ali Haidar Ahmad سؤال في التحكم بحجم ال subplots في Matplotlib | بايثون كانت الإجابة المقبولة   
    يمكنك القيام بذلك من خلال الدالة add_gridspec:
    add_gridspec(nrows=1, ncols=1, **kwargs) # حيث أن الوسيط الأول هو عدد الأسطر في الشكبة # الوسيط الثاني هو عدد الأعمد # مع استخدام وسطاء إضافية مثل: # width_ratios لتحديد عرض كل رسم # height_ratios لتحديد ارتفاع كل رسم ثم إضافة ال subplots كما في المثال التوضيحي التالي:
    fig5 = plt.figure(constrained_layout=True) # subplot تحديد أبعاد كل widths = [2, 3, 1.5] heights = [1, 3, 2] # subplots تعريف مساحة الشبكة التي ستضم ال spec5 = fig5.add_gridspec(ncols=3, nrows=3, width_ratios=widths, height_ratios=heights) # GridSpec(3, 3, height_ratios=[1, 3, 2], width_ratios=[2, 3, 1.5]) # subplots إضافة for row in range(3): for col in range(3): # subplot إضافة ax = fig5.add_subplot(spec5[row, col]) # وضع معلومات ضمنه تمثل الطول والعرض label = 'Width: {}\nHeight: {}'.format(widths[col], heights[row]) ax.annotate(label, (0.1, 0.5), xycoords='axes fraction', va='center') الخرج:

    كما يمكنك استخدام الوسيط gridspec_kw في الدالة subplots لتحديد نسبة العرض والارتفاع مباشرةً كما في المثال التالي:
    import numpy as np import matplotlib.pyplot as plt # البيانات x = np.arange(0, 10, 0.2) y = np.sin(x) # رسمها f, (ax1, ax2) = plt.subplots(1, 2, gridspec_kw={'width_ratios': [3, 1]}) # رسم البيانات ax1.plot(x, y,color="w") ax1.set_facecolor('black') ax2.plot(y, x,color="w") ax2.set_facecolor('red') # plots لترك مسافة بين ال f.tight_layout() # إضافة خطوط شبكية ax1.grid(b = True, color ='w', linestyle ='-.', linewidth = 0.5, alpha = 0.6) ax2.grid(b = True, color ='black', linestyle ='-.', linewidth = 0.5, alpha = 0.6) والخرج:

    مثال آخر:
    import numpy as np import matplotlib.pyplot as plt # البيانات x = np.arange(0, 10, 0.2) y = np.sin(x) # رسمها f, (ax0, ax1, ax2) = plt.subplots(3, 1, gridspec_kw={'height_ratios': [1, 1, 3]}) ax0.plot(y, x,color="w") ax0.set_facecolor('b') ax1.plot(x, y,color="w") ax1.set_facecolor('black') ax2.plot(y, x,color="w") ax2.set_facecolor('red') f.tight_layout() ax0.grid(b = True, color ='b', linestyle ='-.', linewidth = 0.5, alpha = 0.6) ax1.grid(b = True, color ='w', linestyle ='-.', linewidth = 0.5, alpha = 0.6) ax2.grid(b = True, color ='black', linestyle ='-.', linewidth = 0.5, alpha = 0.6) الخرج:

  21. إجابة Ali Haidar Ahmad سؤال في وضع عنوان واحد رئيسي فوق كل ال subplots في Matplotlib | بايثون كانت الإجابة المقبولة   
    للقيام بذلك نستخدم الدالة suptitle:
    matplotlib.pyplot.suptitle(t,x,y,horizontalalignment,fontsize, **kwargs) # الوسيط الأول يمثل النص المطلوب إضافته # x , y للتحكم بموقع النص # horizontalalignment لتغيير موضع النص # ويأخذ القيم التالية # center: الحالة الافتراضية # left: على يسار الشكل # right: على يمينه # fontsize للتحكم بحجم الخط وبالتالي لتنفيذ ماتريده:
    # Implementation of matplotlib function import numpy as np import matplotlib.pyplot as plt # First create some toy data: x = np.linspace(0, 1.5 * np.pi, 100) y = np.sin(x**2)+np.cos(x**2) fig, axs = plt.subplots(2, 2, subplot_kw = dict(polar = True)) axs[0, 0].plot(x, y) axs[1, 1].scatter(x, y) # هنا نستخدم هذه الدالة fig.suptitle('Hsoub',color="red") plt.show() والخرج:

  22. إجابة Ali Haidar Ahmad سؤال في تعديل الهوامش margins بين ال subplots في matplotlib | بايثون كانت الإجابة المقبولة   
    يمكنك استخدام الدالة tight_layout:
    matplotlib.pyplot.tight_layout(pad=1.08) حيث تقوم هذه الدالة بضبط المساحة المتروكة بين ال subplots. حيث أن الوسيط الأول يمثل المسافة (الحشو) بين حدود ال figure وبين ال subplots.:
    import matplotlib.pyplot as plt fig = plt.figure() subplot1 = fig.add_subplot(121) subplot1.plot(data) subplot2 = fig.add_subplot(122) subplot2.plot(data) fig.tight_layout(pad=3.0) plt.show() الخرج:

    والطريقة الثانية من خلال subplots_adjust حيث تمنحك هذه الدالة إمكانية التعديل بشكل أكثر حرية وبكل الاتجاهات، كما في الكود التالي:
    import matplotlib.pyplot as plt fig = plt.figure() subplot1 = fig.add_subplot(121) subplot1.plot(data) subplot2 = fig.add_subplot(122) subplot2.plot(data) fig.subplots_adjust( top=0.981, bottom=0.049, left=0.042, right=0.981, hspace=0.2, wspace=0.2 ) plt.show()
  23. إجابة Ali Haidar Ahmad سؤال في OpenCV تعطي لوناً خاطئاً للصور الملونة عند عرضها ياستخدام  Matplotlib كانت الإجابة المقبولة   
    OpenCV تقوم بقراءة الصور بالصيغة BGR أما ماتبلوتليب فتتعامل مع الصور بالصيغة RGB وبالتالي ترتبيب الألوان مختلف أي أنت تقرأ الصورة في التابع imread على أنها مصفوفة من 3 قنوات الأولى للأزرق والثانية للأخضر والثالث للأحمر، وعندما تقوم باستخدام ماتبلوتليب لعرضها فإنها تقرأ الأزرق على أنه أحمر والأخضر على أنه أخضر و الأحمر على أنه أزرق مما ينتج لنا هذه المشكلة. وبالتالي لحل المشكلة فكل ماعليك فعله هو استخدام التابع cv2.cvtColor مع الخاصية cv2.COLOR_BGR2RGB وبالتالي تحويل نظام الصورة إلى RGB:
    from matplotlib import pyplot as plt import cv2 img = cv2.imread(r'C:\Users\Windows.10\Desktop\All\test5 openeye.jpg') img= cv2.cvtColor(img, cv2.COLOR_BGR2RGB) plt.title("Face") plt.imshow(img) الخرج:

  24. إجابة Ali Haidar Ahmad سؤال في كيف يمكننا معرفة عدد الإطارات في الفيديو في OpenCV | بايثون كانت الإجابة المقبولة   
    يمكنك الحصول على هذه المعلومات من خلال استخدام الدالة get مع خصائص محددة لكل معلومة تريدها كالتالي:
    import numpy as np import cv2 # نحدد مسار الفيديو cap = cv2.VideoCapture(r'C:\Users\Windows.10\Downloads\Video\videoplayback_6.mp4') length = cap.get(cv2.CAP_PROP_FRAME_COUNT) # عدد الإطارات في الفيديو width = cap.get(cv2.CAP_PROP_FRAME_WIDTH) # عرض الإطار height = cap.get(cv2.CAP_PROP_FRAME_HEIGHT) # ارتفاعه fps = cap.get(cv2.CAP_PROP_FPS) # Frame rate. print("This video contains: ",length,"frames") print("Width: ", width ) print("Height: ", height ) print("Frame rate. : ", fps ) # والخرج سيكون كالتالي """ This video contains: 33392.0 frames Width: 640.0 Height: 360.0 Frame rate. : 30.0 """
  25. إجابة Ali Haidar Ahmad سؤال في كيف يمكنني تغيير لون خلفية الرسم plot في Matplotlib | بايثون كانت الإجابة المقبولة   
    يمكنك استخدام set_facecolor(color) للتحكم بألوان أي axes لديك لكن يجب أن تكون دقيقاُ في استخدامها، فمثلاً لتغيير لون الخلفية في مثالك نقوم بأخذ كائن يمثل ال axes (المساحة التي تظهر فيها الصورة) الخاص بك ثم نستدعي منه الدالة كالتالي:
    import numpy as np import matplotlib.pyplot as plt x = np.random.normal(1, 2, 5000) y = np.random.normal(-1, 3, 2000) bins = np.linspace(-10, 10, 30) # الخاص بك axes أخذ غرض يمثل ال ax = plt.axes() ax.set_facecolor('black') # هنا فقط لإضافة خطوط شبكة للرسم أي يمكنك تجاهلها ax.grid(b = True, color ='w', linestyle ='-.', linewidth = 0.5, alpha = 0.6) plt.hist([x,y], bins = 15,label=[x,y],color=["red","blue"]) legend = ['Data1','Data2'] plt.legend(legend) plt.show() الخرج:

    أما ماتقوم به أنت هو تلوين ال figure الذي يحتوي ال axes، فكما نعلم أن ال figure يحتوي ال axes (واحد أو أكثر) انظر للصورة لتفهم ما أقصد:

    حيث قمت بأخذ كائن يمثل ال figure ثم قمت بضبط لونه، فظهر بذلك الشكل. وكحل آخر يمكنك استخدام rcParams كالتالي:
    import matplotlib.pyplot as plt plt.rcParams['axes.facecolor'] = 'black'
×
×
  • أضف...