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

Ali Haidar Ahmad

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

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

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

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

    43

كل منشورات العضو Ali Haidar Ahmad

  1. يمكنك استخدام Axes.set_ylim لتعيين حدود عرض المحور y: Axes.set_ylim(bottom=None, top=None, ymin=None, ymax=None) الوسيط الأول يمثل القيمة الدنيا التي ستكون للمحور. وبالتالي يمكنك ضبطها على 0 لتحقيق مطلبك. والوسيط الثاني يمثل القيمة العليا. والوسيطين الثالث والرابع مكافئين تماماً للوسيطين السابقين. بالتالي يكون الكود: 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(title="your_title") ax.set_ylim(ymin=0) plt.show() النتيجة: كذلك يمكنك تعديل المحور الأفقي x بنفس الطريقة من خلال الدالة Axes.set_xlim.
  2. تحتاج ببساطة إلى ترميز "encode " المصفوفة بنفس تنسيق الصورة من خلال الدالة cv2.imencode، ثم استخدام الدالة tobytes إذا كنت تريدها بنفس التنسيق. import cv2 image = cv2.imread('image.png') # ترميزها _, encoded_image = cv2.imencode('.png', image) # bytes تحويلها إلى content = encoded_image.tobytes()
  3. هذا الخطأ يظهر لأمرين إما أنك قمت بتثبيت حزم متعددة من OpenCV وبالتالي تحدث تعارضات وينتج الخطأ، أو أنك لم تقم بتثبيت أي حزمة. وفي كلتا الحالتين يمكنك اتباع الخطوات التالية: أولاً: إذا كان لديك إصدار سابق من OpenCV مثبت، فقم بإزالته قبل التثبيت لتجنب حالة التعارضات. ويمكنك إلغاء تثبيت أي حزمة من خلال pip uninstall. ثانياً: هناك 4 حزم مختلفة ل OpenCV. يمكنك تثبيت واحد فقط من خلال pip install. حزم opencv المتعددة غير متوافقة: opencv-python,opencv-contrib-python-headless, opencv-contrib-python, opencv-python-headless لذا نقوم بإزالة تثبيت حزمة opencv-contrib-python وأي حزمة أخرى (فمثلاً هنا كان لديك هذه الحزمة + حزمة opencv-python): pip uninstall opencv-contrib-python pip uninstall opencv-python ثم نقوم بتثبيت حزمة واحدة فقط: pip install opencv-contrib-python
  4. يمكنك القيام بتغييرها بالشكل التالي: ax.spines['right'].set_color('color') ax.spines['left'].set_color('color') ax.spines['bottom'].set_color('color') ax.spines['top'].set_color('color') وبالتالي يكون الكود: 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(title="your_title") ax.spines['bottom'].set_color('blue') ax.spines['top'].set_color('y') ax.spines['right'].set_color('red') ax.spines['left'].set_color('red') plt.show() والنتيجة: كذلك يمكنك تغيير ألوان العلامات ticks من خلال: ax.tick_params(axis='x', colors='red') ax.tick_params(axis='y', colors='red') أو التسميات label: ax.yaxis.label.set_color('red') ax.xaxis.label.set_color('red') أو العنوان title: ax.title.set_color('red')
  5. لتقسيم الصورة يمكنك القيام بذلك من خلال الدالة cv2.split: cv2.split(image) و دمجها من خلال: cv2.merge(image) مثال: import cv2 as cv import numpy as np from google.colab.patches import cv2_imshow # قراءة الصورة الملونة img = cv2.imread("/content/test5 openeye.jpg") # BGR تقوم بقراءة الصورة بصيغة Opencv # تقسيم الصورة b, g, r = cv2.split(img) # هنا يمكنك تنفيذ ماتشاء من عمليات # دمجها مرة أخرى image_merge = cv2.merge([b, g, r])
  6. أول خطوة عليك أن تقوم بتمثيل هذه النقاط كقائمة بالشكل التالي: L=[[x1,y1],[x2,y2],[x3,y3],[x4,y4],[x5,y5],[x6,y6],...[xn,yn]] حيث x و y هي الإحداثيات. ثم عليك أن تقوم بتحويلها إلى مصفوفة نمباي كما يلي: np.array(L,dtype=np.int32) وأخيراً نقوم برسمها من خلال الدالة drawContours: cv.DrawContours(src, contour, contourIndex, colour, thickness) الوسيط الأول يمثل الصورة، والثاني هو الإطارات المطلوب رسمها، والثالث هو فهرس الإطارات ونعطيه القيمة -1 لرسم كل الإطارات أو رقم إطار محدد لرسمه فقط، ثم اللون ثم السماكة. مثال: import cv2 import numpy as np from google.colab.patches import cv2_imshow # تحديد إحداثيات نقاط الكائن الحدودية contour=np.array([[100,50],[150,80],[200,200],[288,172],[250,200]],dtype=np.int32) # إنشاء خلفية رمادية (صورة) لرسم الإطار ضمنها drawing = np.zeros([300, 300],np.uint8)+230 # 300*300 image # رسم الإطار cv2.drawContours(drawing,[contour],0,0,2) # عرضه cv2_imshow(drawing) والنتيجة:
  7. بالنسبة للفرق بينهما فلا يوجد أي فرق، باستثناء ترتيب القنوات اللونية ف BGR تعني أن القناة اللونية الأولى هي الأزرق والثانية الأخضر والثالثة الأحمر حيث تم اعتبار القناة الحمراء واحدة من أقل قنوات الألوان أهمية، لذلك تم إدراجها أخيراً. أما ال RGB فالعكس. أما السبب وراء اختيار المطورين الأوائل في OpenCV لتنسيق ألوان BGR هو أنه في ذلك الوقت كان تنسيق ألوان BGR شائعاً بين مصنعي الكاميرات وموفري البرامج. ومع ذلك ، فقد تغير المعيار الآن وتستخدم معظم برامج الصور والكاميرات تنسيق RGB ، وهذا هو السبب في أنه من الممارسات الجيدة في البرامج تتضمن تحويل صور BGR إلى RGB قبل تحليل أو معالجة أي صور. إذاً يمكنك القول أن BGR هو اختيار تم لأسباب تاريخية وعلينا الآن التعايش معه. في الرابط التالي تجد طريقة التحويل:
  8. يمكنك أن تستخدم cv2.findContours و cv2.drawContours لرسم الحواف على الصور. لكن أولاً ما هو Contours أو الإطار؟ هي عبارة عن منحنيات تضم كل النقاط المتصلة مع بعضها (على طول الحدود) والتي تملك نفس اللون أو الشدة، وهذه الإطارات هي أدوات مفيدة لتحليل الشكل، واكتشاف الأجسام والتعرف عليها. cv2.findContours(src, contour_retrieval, contours_approximation) الوسيط الأول يمثل الصورة (ثنائية)، والثاني يمثل نمط استرداد الإطار ويمكن أن يكون cv.RETR_EXTERNAL الذي يسترد الخطوط الخارجية الشاذة فقط أو cv.RETR_LIST الذي يسترجع كل المعالم دون إنشاء أي علاقات هرمية أو cv.RETR_TREE الذي يسترجع كل المعالم ويعيد بناء تسلسل هرمي كامل لخطوط الكنتورات المتداخلة. الوسيط الثالث هو تقريب الإطار ويمكن أن يكون cv.CHAIN_APPROX_NONE لتخزين جميع نقاط الحدود أو cv.CHAIN_APPROX_SIMPLE لتخزين نقاط النهاية (مثلاً في المربع يخزن 4 نقط). و الخرج لهذا التابع هو ال Contours وتسلسل الإطارات الهرمي hierarchy. وتكون الإطارات المكتشفة على شكل قائمة، وكل إطار هو عبارة عن مصفوفة نمباي لإحداثيات نقاط حدود الجسم. cv.DrawContours(src, contour, contourIndex, colour, thickness) الوسيط الأول يمثل الصورة، والثاني هو الإطارات المطلوب رسمها، والثالث هو فهرس الإطارات ونعطيه القيمة -1 لرسم كل الإطارات أو رقم إطار محدد لرسمه فقط، ثم اللون ثم السماكة. الخطوات التي يجب اتباعها هي: 1. قراءة الصورة. 2. تحويلها إلى رمادية. 3. تعتيبها بحيث نجعلها صورة ثنائية لأن ذلك يعطينا أفضل النتائج. سنطبق الآن مثال على صورتك: import cv2 import numpy as np from google.colab.patches import cv2_imshow from matplotlib import pyplot as plt # قراءة الصورة img = cv2.imread('/content/shapes.png',0) # قراءتها بصيغة رمادية # تعتيب الصورة _, threshold = cv2.threshold(img, 200, 255, cv2.THRESH_BINARY) # استخدام التابع الأول contours, _ = cv2.findContours(threshold, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) i = 0 for c in contours: # قائمة لتخزين أسماء الأشكال if i == 0: i = 1 continue # cv2.approxPloyDP() دالة لتقريب الشكل approx = cv2.approxPolyDP( c, 0.01 * cv2.arcLength(c, True), True) # استخدام تابع الرسم cv2.drawContours(img, [c], 0, (0, 0, 255), 5) # إيجاد نقطة مركز الشكل M = cv2.moments(c) if M['m00'] != 0.0: x = int(M['m10']/M['m00']) y = int(M['m01']/M['m00']) # وضع اسم الشكل في وسط كل شكل if len(approx) == 3: cv2.putText(img, 'Triangle', (x, y), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (255, 255, 255), 2) elif len(approx) == 4: cv2.putText(img, 'Quadrilateral', (x, y), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (255, 255, 255), 2) elif len(approx) == 5: cv2.putText(img, 'Pentagon', (x, y), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (255, 255, 255), 2) elif len(approx) == 6: cv2.putText(img, 'Hexagon', (x, y), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (255, 255, 255), 2) else: cv2.putText(img, 'circle', (x, y), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (255, 255, 255), 2) # عرض cv2_imshow(img) والنتيجة:
  9. هنا أجبت إجابة مفصلة عن سؤالك. وبطريقتين مختلفين. وكونك مبتدئ اقترح عليك الطريقة الأولى كونها أسهل.
  10. نقوم بالمرور على كل خط من هذه الخطوط (يمكنك استخلاص كل الخطوط الموجودة ضمن ال Legend من خلال استدعاء الدالة ()Legend.get_lines) ثم نستخدم الدالة ()set_linewidth لتعديل عرض كل منها كما يناسبك كالتالي: 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, linewidth=2.0, label='x^3') ax.plot(x, y2, linewidth=2.0, label='x^2') leg = ax.legend() for line in leg.get_lines(): # المرور على كل خط line.set_linewidth(4.0) # تعديله plt.show() الخرج:
  11. يمكنك استخاد الدالة ax.patch.set_facecolor لتغيير لون خلفية الرسم، والدالة ax.patch.set_alpha لتغيير شفافيتها كما في المثال التالي حيث سنجعل لون الخلفية أسود مع ضبط معامل الشفافية ألفا على 0.5: 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.patch.set_facecolor('black') # تغيير شفافية الصورة من خلال المعامل ألفا ax.patch.set_alpha(0.5) # هنا فقط لإضافة خطوط شبكة للرسم أي يمكنك تجاهلها 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() الخرج: كما يمكنك استخدام rcParams لتحديد هذه الخصائص لكامل الرسوم في الكود: plt.rcParams.update({ "figure.facecolor": (1.0, 0.0, 0.0, 0.3), # red with alpha = 30% "axes.facecolor": (0.0, 1.0, 0.0, 0.5), # green with alpha = 50% "savefig.facecolor": (0.0, 0.0, 1.0, 0.2), # blue with alpha = 20% })
  12. إذا أردت زيادة وضوح الصورة والتخلص من بعض الضجيج ( تحسينها بشكل عام ) قم بضبط ألفا (القيمة الدنيا للبكسل على 0) والعليا على 255. حيث أن هذين ال%D إذا أردت زيادة وضوح الصورة والتخلص من بعض الضجيج ( تحسينها بشكل عام ) قم بضبط ألفا (القيمة الدنيا للبكسل على 0) والعليا على 255. حيث أن هذين الوسيطين يمثلان القيم العليا والدنيا لبكسلات الصورة الناتجة. والقيم الناتجة للبكسلات ستكون من النمط unit8 أي أعداد صحيحة ب 8 بت ضمن المجال من 0 ل 255. واستخدم إحدى خوارزميات التطبيع (norm_type) مثل: cv.NORM_INF - cv.NORM_L1 - cv.NORM_L2 - cv.NORM_MINMAX. أما في حالة أردت تغيير نطاق قيم كثافة البكسل (حالتك) فيجب وضع القيم العليا والدنيا ضمن المجال الذي تحتاجه وفي حالتك يجب أن تضعهم على 0 و 1 لكن هذا سينتج مصفوفة بقيم صفرية لأن نمط الخرج سيكون unit8 لذا يجب تغيير نمط الإخراج وجعله float لذا يجب أن تقوم باستخدام وسيط إضافي هو dtype وضبطه على cv2.CV_32F. ,وقم باستخدام خوارزمية cv2.NORM_MINMAX لذا لحل مشكلتك: myimage = cv2.imread('/content/test5 openeye.jpg',0) img_normlaized=cv2.normalize(myimage,None,alpha=0,beta=1,norm_type=cv2.NORM_MINMAX, dtype=cv2.CV_32F) img_normlaized والنتيجة: array([[0.5179283 , 0.5179283 , 0.5179283 , ..., 0.5179283 , 0.5179283 , 0.5179283 ], [0.5179283 , 0.5179283 , 0.5179283 , ..., 0.5179283 , 0.5179283 , 0.5179283 ], [0.5179283 , 0.5179283 , 0.5179283 , ..., 0.5179283 , 0.5179283 , 0.5179283 ], ..., [0.44621515, 0.44621515, 0.44621515, ..., 0.45019922, 0.45019922, 0.45019922], [0.44621515, 0.44621515, 0.44621515, ..., 0.44621515, 0.44621515, 0.44621515], [0.44621515, 0.44621515, 0.44621515, ..., 0.44621515, 0.44621515, 0.44621515]], dtype=float32)
  13. ضمن ال Kwargs الإضافية لدالة legend هناك خاصية title يمكنك إضافتها للحصول على المطلوب، والوسيط title_fontsize لتحديد حجمه ويأخذ القيم التالية: {'xx-small', 'x-small', 'small', 'medium', 'large', 'x-large', 'xx-large'} وبالتالي يصبح الكود: 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(title="your_title") plt.show() النتيجة:
  14. يمكنك استخدام مفهوم مطابقة القوالب Template matching، بحيث تكون صورة الوجه هي القالب "Template" (أو النافذة) والصورة التي نريد البحث فيها "Target" أي صورة الهدف. وتتم العملية من خلال التفاف (تمرير) القالب على صورة الهدف، ومقارنتها مع كل بقعة من الصورة (على سبيل المثال تكون صورة القالب بأبعاد 40*40 بكسل وصورة الهدف ب 400*400، ثم نقوم بتمرير هذا القالب على الصورة بدءاً من الجانب العلوي الأيسر وصولاً للسفلي الأيمن، بحيث تتم المقارنة مع كل بقعة من الصورة). لتنفيذ هذه المهمة نستخدم الدالة cv2.matchTemplate من مكتبة OpenCV: cv2.matchTemplate(img_gray,template,cv2.TM_CCOEFF_NORMED) حيث أن الوسيط الأول يمثل الصورة الرمادية (إذا كانت الصورة ملونة فحولها للرمادي)، والوسيط الثاني يمثل القالب (أيضاً حولها للرمادي)، أما الوسيط الثالث فهو يمثل طريقة المقارنة. انظر للمثال التالي الذي يمكنك استخدامها مع المهام الأخرى التي تحتاجها: الصورة الهدف: القالب: الكود: import cv2 import numpy as np from matplotlib import pyplot as plt # قراءة الصورة الهدف target = cv2.imread('/content/template_matching_coke_bottle.png') # تحويلها للصيغة الرمادية img = cv2.cvtColor(target, cv2.COLOR_BGR2GRAY) # RGB ل BGR تحويل نظام الصورة من target=cv2.cvtColor(target, cv2.COLOR_BGR2RGB) # هذه الخطوة فقط من أجل الرسم # أخذ نسخة عنها img2 = img.copy() # قراءة القالب template = cv2.imread('/content/template_matching_coke_logo.png',0) # استخلاص أبعاد القالب w, h = template.shape[::-1] # سنقوم هنا بتطبيق كل أنواع المقارنة ونعرض نتائجها methods = ['cv2.TM_CCOEFF', 'cv2.TM_CCOEFF_NORMED', 'cv2.TM_CCORR', 'cv2.TM_CCORR_NORMED', 'cv2.TM_SQDIFF', 'cv2.TM_SQDIFF_NORMED'] for meth in methods: img = img2.copy() t = target.copy() method = eval(meth) # هذا التابع فقط لإزالة علامتي الاقتباس # تطبيق العملية res = cv2.matchTemplate(img,template,method) # minMaxLoc الآن سنستخدم التابع # هذا التابع يقوم بإيجاد قيمة أكبر وأقل عنصر في المصفوفة وأيضاً موقع هذين العنصرين الإحداثي # الآن سنحدد المنطقة التي تم إيجاد صورة القالب ضمنها وسنحددها بمستطيل من خلال # الذي يعيد لنا أعلى وأدنى قيمة للبيكسل minMaxLoc استخدام التابع # في الصورة الناتجة عن المطابقة مع موضع هذين البيكسلين ضمن الصورة الهدف # نختار احداثيات أحد هذين الموضعين لنحدد إحداثيات أحد هذين الموضعين لنحدد احداثيات # الزاويا العليا اليسارية للمستطيل # max_loc والأعلى في min_loc يتم تخزين الحد الأدنى في المتغير # وكما حصلنا على احداثيات زاوية المستطيل، ونحتاج الآن لتحديد حدود # منطقة المطابقة لذلك يجب أن نعرف طول وعرض هذا المستطيل وهما بالطبع طول وعرض القالب min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res) # الآن سنختار احداثيات أعلى وأدنى قيمة للبكسل وذلك حسب كل طريقة مقارنة # فبالنسبة لآخر طريقتي مقارنة نختار احداثيات القيمة الأدنى فهو الحد المناسب لتحديد # احداثيات زاوية مستطيل منطقة المطابقة، أما بالنسبة للبقية فاخترنا القيمة العليا فهي الأنسب # ثم فمت برسم المستطيل حول منطقة القالب الموجودة في الصورةالهدف if method in [cv2.TM_SQDIFF, cv2.TM_SQDIFF_NORMED]: top_left = min_loc else: top_left = max_loc bottom_right = (top_left[0] + w, top_left[1] + h) cv2.rectangle(t,top_left, bottom_right, (0,255,0), 4) plt.subplot(121),plt.imshow(res,cmap = 'gray') plt.title('Matching Result') plt.xticks([]) plt.yticks([]) plt.subplot(122) plt.imshow(t) plt.title('Detected Point') plt.xticks([]) plt.yticks([]) plt.suptitle(meth) plt.show() النتائج: لاحظ أن الطريقة الأولى للمقارنة أعطت نتائج سيئة
  15. يمكنك استخدام الدالة cv2.circle: cv2.circle(img, center, radius, color, thickness=1) حيث لرسمها نحتاج إلى نصف قطرها radius و مركزها center وكذلك يمكنك تحديد لون للدائرة من خلال الوسيط color وكذلك يمكنك تحديد سماكتها من خلال الدالة thickness. انظر للمثال التالي: الصورة الأصلية: import cv2 # مسار الصورة path = r'/content/test5 openeye.jpg' # قراءة الصورة image = cv2.imread(path) # مركز الدائرة center_coordinates = (150, 70) # نصف القطر radius = 100 # اللون color = (200, 255, 200) # السماكة thickness = 2 # رسم الدائرة image = cv2.circle(image, center_coordinates, radius, color, thickness) # عرض from google.colab.patches import cv2_imshow cv2_imshow(image) النتيجة:
  16. قم بتحويل فضاء الألوان إلى 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) النتيجة:
  17. 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 إغلاق ال
  18. سأعطيك طريقتين لحذفها، الأولى من خلال استخدام الدالة ()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()
  19. يمكنك القيام بذلك بالشكل التالي: 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.
  20. يمكنك القيام بذلك من خلال أخذ نسخة عن الصورة (copy) لكي لاتتأثر الصورة الأصلية، ثم تعيين القيمة 0 للقنوات التي لاتريدها، مثلاً لاستخلاص اللون الأحمر سنقوم بأخذ نسخة من الصورة، ثم تصفير القناتين الزرقاء والخضراء: import cv2 image = cv2.imread("/content/test.jpg") # قراءة الصورة # BGR تقرأ الصورة بالصيغة opencv red = image.copy() # أخذ نسخة red[:, :, 0] = 0 # تصفير قناة الأزرق red[:, :, 1] = 0 # تصفير الأخضر # عرض الصورة from google.colab.patches import cv2_imshow cv2_imshow(red) والنتيجة: نفس الأمر بالنسبة للأزرق والأخضر: import cv2 image = cv2.imread("/content/test.jpg") # قراءة الصورة # BGR تقرأ الصورة بالصيغة opencv blue = image.copy() # أخذ نسخة blue[:, :, 2] = 0 # تصفير قناة الأحمر blue[:, :, 1] = 0 # تصفير الأخضر # عرض الصورة from google.colab.patches import cv2_imshow cv2_imshow(blue) الأخضر: import cv2 image = cv2.imread("/content/test.jpg") # قراءة الصورة # BGR تقرأ الصورة بالصيغة opencv green = image.copy() # أخذ نسخة green[:, :, 2] = 0 # تصفير قناة الأحمر green[:, :, 0] = 0 # تصفير الأزرق # عرض الصورة from google.colab.patches import cv2_imshow cv2_imshow(green)
  21. لا يوجد تابع جاهز. لكن المثال التالي يبين لك كيفية إضافته، فكما نعلم إن الضجيج الغاوصي هو ضوضاء أو تشويش له دالة كثافة احتمالية مساوية لدالة الكثافة الاحتمالية للتوزيع الطبيعى (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
  22. الدالة 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() والنتيجة:
  23. في حالة كنت تستخدم الدالة 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')
  24. يمكنك استخدام الوسيط 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 # تحديد نقطة وحيدة
  25. تماماً كما ذكر وائل. يمكنك أيضاً كتابة صيغة عامة: DELETE [target table] FROM [tableA] INNER JOIN [tableB] ON [tableA.[joining column] = [tableB].[joining column] WHERE [condition] وأيضاً في حالة أردت القيام بعملية تحديث فهذه هي الصيغة العامة: UPDATE [target table] SET [target column] = [new value] FROM [tableِA] INNER JOIN [tableB] ON [tableA.[joining column] = [tableB].[joining column] WHERE [condition]
×
×
  • أضف...