-
المساهمات
1068 -
تاريخ الانضمام
-
تاريخ آخر زيارة
-
عدد الأيام التي تصدر بها
43
نوع المحتوى
ريادة الأعمال
البرمجة
التصميم
DevOps
التسويق والمبيعات
العمل الحر
البرامج والتطبيقات
آخر التحديثات
قصص نجاح
أسئلة وأجوبة
كتب
دورات
كل منشورات العضو Ali Haidar Ahmad
-
يمكنك القيام بذلك من خلال رسم كل كتلة بيانات ضمن 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 والخرج:
- 2 اجابة
-
- 1
-
يمكنك القيام برسمهما مباشرةً باستخدام 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()
- 2 اجابة
-
- 1
-
لتطبيق المرشح الغاوصي على الصورة نقوم أولاً بقراءة الصورة، ثم نقوم بتطبيق التابع 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") الخرج:
- 2 اجابة
-
- 1
-
لتحويل الصورة الملونة 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() الخرج:
- 2 اجابة
-
- 1
-
يمكنك القيام بذلك ببساطة من خلال الأمر copy: # قراءة صورة img_src = cv2.imread('image.png') # نسخها img_clone = img_src.copy()
-
يمكنك القيام بذلك من خلال الدالة 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) الخرج:
- 2 اجابة
-
- 1
-
للقيام بذلك نستخدم الدالة 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() والخرج:
- 2 اجابة
-
- 1
-
يمكنك استخدام الدالة 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()
- 2 اجابة
-
- 1
-
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) الخرج:
- 2 اجابة
-
- 1
-
يمكنك الحصول على هذه المعلومات من خلال استخدام الدالة 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 """
-
يمكنك استخدام 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'
- 2 اجابة
-
- 1
-
الحل كالتالي: from matplotlib.ticker import PercentFormatter import matplotlib.pyplot as plt import numpy as np from matplotlib import colors # إنشاء بيانات عشوائية N_points = 98 n_bins = 15 # إنشاء توزيع يمثل بيانات أول هيستوغرام x1 = np.random.randn(N_points) # إنشاء توزيع يمثل بيانات الهستوغرام لثاني x2 = np.random.randn(N_points) # تعريف الحاوية 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 ='y', linestyle ='-.', linewidth = 0.5, alpha = 0.6) # 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) # إنشاء الهستوغرامين معاً axs.hist([x1,x2], bins = n_bins,label=[x1,x2],color=["red","black"]) # تسمية للمحاور plt.xlabel("X-axis") plt.ylabel("y-axis") legend = ['File1','File2'] plt.legend(legend) # عنوان plt.title('Hsoub') # عرض plt.show() الخرج: حيث قمنا بتمريرهم إلى نفس دالة hist كما فعلت، حيث تقوم الدالة برسم الأعمدة التي تحدد تكرار نفس القيم بجانب بعضها بدل أن تقوم بجعلها فوق بعضها من خلال استخدام دالتين لرسم كل هيستوغرام وبالتالي يصبح المخطط غير مقروء أو صعب القراءة كما في الكود التالي (بنهاية الأمر اختر ماتراه مناسباً لك): from matplotlib.ticker import PercentFormatter import matplotlib.pyplot as plt import numpy as np from matplotlib import colors # إنشاء بيانات عشوائية N_points = 98 n_bins = 15 # إنشاء توزيع يمثل بيانات أول هيستوغرام x1 = np.random.randn(N_points) # إنشاء توزيع يمثل بيانات الهستوغرام لثاني x2 = np.random.randn(N_points) # تعريف الحاوية 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 ='y', linestyle ='-.', linewidth = 0.5, alpha = 0.6) # 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) # إنشاء الهستوغرام الأول axs.hist(x1, bins = n_bins,alpha=0.8) # إنشاء الهستوغرام الثاني axs.hist(x2, bins = n_bins,color="red",alpha=0.7) # تسمية للمحاور plt.xlabel("X-axis") plt.ylabel("y-axis") legend = ['File1','File2'] plt.legend(legend) # عنوان plt.title('Hsoub') # عرض plt.show() الخرج:
- 2 اجابة
-
- 1
-
يمكنك استخدام الدالة putText: cv2.putText(image, text, org, font, fontScale, color, thickness, lineType, bottomLeftOrigin) الوسيط الأول هو الصورة المطلوب وضع النص عليها، أما الوسيط الثاني فهو النص المطلوب وضعه، أما الوسيط الثاني فهي إحداثيات الركن الأيسر السفلي من السلسلة النصية في الصورة. يتم تمثيل الإحداثيات على شكل مجموعات من قيمتين، أي (قيمة إحداثي x، قيمة إحداثي y). أما font فيشير إلى نوع الخط. بعض أنواع الخطوط: FONT_HERSHEY_SIMPLEX, FONT_HERSHEY_PLAIN. أما الوسيط fontScale فهو عامل مقياس الخط الذي يتم ضربه في الحجم الأساسي الخاص بالخط. أما الوسيط color فهو يمثل لونها. أما الوسيط thickness فيمثل سماكة الخط بالبكسل. أما lineType فهذه معلمة اختيارية تعطي نوع الخط الذي سيتم استخدامه. أما آخر وسيط فهو وسيطة اختيارية. عندما تفعله True، يكون أصل بيانات الصورة في الزاوية اليسرى السفلية. خلاف ذلك ، يكون في الزاوية العلوية اليسرى. مثال: import cv2 # قراءة الصورة image = cv2.imread(r'C:\Users\Windows.10\Desktop\All\test5 openeye.jpg') # اسم النافذة التي يتم عرض الصورة فيها window_name = 'Image' # الخط font = cv2.FONT_HERSHEY_SIMPLEX # الإحداثيات org = (100, 50) # fontScale fontScale = 1 # red color in BGR color = (0, 0, 255) # السماكة thickness = 2 # استخدام cv2.putText() image = cv2.putText(image, 'OpenCV', org, font, fontScale, color, thickness, cv2.LINE_AA) # عرض cv2.imshow(window_name, image) cv2.waitKey(0) cv2.destroyAllWindows()
- 2 اجابة
-
- 1
-
يمكنك استخدام التابع cv2.hconcat لدمج الصورتين بشكل أفقي أو cv2.vconcat لدمجهما بشكل رأسي: import cv2 import numpy as np # قراءة الصورتين im1 = cv2.imread(r'C:\Users\Windows.10\Desktop\All\test5 openeye.jpg') im2 = cv2.imread(r'C:\Users\Windows.10\Desktop\All\test4 closedeye.jpg') # دمج الصورتين أفقياً horizontal_img = cv2.hconcat([cv2.resize(im1,(200,200)), cv2.resize(im2,(200,200))]) # دمجهما عمودياً vertical_img = cv2.vconcat([cv2.resize(im1,(200,200)), cv2.resize(im2,(200,200))]) # عرضهما cv2.imshow('Horizontal Image', horizontal_img) cv2.imshow('Vertical Image', vertical_img) cv2.waitKey(0) cv2.destroyAllWindows() الخرج: لاحظ أن ذلك ييتطلب أن تكون الصورتان بنفس الأبعاد وإلا فلن ينجح الأمر بالتأكيد.حيث قمت باستخدام الدالة resize لتعديل الأبعاد. كما يمكنك استخدام الدالة np.concatenate: import numpy as np import cv2 im1 = cv2.imread(r'C:\Users\Windows.10\Desktop\All\test5 openeye.jpg') im2 = cv2.imread(r'C:\Users\Windows.10\Desktop\All\test4 closedeye.jpg') # أفقي vis = np.concatenate((im1, im1), axis=0) # عمودي # np.concatenate((im1, im1), axis=1) cv2.imshow('Horizontal Image', vis) cv2.waitKey(0) cv2.destroyAllWindows()
-
أقرأ اللغة التي تريد استخدامها (سي++ أو جافا أو بايثون -يفضل البدء بالسي إذا كنت مبتدئ-) بشكل نظري ثم اذهب لحل المسائل البرمجية.. قم بحل أكبر عدد ممكن. سأترك لك موقع CodeForces وهو موقع مخصص للتحديات البرمجية ويحوي آلاف المسائل بمختلف الأنواع والمستويات. (افترض أن لديك خلفية رياضية جيدة فهي أساس البرمجة).
-
تقوم بإيقاف تنفيذ الكود لمدة زمنية معين تقدر بالميلي ثانية وتوضع بين قوسين بالشكل(). أي في حال قمت بكتابة: import cv2 as cv I=cv.imread("rose.jpg") cv.imshow(“imag”,I) cv2.waitKey(1000) # statment1 # statment2 . . . # statmentn فهذا يعني أن الصورة سيتم عرضها في نافذة منبثقة وسيتوقف تنفيذ باقي تعليمات الكود لمدة 1000 ميلي ثانية، وبعد انقضاء المدة يستكمل بايثون في تنفيذ باقي التعليمات (لكن الصورة تبقى معروضة في النافذة المنبثقة ولاتحاول إغلاقها لأنك إن قمت بذلك سوف ينهار البرنامج) ولجعلها تختفي لابد من إضافة التعليمة cv2.destroyAllWindows بعدها مباشرةً. أما في حال كانت القيمة الممررة أصغر أو تساوي 0 عندها سوف يتم عرض الصورة وبعد عرضها سوف يتم إيقاف تنفيذ الكود إلى ما لانهاية، ويتم استكمال تنفيذ الكود عند قيامك بالضغط على زر معين (وأيضاً هنا ستبقى الصورة في النافذة مالم تكن التعليمة التالية هي destroyAllWindows ). كما يجب أن تعلم أنه إذا لم تقم باستخدام التعليمة ()cv2.waitKey لن يتم إظهار الصورة. وفي حالة أردت استخدامه مع الفيديو فأنصحك بالاطلاع على السؤال التالي:
-
يمكنك استخدام التابع rectangle الذي يقوم برسم مستطيل على الصورة عن طريق المتغيرات التالية: cv2.rectangle(image, start_point, end_point, color, thickness) x1,y1 ------ | | | | | | --------x2,y2 الوسيط الأول هو الصورة التي تريد الرسم عليها، أما الثاني فهو نقطة بداية المستطيل حيث يمثل إحداثيات الزاوية العليا اليسارية من المستطيل، أما الوسيط الثالث فيمثل الزاويا السفلى اليمينية للصورة وبالتالي عن طريق تحديد هذين الإحداثيين يتم رسم المستطيل على الصورة. والوسيط الرابع هو لون حدود المستطيل. أما الوسيط الأخير فهو سماكة خط حدود المستطيل بالبكسل. على سبيل المثال لنفرض أن ال ROI لدي هي صورة الوجه، وبالتالي يكون: import numpy as np import cv2 from matplotlib import pyplot as plt from google.colab.patches import cv2_imshow img = cv.imread('/content/٢٠٢٠٠٧٣١_١٦٢٨٠٥.jpg') # رسم مستطيل يحدد الوجه cv2.rectangle(img,(405,370),(320,275),(0,255,0),3) cv2_imshow(img) الخرج:
-
يمكنك القيام بذلك من خلال invert_xaxis كالتالي: x = [1, 6, 9, 5,7] y = [3,8,4,15,9] plt.scatter(x,y) # عكس المحور plt.gca().invert_xaxis() plt.title('Matplotlib Reverse Example') plt.show() الخرج: وبشكل مشابه بالنسبة للمحور العمودي يمكنك استخدام invert_yaxis: plt.gca().invert_yaxis() أو من خلال set_xlim لضبط الحدود بالشكل الذي نريده كالتالي: x = [1, 6, 9, 5,7] y = [3,8,4,15,9] plt.scatter(x,y) ax = plt.gca() ax.set_xlim(ax.get_xlim()[::-1]) plt.title('Matplotlib Reverse Example') plt.show() حيث نمرر لها get_xlim للحصول على الامتداد الحالي للمحور ثم نقوم بعكسه من خلال [::-1]. أما بالنسبة للمحور العمودي ففقط نبدل إلى set_ylim و get_ylim.
- 2 اجابة
-
- 1
-
لتغيير حجمها يمكنك استخدام tick_params كالتالي: import matplotlib.pyplot as plt import numpy as np x = np.linspace(0, 10, 1000) y = np.sin(x) fig, ax = plt.subplots() ax.plot(x, np.sin(x), '--b', label ='Sine', color="r",ls='solid') # x تغيير حجم الخط للمحور الأفقي ax.tick_params(axis='x', which='major', labelsize=20) plt.title('Matplotlib xticklabels Example') plt.show() والخرج: حيث أن axis تمثل المحاور التي نريد تطبيق التغيرات عليها ويأخذ القيم {'x', 'y', 'both'}. أما which فكما نعلم قد يكون هناك ticks أساسية وثانوية فهنا من خلال هذا الوسيط أنت تحدد فيما إذا كنت تريد تطبيق التغيرات على العلامات الريسية أم الثانوية أم كلاهما {'major', 'minor', 'both'}. والأهم labelsize الذي يحدد الحجم. أما بالنسبة لتدوير ال tick_params فيمكنك استخدام plt.setp التي تمنحك التحكم الكامل بعملية التدوير وبالدرجة التي تريدها من خلال الوسيط rotation كالتالي: import matplotlib.pyplot as plt import numpy as np x = np.linspace(0, 10, 1000) y = np.sin(x) fig, ax = plt.subplots() ax.plot(x, np.sin(x), '--b', label ='Sine', color="r",ls='solid') # x تغيير حجم الخط للمحور الأفقي ax.tick_params(axis='x', which='major', labelsize=20) # عملية التدوير plt.setp(ax.xaxis.get_majorticklabels(), rotation=270) # تدوير 270 درجة plt.title('Matplotlib xticklabels Example') plt.show() الخرج: حيث نقوم بتمرير درجة التدوير التي نحتاجها مثلاً قمنا بتدويرها 270 درجة لجعلها عمودية، وأيضاً يجب أن نمرر ax.xaxis.get_majorticklabels كوسيط أول للدالة والتي تمثل كل ال ticklabels للمحور الأفقي. أما إذا أردنا تطبيق ذلك على المحور y ففقط نبدل المحور الذي سيتم تطبيق التدوير عليه أي تصبح القيمة الممررة لأول وسيط في الدالة هي ax.yaxis.get_majorticklabels. أي: import matplotlib.pyplot as plt import numpy as np x = np.linspace(0, 10, 1000) y = np.sin(x) fig, ax = plt.subplots() ax.plot(x, np.sin(x), '--b', label ='Sine', color="r",ls='solid') # x تغيير حجم الخط للمحور الأفقي ax.tick_params(axis='x', which='major', labelsize=20) # عملية التدوير plt.setp(ax.yaxis.get_majorticklabels(), rotation=270) # تدوير 270 درجة plt.title('Matplotlib xticklabels Example') plt.show() وأخيراً إذا كان لديك ticklabels ثانوية نمرر للوسيط الأول القيمة ax.youraxix.get_minorticklabels. أي: import matplotlib.pyplot as plt import numpy as np x = np.linspace(0, 10, 1000) y = np.sin(x) fig, ax = plt.subplots() ax.plot(x, np.sin(x), '--b', label ='Sine', color="r",ls='solid') # x تغيير حجم الخط للمحور الأفقي ax.tick_params(axis='x', which='major', labelsize=20) # عملية التدوير plt.setp(ax.yaxis.get_minorticklabels(), rotation=270) # تدوير 270 درجة plt.title('Matplotlib xticklabels Example') plt.show() وكذلك يمكنك تدويرها من خلال set_rotation كالتالي: for tick in ax.get_xticklabels(): tick.set_rotation(270) كذلك بالنسبة للحجم: for tick in ax.xaxis.get_major_ticks(): tick.label.set_fontsize(20)
- 2 اجابة
-
- 1
-
للقيام بذلك يمكنك استخدام الوسيط fontsize مع كل من هذه الدوال، أي يمكنك استخدام هذه الخاصية مع الدالة التي تحدد العنوان والدوال التي تحدد أسماء المحاور: import numpy as np import matplotlib.pyplot as plt x = np.linspace(0, 10, 1000) fig = plt.figure() plt.plot(x, np.sin(x), '--b', label ='Sine') plt.plot(x, np.cos(x), c ='r', label ='Cosine') fig.suptitle('test title', fontsize=22) # تحديد حجم العنوان plt.xlabel('x-label', fontsize=15) # حجم تسمية المحور plt.ylabel('y-label', fontsize=15) # حجم تسمية المحور الثاني plt.show() الخرج: كما يمكنك القيام بتحديد ذلك بشكل globally بالشكل التالي: import matplotlib.pylab as pylab params = {'figure.figsize': (12, 6), # حجم الشكل 'axes.titlesize':30, # حجم عنوان الشكل 'axes.labelsize':20, # حجم اسم المحور الأفقي والعمودي 'ytick.labelsize': 16, # حجم علامات المحور العمودي 'xtick.labelsize':16} # .. الأفقي pylab.rcParams.update(params) import numpy as np import matplotlib.pyplot as plt x = np.linspace(0, 10, 1000) plt.plot(x, np.sin(x), '--b', label ='Sine') plt.plot(x, np.cos(x), c ='r', label ='Cosine') plt.title('test title') plt.xlabel('xlabel') plt.ylabel('ylabel') plt.show() الخرج:
- 1 جواب
-
- 1
-
للتحكم بذلك نستخدم الوسيطين loc و bbox_to_anchor: loc='best', bbox_to_anchor=(x, y) لذا بدايةً دعنا نتعرف على الوسيط loc الذي يأخذ القيم التالية: Location String 'best' 'upper right' 'upper left' 'lower left' 'lower right' 'right' 'center left' 'center right' 'lower center' 'upper center' 'center' فالقيمة "best" تعني أنه سيضعه في أفضل مكان ممكن تلقائياً وهي الحالة الافتراضية. أما "upper right" تعني أنه سيقوم بوضعه في أعلى اليمين وهكذا... أما الوسيط bbox_to_anchor فهو يستخدم لتغيير موضعه بالنسبة ل loc بحيث أن x و y هما إحداثيات الصندوق مثلاً القيمة (0.0, 0.0) تعني أنك تريد وضعه خارجاً عند مبدأ الإحداثيات. انظر للأمثلة التالية: مثال1: import numpy as np import matplotlib.pyplot as plt x = np.linspace(0, 10, 1000) fig, ax = plt.subplots() ax.plot(x, np.sin(x), '--b', label ='Sine') ax.plot(x, np.cos(x), c ='r', label ='Cosine') ax.axis('equal') # هنا قمنا بتعريف صندوق لتوضيح البيانات #في أسفل اليمين legend سنضع ال leg = ax.legend(loc ="lower right"); الخرج: مثال2: هنا سنضعه في الخارج على اليمين (أنت تتحكم بالإحداثيات-عن طريق التجريب-). import numpy as np import matplotlib.pyplot as plt x = np.linspace(0, 10, 1000) fig, ax = plt.subplots() ax.plot(x, np.sin(x), '--b', label ='Sine') ax.plot(x, np.cos(x), c ='r', label ='Cosine') ax.axis('equal') # هنا قمنا بتعريف صندوق لتوضيح البيانات # في أسفل اليمين legend سنضع ال # وسنقوم أيضاً بوضعه في الخارج leg = ax.legend(loc ="lower right",bbox_to_anchor =(1.3, 0.0)) الخرج: مثال3: سنضعه في الخارج عند مبدأ الإحداثيات: import numpy as np import matplotlib.pyplot as plt x = np.linspace(0, 10, 1000) fig, ax = plt.subplots() ax.plot(x, np.sin(x), '--b', label ='Sine') ax.plot(x, np.cos(x), c ='r', label ='Cosine') ax.axis('equal') leg = ax.legend(bbox_to_anchor =(0.0, 0.0)) الخرج: أما بالنسبة لحجم الخط فنستخدم الوسيط fontsize حيث نمرر له حجم الخط مثلاً 11 أو نوع الخط الذي تحتاجه من خلال الكلاس FontProperties أو مباشرةً من خلال ذكر اسمه كما يلي: import numpy as np import matplotlib.pyplot as plt x = np.linspace(0, 10, 1000) fig, ax = plt.subplots() ax.plot(x, np.sin(x), '--b', label ='Sine') ax.plot(x, np.cos(x), c ='r', label ='Cosine') ax.axis('equal') # لتعديل الخط from matplotlib.font_manager import FontProperties # نقوم بتعريف الخط الذي نحتاجه fontP = FontProperties() fontP.set_size('xx-small') # مثلاً هنا تريد أن يكون الخط صغيراً جداً # fontsize اللآن نمرر كائن الخط إلى الوسيط # leg = ax.legend(bbox_to_anchor =(0.6, -0.2), fontsize=fontP) # أو نقوم بتمرير نوع الخط مباشرةً كالتالي # leg = ax.legend(bbox_to_anchor =(0.6, -0.2), fontsize='xx-small') # أو من خلال ذكر الحجم leg = ax.legend(bbox_to_anchor =(0.7, -0.2), fontsize=20) الخرج:
- 1 جواب
-
- 1
-
يمكنك معرفة أبعاد وحجم الصورة وأكبر قيمة فيها بالشكل التالي: import cv2 as cv # قراءة الصورة mat = cv2.imread('/content/closedeye1.jpg') # أبعادها height, width, channel = mat.shape[:3] # عدد عناصرها size = mat.size print("Height= ",height) print("Width= ",width) print("Size= ",size) maxElement = np.amax(mat) print('Max element from Numpy Array : ', maxElement) # الخرج """ Height= 186 Width= 271 Size= 151218 Max element from Numpy Array : 255 """
- 1 جواب
-
- 1
-
كما تعلم فإن مرشحات الحدَ هدفها الأساسي هو العمل المعاكس لمرشحات التنعيم، حيث أن مرشحات التنعيم تقوم بعمل تشويش للصورة وأهم تطبيقاتها هي إزالة الضجيج أو تنعيم الصورة، أما مرشحات الحدَ، فهي بالعكس، حيث أنها تقوم بتوضيح الحواف. كما أنه كنصيحة مني فإنه في حالة كانت الصورة الخاصة بك تحوي بعض الضجيج فلابد من أن تقوم أولاً بتطبيق مرشح تنعيم على الصورة لإزالة الضجيج منها، فالضجيج هو حافة في نهاية الأمر وبالتالي تطبيق مرشح تعزيز (حدَ) سيؤدي إلى تعزيز الضجيج وهذا أمر غير مرغوب فيه. هناك تقنيات عدة تقنيات لزيادة حدة الصورة وتعتمد كلها على تقنيات الحد sharpening Spatial Filters، وتعتمد على نوعين من المشتقات، مشتقات الدرجة الأولى مثل مرشح سوبل أو الثانية مثل مرشح لابلاسيان، ثم نستخدم المعادلة التالية -مثلاً في حالة استخدام لابلاسيان تكون: g(x,y)=f(x,y)+c[∇2f(x,y)] g(x,y): الصورة المعززة f(x,y): الصورة الأصلية ∇2f(x,y): الصورة بعد تطبيق مرشح الحد(لابلاسيان) حيث أن قيمة المعامل c هي إما 1 أو -1 وتعتمد على الكيرنل التي استخدمتها في تطبيق لابلاسيان وتساوي إما 1 أو -1 بحيث: laplacian1=np.array( [[0,1,0], [1,-4,1], [0,1,0]]) # تكون قيمة c=1- laplacian2=np.array( [[1,1,1], [1,-8,1], [1,1,1]]) # c=1- laplacian3=np.array([[0,-1,0], [-1,4,-1], [0,-1,0]]) # c=+1 laplacian4=np.array([[-1,-1,-1], [-1,+8,-1], [-1,-1,-1]]) # c=+1 في المثال التالي سنقوم بتطبيق الفكرة السابقة وهي أفضل طريقة لزيادة حدة الصورة بالاعتماد على مشتقات الدرجة الثانية (لابلاسيان) والمعادلة السابقة: import cv2 as cv import matplotlib.pyplot as plt # قراءة الصورة image = cv2.imread('/content/closedeye1.jpg',1) # matplotlib هنا فقط سأقوم بتحويل فضاء الألوان لأنني سأقوم بعرض الصورة باستخدام image=cv2.cvtColor(image, cv2.COLOR_BGR2RGB) plt.imshow(image) # سنجرب فلاتر لابلاسيان المختلفة laplacian1=np.array([[0,1,0],[1,-4,1],[0,1,0]]) # c=-1 laplacian2=np.array([[1,1,1],[1,-8,1],[1,1,1]]) # c=-1 laplacian3=np.array([[0,-1,0],[-1,4,-1],[0,-1,0]]) # c=1 laplacian4=np.array([[-1,-1,-1],[-1,8,-1],[-1,-1,-1]]) # c=1 # تطبيق الفلاتر لنرى نتيجة كل واحد على الصورة image_laplacian1=cv.filter2D(src=image, kernel=laplacian1, ddepth=-1) image_laplacian2=cv.filter2D(src=image, kernel=laplacian2, ddepth=-1) image_laplacian3=cv.filter2D(src=image, kernel=laplacian3, ddepth=-1) image_laplacian4=cv.filter2D(src=image, kernel=laplacian4, ddepth=-1) # تعزيز الصور image_sharping_1=cv2.subtract(image,image_laplacian1) image_sharping_2=cv2.subtract(image,image_laplacian2) image_sharping_3=cv2.add(image,image_laplacian3) image_sharping_4=cv2.add(image,image_laplacian4) # عرض النتائج import matplotlib.pyplot as plt plt.figure(figsize=(15,30)) plt.subplot(521) plt.imshow(image) plt.title("original image") plt.subplot(522) plt.imshow(image_sharping_1) plt.title("sharpenend_image 1") plt.subplot(523) plt.imshow(image_sharping_2) plt.title("sharpenend_image 2") plt.subplot(524) plt.imshow(image_sharping_3) plt.title("sharpenend_image 3") plt.subplot(525) plt.imshow(image_sharping_4) plt.title("sharpenend_image 4") الخرج:
- 2 اجابة
-
- 1
-
لرسم هيستوغرام يمكنك استخدام الدالة hist في Matplotlib: matplotlib.pyplot.hist(x, bins=None, range=None, density=False, histtype='bar',align='mid', orientation='vertical', color=None, label=None, stacked=False, data=None, **kwargs) ولإنشاء هيستوغرام (مدرج تكراري)، فإن الخطوة الأولى هي إنشاء حاوية للنطاقات أو المجالات " bin of the ranges "، ثم توزيع النطاق الكامل للقيم في سلسلة من الفواصل الزمنية، وإحصاء القيم التي تقع في كل من الفواصل الزمنية. أي بمعنى أوضح مثلاً في حالة لديك صورة رمادية فإن السويات اللونية والتي تمثل المحور الأفقي تكون من 0 ل255 وتريد معرفة عدد مرات تكرار كل سوية لونية في الصورة (كم بكسل في الصورة يحمل هذه القيمة) ولسبب ما تريد أن تقسم هذا السويات إلى نطاقات (مجالات) مثلاً تريد تقسيمها إلى 64 مجال بحيث كل مجال يحوي 4 سويات لونية. وبالتالي نكون هنا قد حددنا الحاويات وتبقى لنا أن نقوم بإحصاء البكسلات التي تنتمي إلى كل حاوية من هذه الحاويات. الآن بالعودة للوسطاء فإن أول وسيط يمثل المصفوفة التي نريد حساب هستوغرامها (قد تمثل صورة أو أياً كان)، والوسيط الثاني bins هو عدد صحيح يمثل عدد الحاويات، أما range فيحدد القيمة الدنيا والعليا لل bins. أما density فهي قيمة منطقية، ويؤدي تفعيلها لرسم كثافة احتمالية وسيتم إرجاعها من الدالة، وهنا ستعرض كل حاوية العدد الأولي للحاوية مقسوماً على العدد الإجمالي للأعداد وعرض الحاوية: (density = counts / (sum(counts) * np.diff(bins))) بحيث تتكامل المنطقة الموجودة أسفل المدرج التكراري مع 1: (np.sum(density * np.diff(bins)) == 1) وإذا كان stacked مفعلاً أيضاً، فسيتم تسوية (normalized) مجموع الرسوم البيانية إلى 1. أما الوسيط histtype فهو يحدد نوع الرسم البياني المراد رسمه {'bar', 'barstacked', 'step', 'stepfilled'} وافتراضياً يكون bar، وهو الرسم بياني التقليدي (أشرطة أو أعمدة). بحيث يتم ترتيب الأشرطة جنباً إلى جنب. والنوع الثاني barstacked وهو مدرج تكراري من نوع شريط bar حيث يتم تكديس العديد من البيانات فوق بعضها البعض.أما النوع step مخطط خطي غير معبأ بشكل افتراضي. وأخيراً stepfilled يولد مخطط خطي معبأ بشكل افتراضي. أما الوسيط align فيحدد المحاذاة الأفقية لأشرطة الرسم البياني. "left": تتركز الأشرطة على حواف الحاوية اليسرى. "mid": تتمركز الأشرطة بين حواف الحاوية. "right": تتركز الأشرطة على حواف الحاوية اليمنى. أما orientation فقيمه هي {'vertical', 'horizontal'}، فإذا كان "أفقياً" ، فسيتم استخدام barh -أي bar لكن معكوس- للمخططات البيانية من النوع الشريطي وسيكون kwarg السفلي هو الحواف اليسرى. أما ال color فهو لتحديد اللون. وأخيراً ففي حالة التغعيل True فسيتم تكديس بيانات فوق بعضها البعض. أما في حال عدم التفعيل False فيتم ترتيب البيانات المتعددة جنباً إلى جنب إذا كان نوع هيست هو "bar" أو فوق بعضها البعض إذا كان النوع هو "step". مثال 1: سنقوم بتوليد بيانات عشوائية ثم سنقوم بعرض هستوغرامها: import matplotlib.pyplot as plt import numpy as np x = np.random.normal(170, 10, 250) plt.hist(x) plt.show() الخرج: مثال2: 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, 'Ali Haidar Ahmad', 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('Hsoub') # عرض plt.show() الخرج: مثال 3: import matplotlib.pyplot as plt import cv2 # قراءة صورة im = cv2.imread('/content/closedeye1.jpg') # نقوم بتسطيح الصورة لتصبح أحادية الأبعاد vals = im.flatten() # هنا كونك تريد أن تقوم برسم هيستوغرام صورة فيجب أن تضع عدد الحاويات على 255 إلا إذا كنت تريد شيئاً آخر # 255 = bins plt.hist(vals, 255) plt.xlim([0,255]) plt.show() الخرج:
- 2 اجابة
-
- 1
-
إن ماتتحدثين عنه هو ال activities (أنشطة) الأساسية الموجودة في أي نظام برمجي. وهذه ال activities تختلف تسميتها عادةً من مرجع إلى آخر: { 1.التوصيف البرمجي. 2.تطوير البرمجيات. 3.الاختبار أو التقييم. 4.التطور } أو {1.التحليل. 2.التصميم. 3.التنجيز. 4. الاختبار}. وفي بعض الأحيان تسمى المرحلة الأولى بمرحلة (التواصل). و ذلك لأننا نتواصل مع ال stakeholders لتحديد الخدمات التي يقدمها النظام أو تسمى بمرحلة (التعرف على المشكلة) و هي مرحلة تمهيدية و نتيجة لتلك المرحلة يظهر بما يعرف بوثيقة تعريف المشكلة و بعد ذلك نحدد النظام المراد لحل هذه المشكلة، فهي بالنهاية مرحلة جمع المتطلبات. وبعد القيام بعملية جمع المتطلبات تقوم بتجميع المتطلبات و نحذف أي طلبات مكررة كما أننا نعتمد على متطلب واحد إذا وجد متطلبان متعاكسان (متناقضان) و كمثال على ذلك:وجد لدينا متطلبان هما security عالي مع أداء سريع و هما متطلبان متناقضان و لا يمكن تحقيقهما في نفس الوقت. و لذلك نعود إلى ال stakeholders و ذلك لنرى ما هو المتطلب من بينهما الأكثر أولوية و عندها نختاره على حساب المتطلب الآخر. الآن مارأيك قبل أن نكمل أن نقوم بالرجوع قليلاً للتعرف على الإجرائية البرمجية، فما هي ؟؟ هي مجموعة الأنشطة المترابطة مع بعضها البعض التي تؤدي إلى إيجاد نظام جديد أو تطوير نظام قديم. فنحن بين حلنا لهذه المشكلة و إيجاد النظام البرمجي لدينا مجموعة من الخطوات وهذه الخطوات يتم تمثيلها الإجرائيات البرمجية . ويمكن النظر إلى software engineering على أن الهدف منه تطوير النظم البرمجية و ذلك وفق ثلاث قيود: 1. الجود العالية (high quality). 2. الكلفة المنخفضة (low cost). 3. رضى الزبون (Max satisfaction). ورضى الزبون يعتبر المعيار الأساسي. و نحن دائماً بحاجة إلى خطوات لاتباعها من بداية ظهور المشكلة لتطوير النظام البرمجي تبعا لإجرائية برمجية، و هي ليست لديها نهاية لأنها تبقى طالما النظام يعمل حتى ننتهي من عمليات التطوير ، و هذه الخطوات تسمى بالإجرائيات البرمجية. و كذلك نحن بحاجة إلى methods معينة مثل (برمجة غرضية التوجه OPP ..) كما أننا في هذه الخطوات بحاجة لوضع خطط معينة لحساب التكلفة مثل أو تقسيم العمل أو حساب أعداد المهندسين و قدراتهم أو حساب الجدول الزمني و كل ما سبق يسمى بالمرحلة التمهيدية، و بعد المرحلة التمهيدية يتبين لنا النظام إذا كان visible نباشر في تطويره و إذا لم يكن visible ننسف النظام كله. إذن استناد ا إلى الشرح السابق تكون الإجرائية البرمجية: مجموعة الأنشطة و الطرق و الأدوات و المخططات المترابطة بعضها البعض التي تؤدي لفهم المشكلة و إيجاد نظام جديد مجدي لحل تلك المشكلة و الذي يحقق الكلفة المنخفضة و الجودة العالية و رضا الزبون. و تلك النشاطات نقسمها إلى أربعة أقسام عامة (كما قلت لك تختلف تسميتها لكن هي نفس المراحل): 1. التوصيف البرمجي أو program specifications (التحليل): تحديد ماهو مطلوب من النظام أو ما يقدمه النظام من خدمات. و هذا ما نعرفه من ال stake holders، حيث هم أشخاص أو مؤسسسات تمثل بأشخاص يؤثرون أو يتأثرون بطريقة مباشرة أو غير مباشرة في هذا النظام. فبعد عملية تحديد المشكلة نقوم بتحديد ال stake holders ثم نقوم بعملية جمع المتطلبات، و بعد عملية جمع المتطلبات، نقوم بتحليل المتطلبات و تصنيفها و ذلك بالاتفاق مع ال stake holders و هذا ما نسميه بالتوصيف. وتنتهي مرحلة التوصيف بوثيقة تسمى دفتر الشروط أو وثيقة المتطلبات، فبعد تحديد المشكلة يتم تحديد ال stakeholders و نرى المتطلبات و الأولويات لهذه المتطلبات و ذلك بالعودة إلى ال stakeholders و بعد ذلك نعالج هذه المتطلبات و نزيل التكرار ونرى المتطلبات المتناقضة و نختار أحدها بالاتفاق مع ال stakeholders ، و بعد ذلك تكتب هذه المتطلبات في وثيقة هي وثيقة نهاية مرحلة التوصيف و تسمى بوثيقة المتطلبات أو دفتر الشروط. 2. التصميم و التنجيز design and implementation: و لهذه المرحلة ننتقل من مرحلة ما هو مطلوب من النظام إلى مرحلة تحقيق ما هو مطلوب من هذا النظام . و المسؤول عن هذه المرحلة هو المصمم و للمصمم وظائف عديدة هي: 1. عليه أن يعرف بمعمارية النظام، ونقصد بمعمارية النظام أي تقسيم النظام إلى أجزاء بحيث يؤدي كل جزء من الأجزاء خدمة معينة دون أن تتكرر هذه الأجزاء أو تتناقض، بل يجب أن تتكامل. كما يجب وضع الخوارزميات الملائمة لكل جزء من الأجزاء حيث أنه يعتمد على عمل المحلل و يقوم بتوزيع الخدمات التي يقدمها المحلل إلى تلك الأجزاء المتكاملة التي تكوّن النظام. 2. يجب أن يقوم بتصميم قاعدة المعطيات و مخططات ال أن يقوم بتصميم قاعدة المعطيات و مخططات ال ERD الخاصة بهذا النظام و المناسبة له. 3. يقوم بتصميم الواجهات الخاصة بالنظام البرمجي و يعتبر تصميم الواجهات المعيار الأساسي لنيل رضا الزبون و لقبول النظام. ثم يأتينا ال code generation أو التنجيز وهذه المرحلة هي مرحلة بسيطة و تافهة بالنسبة للمرحلتين السابقتين و يقوم بهذه المرحلة المبرمج بكتابة الخوارزميات التي صممها المصمم و تحويلها إلى code. 3.testing (الاختبار): وهي مرحلة تجريب النظام و هي لا تعني أن نجربه كي لا نكتشف أخطاء بل تهدف إلى تجريب النظام بهدف العثور على أخطاء و تصحيحها و يكون النظام ناجحاً أكثر كلما كانت الأخطاء به أكثر. وعمليات ال testing عموماً لا تتم فقط في هذه المرحلة بل تكون مقسمة إلى أجزاء بحيث أن كل مرحلة من المراحل السابقة يكون لدينا testing معين في نهايتها و هذا ما نسميه بنظام المظلة أو umbrella Activity وبهذه الطريقة يكون لدينا عمليات testing و اختبارات على مدى تطور النظام حيث أن الإجرائية البرمجية تبدأ من لحظة الفكرة و تستمر إلى اللانهاية و في كل جزء من أجزاءها يكون لدينا عمليات testing تظلل النظام و من هنا جاءت كلمة مظلة لأنه نشاط يبدأ معها و يستمر معها إلى اللنهاية. 4.التطوير (الصيانة): هي عملية تعديل منتج البرنامج بعد تسليمه للعميل. والغرض الرئيسي من صيانة البرامج هو تعديل تطبيقات البرامج وتحديثها بعد التسليم لتصحيح الأخطاء وتحسين الأداء وإضافة خصائص جديدة إلى البرنامج..إلخ.