معالجة الصورة أحد أفرع علوم الحاسوب و هي طريقة لأجراء بعض العمليات على صورة من أجل الحصول على نموذج محسن لهذه الصورة أو استخراج بعض المعلومات المفيدة منها .
غالباَ البيانات التي نجمعها تكون بيانات أولية أي أنها غير مناسبة للاستخدام المباشر في التطبيقات لذلك نحتاج إلى تحليل أو إجراء المعالجة المسبقة لها ومن ثم استخدامها .
على سبيل المثال : نريد بناء مجموعة بيانات نستخدمها في نموذج يصنف الصور فيما إذا تحتوي على منزل أو لا بالاعتماد على صورة كدخل لهذا البرنامج ، خطوتنا الأولى ستكون جمع المئات من صور المنازل لكن المشكلة تكمن في أن هذه الصور لن تكون بنفس الأبعاد مثلا لذلك سنحتاج إلى تغيير أبعادها أي معالجتها مسبقاً قبل تقديمها إلى النموذج .
ما سبق هو واحد من العديد من الأسباب التي تجعل من معالجة الصورة أمراً مهمّاَ لأي تطبيق يعتمد على الرؤية الحاسوبية computer vision .
مقدمة إلى مكتبة opencv
مكتبة مفتوحة المصدر من تطوير شركة Intel مبنية على لغة البرمجة c++ ، تعتبر هذه المكتبة الأكثر استخداماَ في معالجة الصورة والرؤية الحاسوبية .
هذه المكتبة غنية بالطرق والتوابع التي تسهل عمليات التعامل مع الصور و معالجتها حيث يمكننا قراءة الصور و إجراء العديد من العمليات عليها كتحويل الصور الملونة إلى صور رمادية gray scale، واقتصاص الصور cropped ، وتغيير أبعاد الصور resizing ، وتحليل الصور كالحصول على الهيستوغرام والكثير من العمليات الأخرى ، سوف نستعرض بعضها في هذا المقال .
قراءة الصور وعرضها على الشاشة :
نريد الآن قراء صورة ، يتم ذلك باستخدام التابع ()imread الذي يأخذ مسار الصورة مع اسمها كوسيط ومن ثم عرضها على الشاشة باستخدام التابع ()imshow الذي يأخذ الصورة المقروءة كوسيط له فيكون الكود البرمجي :
import cv2 as cv img = cv.imread("flower.jpg") cv.imshow("image ", img) cv.waitKey(0)
وتكون النتيجة :
الحصول على بعض معلومات من الصورة ، عدد البكسلات و أبعاد الصورة :
نستخدم الطريقتين size , shape كما هو موضح في الكود البرمجي التالي :
import cv2 as cv
img = cv.imread("flower.jpg")
pixels = img.size
dimensions = img.shape
print("number of pixels :",pixels)
print("dimensions",dimensions)
cv.waitKey(0)
ويكون خرج المقطع البرمجي السابق :
number of pixels :270000
dimensions (300,300,3)
حفظ الصور :
نريد الآن قراءة صورة وحفظها باسم جديد في مسار آخر على الحاسوب باستخدام التابع ()imwrite ، نمرر له وسيطين ، الأول المسار الذي أريد الحفظ فيه واسم الصورة عن طريق الدمج بينهم باستخدام ()path.join من مكتبة النظام os المضمنة في بايثون ، والثاني هو الصورة المقروءة .
يكون المقطع البرمجي لتحقيق ذلك :
import cv2 as cv
import os
("img = cv.imread("flower.jpg
'path='C:\\Users\\Windows.10\\Desktop
cv.imwrite(os.path.join(path,"newImg.jpg"),img)
(cv.waitKey(0
وبالنظر إلى سطح المكتب يمكننا التأكد من أنه تم إنشاء صورة تحمل الاسم newImg.jpg .
التحويل إلى gray scale :
نستخدم التابع ()cvtColor ونمرر له وسيطين الأول هو الصورة المراد تحويلها و الثاني cv.COLOR_BGR2GRAY الذي يعبر عن نمط التحويل من الصورة الملونة إلى اللون الرمادي ويكون الكود البرمجي :
import cv2 as cv
img = cv.imread("flower.jpg")
grayImg = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
cv.imshow("gray Scale ", grayImg)
cv.waitKey(0)
بعد تنفيذ الكود السابق نحصل على النتيجة التالية :
تغيير أبعاد الصورة resizing :
نستخدم التابع ()resize ونمرر له وسيطين الأول هو الصورة المراد تغيير أبعادها والثاني هو لائحة بقيمتي أبعاد الصورة الجديدة ، عرضها ومن ثم ارتفاعها ويكون المقطع البرمجي :
import cv2 as cv img = cv.imread("flower.jpg") newImg = cv.resize(img,(200,100)) cv.imshow("resized",newImg) cv.waitKey(0)
اقتصاص الصورة cropped :
نريد اقتصاص جزء من الصورة والمحافظة عليه ،نقوم بقراءة صورة والحصول على عرضها وارتفاعها و من ثم تحديد سطر البداية وسطر النهاية وعمود البداية وعمود النهاية ، يُحدد مجال الاقتطاع بالقيم السابقة كي نحصل على الجزء الذي نريده من الصورة ، ويكون الكود البرمجي :
Import cv2 as cv height, width = img.shape[0:2] startRow = int(height*.15) endRow = int(height*.85) startCol = int(width*.15) endCOl = int(width*.85) croppedImg = img[startRow:endRow,startCol:endCOl] cv.imshow("cropped Image",croppedImg) cv.waitKey(0)
وتكون نتيجة تنفيذ المقطع البرمجي السابق :
الحصول على الهيستوغرام من صورة :
يعتبر الهيستوغرام بمثابة مخطط أو رسم بياني يصف كثافة أو تكرار قيم البكسلات الموجودة في الصورة ، باستخدام التابع ()calcHist
الشكل العام لهذا التابع :
calcHist([image],channel ,mask ,[histSize],[color range])
نمرر له الصورة ، والقناة اللونية ، في مثالنا نمرر القيمة 0 التي تشير إلى أن الصورة رمادية ، وال mask نعطيه القيمة None للحصول على الهيستوغرام للصورة كاملةً ، ومن ثم حجم الهيستوغرام 256 ، و أخيرا مجال القيم اللونية من 0 حتى 255 والذي يعبر عن القيم التي تأخذها الألوان ، نقوم برسم الهيستوغرام المحسوب باستخدام التابع ()plot من مكتبة matplotlib فيكون الكود البرمجي :
Import cv2 as cv from matplotlib import pyplot as plt grayImg = cv.cvtColor(img,cv.COLOR_BGR2GRAY) hist = cv.calcHist([grayImg],[0],None,[256],[0,256]) plt.plot(hist) plt.show() cv.waitKey(0)
وتكون نتيجة تنفيذ المقطع السابق :
في هذه المقالة نكون قد أخذنا لمحة سريعة عن كيفية معالجة الصور باستخدام مكتبة opencv وتعرفنا على بعض التوابع وكيفية عملها ، يمكنك تجريب الأكواد البرمجية السابقة ، و أيضا يمكن النظر إلى documentation الخاص بالمكتبة ، والتعرف على الطرق الأخرى والميزات الكثيرة لهذه المكتبة ، ربما في مقالات لاحقة نتحدث عن مجال الرؤية الحاسوبية وتطبيقاتة بشكل خاص باستخدام هذه المكتبة .