برمجة

بايثون:معالجة الصور بمكتبة opencv

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

This post is also available in: English (الإنجليزية)

شارك هذا

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

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

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

ما سبق هو واحد من العديد من الأسباب التي تجعل من معالجة الصورة أمراً مهمًّا لأي تطبيق يعتمد على الرؤية الحاسوبية computer vision.

مقدمة إلى مكتبة opencv

مكتبة opencv
مكتبة opencv

مكتبة مفتوحة المصدر من تطوير شركة Intel  مبنية على لغة البرمجة c++، تعتبر هذه المكتبة الأكثر استخدامًا في معالجة الصورة والرؤية الحاسوبية.

هذه المكتبة غنية بالطرق والتوابع التي تسهل عمليات التعامل مع الصور و معالجتها حيث يمكننا قراءة الصور و إجراء العديد من العمليات عليها كتحويل الصور الملونة إلى صور رمادية gray scale، واقتصاص الصور  cropped، وتغيير أبعاد الصور  resizing، وتحليل الصور كالحصول على الهيستوغرام والكثير من العمليات الأخرى، سوف نستعرض بعضها في هذا المقال.[1]https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_tutorials.html

قراءة الصور وعرضها على الشاشة

نريد الآن قراء صورة، يتم ذلك باستخدام التابع ()imread الذي يأخذ مسار الصورة مع اسمها كوسيط ومن ثم عرضها على الشاشة باستخدام التابع ()imshow الذي يأخذ الصورة المقروءة كوسيط له فيكون الكود البرمجي:

import cv2 as cv
img = cv.imread("flower.jpg")
cv.imshow("image ", img)
cv.waitKey(0)

وتكون النتيجة:

python image proccess
python image process

عدد البكسلات و أبعاد الصورة

تستخدم الطريقتين 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 الذي يعبر عن نمط التحويل من الصورة الملونة إلى اللون الرمادي ويكون الكود البرمجي: [2]https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_imgproc/py_colorspaces/py_colorspaces.html

import cv2 as cv
img = cv.imread("flower.jpg")
grayImg = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
cv.imshow("gray Scale ", grayImg)
cv.waitKey(0)

بعد تنفيذ الكود السابق نحصل على النتيجة التالية:

gray scale
gray scale

تغيير أبعاد الصورة resizing

نستخدم التابع ()resize ونمرر له وسيطين الأول هو الصورة المراد تغيير أبعادها والثاني هو لائحة بقيمتي أبعاد الصورة الجديدة، عرضها ومن ثم ارتفاعها ويكون المقطع البرمجي: [3]https://pypi.org/project/python-resize-image/

import cv2 as cv
img = cv.imread("flower.jpg")
newImg = cv.resize(img,(200,100))
cv.imshow("resized",newImg)
cv.waitKey(0)

اقتصاص الصورة cropped

نريد اقتصاص جزء من الصورة والمحافظة عليه،نقوم بقراءة صورة والحصول على عرضها وارتفاعها و من ثم تحديد سطر البداية وسطر النهاية وعمود البداية وعمود النهاية، يُحدد مجال الاقتطاع بالقيم السابقة كي نحصل على الجزء الذي نريده من الصورة، ويكون الكود البرمجي:[4]https://pythontic.com/image-processing/pillow/crop

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)

وتكون نتيجة تنفيذ المقطع البرمجي السابق:

cropped
cropped

الحصول على الهيستوغرام من صورة

يعتبر الهيستوغرام بمثابة مخطط أو رسم بياني يصف كثافة أو تكرار قيم البكسلات الموجودة في الصورة، باستخدام التابع ()calcHist

الشكل العام لهذا التابع :

calcHist([image],channel ,mask ,[histSize],[color range])

نمرر له الصورة، والقناة اللونية، في مثالنا نمرر القيمة 0 التي تشير إلى أن الصورة رمادية، وال mask  نعطيه القيمة None للحصول على الهيستوغرام للصورة كاملةً، ومن ثم حجم الهيستوغرام 256، و أخيرًا مجال القيم اللونية من 0 حتى 255 والذي يعبر عن القيم التي تأخذها الألوان، نقوم برسم الهيستوغرام المحسوب باستخدام التابع ()plot من مكتبة matplotlib فيكون الكود البرمجي:[5]https://docs.opencv.org/master/d1/db7/tutorial_py_histogram_begins.html

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)

وتكون نتيجة تنفيذ المقطع السابق:

calcHist Python
calcHist Python

في هذه المقالة نكون قد أخذنا لمحة سريعة عن كيفية معالجة الصور باستخدام مكتبة opencv  وتعرفنا على بعض التوابع وكيفية عملها، يمكنك تجريب الأكواد البرمجية السابقة، و أيضا يمكن النظر إلى documentation  الخاص بالمكتبة، والتعرف على الطرق الأخرى والميزات الكثيرة لهذه المكتبة، ربما في مقالات لاحقة نتحدث عن مجال الرؤية الحاسوبية وتطبيقاتة بشكل خاص باستخدام هذه المكتبة.

المراجع    [ + ]
السابق
معلومات عن البرمجة التنافسية
التالي
الطبيعة ضد التنشئة : ما الفرق بينهما