مقدمة إلى معالجة الصور في بايثون باستخدام مكتبة opencv

معالجة الصورة أحد أفرع علوم الحاسوب و هي طريقة لأجراء بعض العمليات على صورة من أجل الحصول على نموذج محسن لهذه الصورة أو استخراج بعض المعلومات المفيدة منها .

غالباَ البيانات التي نجمعها تكون بيانات أولية أي أنها غير مناسبة للاستخدام المباشر في التطبيقات لذلك نحتاج إلى تحليل أو إجراء المعالجة المسبقة لها ومن ثم استخدامها .

على سبيل المثال : نريد بناء مجموعة بيانات نستخدمها في نموذج يصنف الصور فيما إذا تحتوي على منزل أو لا بالاعتماد على صورة كدخل لهذا البرنامج ، خطوتنا الأولى ستكون جمع المئات من صور المنازل لكن المشكلة تكمن في أن هذه الصور لن تكون بنفس الأبعاد مثلا لذلك سنحتاج إلى تغيير أبعادها أي معالجتها مسبقاً قبل تقديمها إلى النموذج .

ما سبق هو واحد من العديد من الأسباب التي تجعل من معالجة الصورة أمراً مهمّاَ لأي تطبيق يعتمد على الرؤية الحاسوبية 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  الخاص بالمكتبة ، والتعرف على الطرق الأخرى والميزات الكثيرة لهذه المكتبة ، ربما في مقالات لاحقة نتحدث عن مجال الرؤية الحاسوبية وتطبيقاتة بشكل خاص باستخدام هذه المكتبة .