Ahmed Sharshar
الأعضاء-
المساهمات
348 -
تاريخ الانضمام
-
تاريخ آخر زيارة
نوع المحتوى
ريادة الأعمال
البرمجة
التصميم
DevOps
التسويق والمبيعات
العمل الحر
البرامج والتطبيقات
آخر التحديثات
قصص نجاح
أسئلة وأجوبة
كتب
دورات
كل منشورات العضو Ahmed Sharshar
-
قد نحتاج لعمل فهرسة لعدة أعمدة سويا في عدة حالات منها: استرجاع بيانات التي تحتاج تحقيق عدة شروط سويا تجميع البيانات أو فرزها بعد تنظيف البيانات بعد البحث تكرار فهرسة عدة أعمدة لجدول واحد تسريع عمليات البحث في عدة أعمدة الصيغة العامة لعمل فهرسة لعدة أعمدة سويا كالتالي: CREATE INDEX [index name] ON [Table name]([column1, column2, column3,...]); وترتيب الفهرسة هو نفسه الذي يظهر عند دمج الأعمدة سويا. المثال التالي يوضح كيفية استخدامها. دعنا ننشئ جدولنا ونضع به بعض القيم كالتالي: CREATE TABLE class_records(id INT,firstname VARCHAR(50),lastname VARCHAR(50)); edb=# insert into class_records values (1,'harman','baweja'); INSERT 0 1 edb=# insert into class_records values (2,'hardik','pandya'); INSERT 0 1 edb=# insert into class_records values (3,'tom','lane'); INSERT 0 1 ثم عمل الفهرسة كالتالي: create index class_records_index1 on class_records (lastname,firstname); CREATE INDEX
- 2 اجابة
-
- 1
-
يمكنك ببساطة إضافة cmap='gray' كمعامل داخل Imshow كالتالي: import numpy as np import matplotlib.pyplot as plt from PIL import Image fname = 'image.png' image = Image.open(fname).convert("L") arr = np.asarray(image) plt.imshow(arr, cmap='gray', vmin=0, vmax=255) plt.show() لاحظ اننا حددنا أقل قيمة للبيكسل ب 0 وأعلى قيمة ب 255 لنضمن انها في حيز الأبيض والأسود وتظهر كالتالي: يمكنك كذلك قراءة الرمادي بشكل معكوس يمكنك استخدام cmap='gray_r'. اما اذا أردتها أبيض وأسود يمكنك استخدام imshow(..., cmap=pyplot.cm.binary)
-
يمكنك فصل طبقات الألوان باستخدام split من opencv، حيث نقوم بفصل الأزرق والأحمر والأخضر عن الصورة الأصلية وعرضهم كالتالي: image = cv2.imread(args["image"]) (B, G, R) = cv2.split(image) # اظهار كل طبقة لون بشكل منفصل cv2.imshow("Red", R) cv2.imshow("Green", G) cv2.imshow("Blue", B) cv2.waitKey(0) وتظهر هكذا: كذلك تستطيع اعادة تجميعهم مرة أخرى بسهولة كالتالي: merged = cv2.merge([B, G, R]) cv2.imshow("Merged", merged) cv2.waitKey(0) cv2.destroyAllWindows() وتظهر الصورة بعد التجميع هكذا:
-
قد لا يكون هناك دوال جاهزة لمثل تلك الأنواع من الضجيج في opencv ، وهناك حينها طريقتان: اما عملها بشكل يدوي كما أشارت الإجابة السابقة. أو الأستعانة بمكتبات أخرى لإضافة تلك الأنواع مثل مكتبة scikit-image والتي تحوي تلك الأنواع من الضوضاء، المثال التالي يوضح كيفية استخدامها في اضافة ضوضاء جاوس: from PIL import Image import numpy as np from skimage.util import random_noise im = Image.open("test.jpg") # تحويل الصورة الى numpy im_arr = np.asarray(im) # ااضفة الضوضاء الجاوسية noise_img = random_noise(im_arr, mode='gaussian', var=0.05**2) noise_img = (255*noise_img).astype(np.uint8) img = Image.fromarray(noise_img) img.show() وتكون هذه هي النتيجة: ويمكنك بنفس الطريقة استخدام s&p من أجل ضوضاء (salt and pepper). كذكل يمكنك استخدام الدالة التالية والتي تقوم فقط فقيها بتمرير نوع الضوضاء التي تريد وهي بدورها تقوم بتطبيق هذه الضوضاء: import numpy as np import os import cv2 def noisy(noise_typ,image): if noise_typ == "gauss": row,col,ch= image.shape #ضوضاء جاوس mean = 0 #var = 0.1 #sigma = var**0.5 gauss = np.random.normal(mean,1,(row,col,ch)) gauss = gauss.reshape(row,col,ch) noisy = image + gauss return noisy elif noise_typ == "s&p": row,col,ch = image.shape s_vs_p = 0.5 amount = 0.004 out = image # Salt نظام num_salt = np.ceil(amount * image.size * s_vs_p) coords = [np.random.randint(0, i - 1, int(num_salt)) for i in image.shape] out[coords] = 1 # Pepper نظام num_pepper = np.ceil(amount* image.size * (1. - s_vs_p)) coords = [np.random.randint(0, i - 1, int(num_pepper)) for i in image.shape] out[coords] = 0 return out
-
بالإضافة للطرق السابقة يمكن كذلك حذف بواسطة الشروط مباشرة مثل المثال التالي: DELETE FROM customer1 WHERE agent_code=ANY( SELECT agent_code FROM agents WHERE working_area='Egypt'); كذلك تستطيع استخدام الاختصارات alias مع جمل الحذف، وكذلك استخدام المعامل In كالتالي: DELETE FROM agent1 da WHERE 3 IN( SELECT grade FROM customer cu WHERE agent1.agent_code<>customer.agent_code); أو تحديد قيم معينه باستخدام min و max وحذف سواء كل ما هو أكبر أو أصغر من تلك القيم: DELETE FROM agent1 WHERE agent_code IN (SELECT agent_code FROM orders a WHERE ord_amount=( SELECT MIN(ord_amount) FROM orders b WHERE a.ord_date=b.ord_date));
-
count تقوم بجمع وحساب القيم التي تقوم بتجميعها سويا اما في نفس الجدول أو من جداول مختلفة، لأجل ذلك عادة ما تستخدم مع groupby وذلك لتجميع مانريد عده سويا في مكان واحد، المثال التالي يوضح ذلك. لنفرض أن عندنا جدولين كالتالي: Table 1: id, category id, colour Table 2: category id, category name ونريد أن نقوم بجمعهم سويا ثم عد قيم كل فئة category، الكود التالي يوضح كيفية القيام بذلك: SELECT COUNT(*) TotalCount, b.category_id, b.category_name FROM table1 a INNER JOIN table2 b ON a.category_id = b.category_id GROUP BY b.category_id, b.category_name لاحظ أنه قام بتجميع الجدولين سويا باستخدام INNER JOIN وبعد ذلك تقسيمهم بناء علي category id ثم عدهم.
- 2 اجابة
-
- 1
-
يمكنك استخدام الدالة copyMakeBorder لعمل الإطار كما في الإجابة السابقة مع امكانية تغيير شكل اللون والخط وسمك الخط ... كذلك يمكنك فعلها بطريقه يدويه عن طريق اضافة صف أو اثنثن أو أكثر من الأصفار (والتي تمثل اللون الأسود) حول الصورة لتكون إطارا لها. كذلك يمكنك تغيير سمك الإطار بزيادة أو تقليل عدد الصفوف من الأصفار كذلك اختيار أي درجة لون تريد ليتم ملئ قيمتها في الإطار، الكود التالي يوضح هذا: import cv2 import numpy as np #مكان الصورة img=cv2.imread("C:\\Users\\ahmed\\Desktop\\img_src.jpg") #أبعاد الصورة h,w=img.shape[0:2] #زيادة أبعاد الصورة لوضع الإطار base_size=h+20,w+20,3 # ملئ الإطار بالأصفار base=np.zeros(base_size,dtype=np.uint8) cv2.rectangle(base,(0,0),(w+20,h+20),(255,255,255),30) base[10:h+10,10:w+10]=img cv2.imwrite('C:\\Users\\ahmed\\Desktop\\border.png',img) وتظهر هكذا:
-
بشكل عام يمكن اعتبار الفرق بين الأثنين أقرب لكونه طريقة كتابة فقط الا أنه هناك بعض الفروقات الصغيرة بينهما. ON هو الأكثر عمومية . يمكن استخدامها لضم merge الجداول على عمود مشترك ، أو مجموعة من الأعمدة أو حتى شرط كالمثال التالي: SELECT * FROM world.City JOIN world.Country ON (City.Code = Country.Code) بينما يكون USING مفيدًا عندما يشترك كلا الجدولين في عمود يحمل نفس الاسم الذي ينضمون إليه. في هذه الحالة كمثال: SELECT ... FROM Country JOIN world USING (country_id) WHERE ... كذلك من الأشياء الرائعة الإضافية أن المرء لا يحتاج إلى تأهيل الأعمدة للدمج بشكل كامل هكذا: SELECT film.title, film_id FROM film JOIN film_actor USING (film_id) WHERE ... عوضا عن كتابتها باستخدام ON كاملة هكذا: SELECT film.title, film.film_id FROM film JOIN film_actor ON (film.film_id = film_actor.film_id) WHERE ...
- 2 اجابة
-
- 1
-
يمكنك استخدام plt.grid لرسم أي grid تريد سواء كانت أفقية فقط، أو رأسية فقط، أو كلاهما مع تحديد شكل الgrid كذلك، المثال التالي يوضح كيفية استخدامها في الكود الخاص بك: # -*- coding: utf-8 -*- """ Created on Wed Oct 27 00:22:00 2021 @author: ahmed """ 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') # إضافة نص للشكل fig.text(0.9, 0.15, 'Histogram', fontsize = 13,color ='red',ha ='right', va ='top',alpha = 0.7) # plot حذف خطوط حاويةال for s in ['top', 'bottom', 'left', 'right']: axs.spines[s].set_visible(False) #وضع مسافة بين التسميات وبين المحاور axs.xaxis.set_tick_params(pad = 4) axs.yaxis.set_tick_params(pad = 8) # إنشاء الهستوغرام N, bins, patches = axs.hist(x, bins = n_bins) # تحديد الألوان fracs = ((N**(9)) / N.max()) norm = colors.Normalize(fracs.min(), fracs.max()) for thisfrac, thispatch in zip(fracs, patches): color = plt.cm.viridis(norm(thisfrac)) thispatch.set_facecolor(color) # تسمية للمحاور plt.xlabel("X-axis") plt.ylabel("y-axis") plt.legend(legend) # عنوان plt.title('Histogram') #رسم الgrid plt.grid(color = 'green', linestyle = '--', linewidth = 0.5) # عرض plt.show() لاحظ تحديد لونه باللون الأخضر وشكله كذلك وحجمه ويظهر كالتالي: يمكنك كذلك رسمه بشكل رأسي فقط عن طريق استبدال سطر الرسم هكذا: plt.grid(axis = 'x') وتظهر هكذا: وبنفس الطريقة يمكنك جعلها أفقية بدلا من راسية باستبدال ال x ب y فقط.
-
للتحويل بشكل بسيط يمكنك استخدام Numpy اذا كان هناك مشاكل في استخدام opencv كالتالي: def convert(img, target_type_min, target_type_max, target_type): imin = img.min() imax = img.max() a = (target_type_max - target_type_min) / (imax - imin) b = target_type_max - a * imax new_img = (a * img + b).astype(target_type) return new_img حيث تقوم الدالة بقسمة قيمة كل بكسل على أكبر قيمة موجودة لبيانات الصورة. بعد ذلك يمكنك استخدام الدالة بسهولة هكذا: imgu8 = convert(img16u, 0, 255, np.uint8) اما عن استخدام SimpleBlobDetector فهو بسيط ومباشر، المثال التالي يوضح كيفية استخدامها على صورة دون أي تحويل: import cv2 import numpy as np; # قراءة الصورة im = cv2.imread("blob.jpg") # استدعاء SimpleBlobDetector . params = cv2.SimpleBlobDetector_Params() # تغيير قيمة العتبة params.minThreshold = 10 params.maxThreshold = 200 # تصفية بالمساحة params.filterByArea = True params.minArea = 1500 # تصفية حسب الدائرية params.filterByCircularity = True params.minCircularity = 0.1 # تصفية حسب التحدب params.filterByConvexity = True params.minConvexity = 0.87 # تصفية حسب القصور الذاتي params.filterByInertia = True params.minInertiaRatio = 0.01 #انشاء الكاشف detector = cv2.SimpleBlobDetector_create(params) # تحديد blobs. keypoints = detector.detect(im) # رسم دوائر حمراء حولها im_with_keypoints = cv2.drawKeypoints(im, keypoints, np.array([]), (0,0,255), cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS) # اظهارها cv2.imshow("Keypoints", im_with_keypoints) cv2.waitKey(0)
-
في البداية علينا فهم معنى الصورة الرمادية، هي تتكون من عدد من البيسكل متراوحة من 0 الى 255 بحيث ان 0 هو الأسود و 255 هو الابيض. لذلك لعكس الأبيض مع الأسود كل ما علينا فعله هو طرح ال 255 من قيمة كل بيكسل وبذلك يتحول الأبيض الي مقابله من الأسود ببساطة. قد تستطيع فعل هذا بشكل يدوي عن طريق طرح كل بيكسل ثم رسم الصورة الجديدة هكذا: def inverte(imagem, name): imagem = (255-imagem) cv2.imwrite(name, imagem) def inverte2(imagem, name): for x in np.nditer(imagem, op_flags=['readwrite']): x = abs(x - 255) cv2.imwrite(name, imagem) if __name__ == '__main__': nome = str(sys.argv[1]) image = cv2.imread(nome) gs_imagem = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) inverte(gs_imagem, "invertida.png") inverte2(gs_imagem, "invertida2.png") أو بشكل مختصر بعلامه ~ والتي تعني العكس كالتالي: import cv2 image = cv2.imread("img.png") image = ~image cv2.imwrite("img_inv.png",image) أو باستخدام bitwise_not: imagem = cv2.bitwise_not(imagem) وفي كل الأحوال تظهر كالتالي: الصورة الأصلية بعد التحويل:
-
هناك طريقتين اما باستخدام scatter كالتالي: import matplotlib.pyplot as plt import numpy as np plt.scatter(np.random.randn(100), np.random.randn(100), facecolors='none') أو باستخدام plot كالتالي: import matplotlib.pyplot as plt import numpy as np plt.plot(np.random.randn(100), np.random.randn(100), 'o', mfc='none') وفي كلتا الطريقتين يكون الناتج هكذا:
-
بجانب استخدام matplotlib.pyplot.patches.Rectangle لوضع مستطيل في مكان معين، يمكن استخدامها كذلك لرسم مستطيل على مكان يتم تحديده بشكل تلقائي اذا كان هناك نموذج تم التعلم عليه مسبقا كالتالي: #تحميل النموذج train_images = get_image_files(root/"train") fig, ax = plt.subplots() #اختيار صورة path_img = train_images[0] img = cv2.imread(str(path_img)) img = cv2.cvtColor(img, cv2.COLOR_RGB2BGR) def get_target_ds(name, df): rows = df[df["name"] == name[:-4]] return rows["class"].values, rows[bboxes_cols].values bboxes_cols = ["center_x", "center_y", "width", "height"] labels, boxes = get_target_ds(path_img.name, train_df) x = (boxes[0][0] - boxes[0][2]*0.5)*img.shape[1] y = (boxes[0][1] - boxes[0][3]*0.5)*img.shape[0] w = boxes[0][2] * img.shape[1] h = boxes[0][3] * img.shape[0] #عرض الصورة fig, ax = plt.subplots(figsize = (6,9)) ax.xaxis.tick_top() ax.imshow(img) #رسم مستطيل بشكل تلقائي ax.add_patch(patches.Rectangle((x,y),w,h, fill=False, edgecolor='red', lw=2)) النتيجة: لاحظ اننا لم نحدد مكان المستطيل على الرسمة وانما تم اختيارها بناء على تعليم النموذج من قبل. ذلك الاستخدام مهم للغاية في مجالات object detection أو تحديد الأشياء وغيرها.
-
هناك الكثير من أنماط الرسومات التي يمكنك استخدامها لرسم خط وهي باستخدام linestyle داخل plt.plot، هنا بعضا منها: أولا الخط المنقط ويمكنك رسمة ببساطة كالتالي: import matplotlib.pyplot as plt import numpy as np x = np.linspace(-10, 10, 30) plt.plot(x, x,color="red",linestyle='dotted') plt.legend(['y = x'], loc='upper left') plt.show() الناتج: أو تكون خطوطا صغيرا هكذا: import matplotlib.pyplot as plt import numpy as np x = np.linspace(-10, 10, 30) plt.plot(x, x,color="red",linestyle='dashdot') plt.legend(['y = x'], loc='upper left') plt.show() يمكنك كذلك استخدام ls وتمرير شكل الخط الذي تريده كرسم كالتالي: import matplotlib.pyplot as plt import numpy as np x = np.linspace(-10, 10, 30) plt.plot(x, x,color="red",ls='--') plt.legend(['y = x'], loc='upper left') plt.show()
-
يمكنك ببساطة تحديد اللون مع رسم الدالة في plt.plot بسهولة فقط بتمرير الحرف الأول من اسم الخط كالتالي : #الخط الأول x1 = [1, 2, 3] y1 = [4, 5, 6] #الخط الثاني x2 = [1, 3, 5] y2 = [6, 5, 4] #جعل الخط الأول أخضر plt.plot(x1, y1, "g") #جعل الخط الثاني أحمر plt.plot(x2, y2, "r") وتكون النتيجة كالتالي: أو يمكنك الرسم عن طريق تمرير ال index الخاص باللون كالتالي: import matplotlib.pyplot as plt import numpy as np fig1 = plt.figure() ax1 = fig1.add_subplot(111) for i in range(1,15): ax1.plot(np.array([1,5])*i,label=i) colormap = plt.cm.gist_ncar colors = [colormap(i) for i in np.linspace(0, 1,len(ax1.lines))] for i,j in enumerate(ax1.lines): j.set_color(colors[i]) ax1.legend(loc=2) والنتيجة:
-
يمكنك ببساطة استخدام الدالة matplotlib.pyplot.locator_params(axis=an_axis, nbins=num_ticks) بنفس الطريقة التي في الاجابة السابقة. بالاضافة لذلك تستطيع استخدام الدالة Matplotlib.ticker.MaxNLocator والتي تضع حدا أقصي لعدد ال ticks عن طريق تمرير عدد ال bins بداخلها، لكن لاحظ أن عدد ال ticks يكون أكثر من الرقم الموضوع ب 1: المثال التالي يوضح ذلك: import math import numpy as np import matplotlib.pyplot as plt from matplotlib.ticker import MaxNLocator x=np.linspace(0,2*math.pi,100) y=np.sin(x) fig,axes=plt.subplots(1,1) axes.plot(x, y) axes.yaxis.set_major_locator(MaxNLocator(5)) #الحد الأقصي axes.set_title("Sinx Function") axes.set_xlabel("X") axes.set_ylabel("sinX") plt.show() وتكون النتيجة كالتالي:
-
هناك طريقة مشهورة وهي aspect='equal'لكن تعاني من مشكلة وهي انه الرسومات لا تتمدد بنفس النسبة لتغطي كل الفراغات. وبالاضافة لكل الطرق التي ذكرها علي، يمكنك استخدام الكود التالي ببساطة: import matplotlib.pyplot as plt plt.clf() f, axarr = plt.subplots(2, 2, gridspec_kw = {'wspace':0, 'hspace':0}) for i, ax in enumerate(f.axes): ax.grid('on', linestyle='--') ax.set_xticklabels([]) ax.set_yticklabels([]) plt.show() plt.close() وتظهر هكذا: أو يمكنك استخدام gridspec لضبط المسافة بين اللرسومات يدويا كالتالي: import matplotlib.pyplot as plt import matplotlib.gridspec as gridspec plt.figure(figsize = (2,2)) gs1 = gridspec.GridSpec(2, 2) gs1.update(wspace=0.025, hspace=0.05) # ضبط المسافات for i in range(4): ax1 = plt.subplot(gs1[i]) plt.axis('on') ax1.grid(b = True, color ='red', linestyle ='-.', linewidth = 0.5, alpha = 0.6) ax1.set_xticklabels([]) ax1.set_yticklabels([]) ax1.set_aspect('equal') plt.show() وتظهر هكذا:
-
هنا أنت تريد رسم الوقت بالساعات والدقائق والثواني، لذا يمكننا استخدام المكتبة datetime لجلب الوقت بالشكل الذي تريده ثم ادخال البيانات التى تعود منها على المحاور ورسمها بسهولة كالتالي: import datetime import random import matplotlib.pyplot as plt # جلب بعض البيانات عن الوقت x = [datetime.datetime.now() + datetime.timedelta(hours=i) for i in range(12)] y = [i+random.gauss(0,1) for i,_ in enumerate(x)] # الرسم plt.plot(x,y) # تنسيق شكل الوقت plt.gcf().autofmt_xdate() plt.show() وتظهر هنا هكذا: ويمكنك تغيير شكل الرسم ولونه ، بشكل عام التحكم في الرسم كما تتحكم به في matplotlib العادية، أو تغيير طريقة عرض الوقت اذا أردت.
-
يمكنك عمل ذلك عن طريق انشاء مصفوفة صفرية بسهولة ثم تلوين الأجزاء التي تريد بسهولة هكذا: import cv2 import numpy as np #انشاء مصفوفة صفرية blank_image = np.zeros((height,width,3), np.uint8) الأن جاء جزء التلوين، هنا اذا أردت مثلا تلوين النص الأيمن باللون الأخضر والنص الأيسر باللون الأزرق يمكنك استخدام الكود: blank_image[:,0:width//2] = (255,0,0) blank_image[:,width//2:width] = (0,255,0) ويمكنك تباعا أستخدام نفس الطريقة لتلوين الصورة بالشكل الذي تريد لتكون RGB كما تشاء.
-
يمكنك استخدام المكتبة pytesseract بسهولة مع opencv من أجل استخرجا الكلمات من الصور دون الحجاة الى اللجوء لنماذج معقدة من deep learning وغيرها. في البداية عليك تنزيل المكتبة من ال terminal كالتالي: pip install pytesseract بعد ذلك أنظر الكود التالي والذي يوضح بشكل سهل كيفية أداء المهمة ببساطة: #استدعاء المكتبات import cv2 import pytesseract pytesseract.pytesseract.tesseract_cmd=r'C:Program FilesTesseract-OCRtesseract.exe' #قراءة الصورة img = cv2.imread("image.jpg") #تحجيم الصورة img = cv2.resize(img, (400, 450)) #عرض الصورة cv2.imshow("Image", img) #استخراج الكلمات من الصورة text = pytesseract.image_to_string(img) #طباعة الكلمات print(text) cv2.waitKey(0) cv2.destroyAllWindows() وتكون ناتج استخراج الكلمات من الصورة كالتالي:
-
اذا أردت حذف المحورين يمكنك استخدام matplotlib.pyplot.axis() بسهولة كالتالي: import matplotlib as plt x = [1, 2, 3] y = [4, 5, 6] plt.plot(x,y) plt.axis('off') وتظهر هكذا: أو اذا أردت اخفاء محور واحد، ولنقل الصادات مثلا، يمكنك استخدام السطر التالي: ax1.axes.get_yaxis().set_visible(False) وبنفس الطريقة يمكن استخدامها لاخفاء المحور السيني x.
-
هناك طريقة بسيطة للغاية لتدوير الصور في opencv باستخدام الدالة rotate والتي تمكن من عكس الصورة بزاوية معينة، المثال التالي يوضح طريقة استخدامها لتدوير صورة بمقدار 90 درجة مع عقارب الساعة: import cv2 #قراءةالصورة الأصلية img = cv2.imread('data/src/lena.jpg') #تدوير الصورة 90 درجة في اتجاة عقارب الساعة img_rotate_90_clockwise = cv2.rotate(img, cv2.ROTATE_90_CLOCKWISE) cv2.imwrite('data/dst/lena_90_clockwise.jpg', img_rotate_90_clockwise) وتظهر كالتالي: أو يمكنك تحريكها عكس عقارب الساعة هكذا: #تدوير الصورة 90 درجة في عكس اتجاة عقارب الساعة img_rotate_90_counterclockwise = cv2.rotate(img, cv2.ROTATE_90_COUNTERCLOCKWISE) cv2.imwrite('data/dst/lena_90_counterclockwise.jpg', img_rotate_90_counterclockwise) أو لفها كاملة كالتالي: #تدوير الصورة 180 درجة img_rotate_180 = cv2.rotate(img, cv2.ROTATE_180) cv2.imwrite('data/dst/lena_180.jpg', img_rotate_180) وهناك طريقة أخرى لقلب الصورة بأي زاوية تريد باستخدام warpAffine: # load the image and show it image = cv2.imread(args["image"]) cv2.imshow("Original", image) # حساب أبعاد الصورة ونقطة المنتصف (h, w) = image.shape[:2] (cX, cY) = (w // 2, h // 2) # لف الصورة 45 درجة M = cv2.getRotationMatrix2D((cX, cY), 45, 1.0) rotated = cv2.warpAffine(image, M, (w, h)) cv2.imshow("Rotated by 45 Degrees", rotated) وتظهر هكذا على صورة أخرى: مع امكانية تحديد الزاوية التي تريد لتدوير الصورة
-
للتحويل من opencv ال PIL كل ما عليك هو استخدام Image.fromarray ، اما من أجل العكس فكل ما عليك هو قراءة ال Numpy array الناتج عن الصورة فقط كالتالي: import cv2 import numpy as np from PIL import Image img = cv2.imread("path/to/img.png") # تغيير الالوان لقراءتها بشكل صحيح img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) im_pil = Image.fromarray(img) # لعكس العملية im_np = np.asarray(im_pil)
-
في البداية لاحظ أن SELECT a.* FROM a JOIN b ON a.col = b.col ليست نفسها: SELECT a.* FROM a WHERE col IN ( SELECT col FROM b ) الا اذا b.col كان فريدا في كل حالة، لذا احذر عند استخدامها اذ قد يؤدوا الى نواتج مختلفة. اما اذا أردت شيئا يعطي نفس نتيجة الاستعلام الأول: SELECT a.* FROM a JOIN ( SELECT DISTINCT col FROM b ) ON b.col = a.col اما بالنسبة للأداء فإن join عادة ما تكون أسرع في التنفيذ، ليس بفارق كبير على أي حال، لكنها قد تكون أبطأ اذا كانت الجداول غير مفهرسة non-indexed tables، لذا فان حتى السرعة قد تتوقف على كيفية استخدامك لها ونوع بياناتك.
- 2 اجابة
-
- 1
-
يمكنك كذلك استخدام UNION ALL والتي تقوم بدمج كل الأعمدة سويا ، ونقوم باستدعاء الأعمدة غير الموجودة في الجدول الأول ك null وكذلك في الجدول الثاني كالتالي: SELECT col1, col2, NULL AS col3 FROM table1 UNION ALL SELECT col1, NULL, col3 FROM table2 أو استخدام FULL OUTER JOIN مع خاصية (false match condition (1 = 2 كالتالي: SELECT COALESCE(t1.a, t2.a) AS col1, t1.col2,t2.col3 FROM Table1 t1 FULL OUTER JOIN Table2 t2 ON 1 = 2
- 2 اجابة
-
- 1