مكتبة OpenCV (الجزء الخامس) : تنقية الألوان و إزالة الضبابية

696

في هذا الدرس، سنتعلم كيفية إنشاء filter لإستخراج لون محدد من الصورة وإزالة الألوان الأخري لتوضيح تلك اللون أكثر. أو يمكن إستخراج لون ليتم استبداله بلون آخر أو بجزء آخر من صورة.

يوجد أكثر من وسيلة لتطبيق ال filter علي الصور. بشكل عام، يمكن تحويل الصورة إلى ألوان HSV وهي إختصار ل Hue-Saturation-Value. هذا يساعدنا في الوصول إلي لون محدد أسهل من استخدام نظام RGB. يمكن التعرف علي نظام ال HSV من خلال موسوعة ويكيبيديا. ال hue يُستخدم لتحديد اللون، ال saturation لقوة وضوح اللون، وال value لإضاءة اللون.

import cv2

import numpy as np

cap = cv2.VideoCapture(0)

while(1):

_, frame = cap.read()

hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)



lower_red = np.array([30,150,50])

upper_red = np.array([255,255,180])



mask = cv2.inRange(hsv, lower_red, upper_red)

res = cv2.bitwise_and(frame,frame, mask= mask)

cv2.imshow('frame',frame)

cv2.imshow('mask',mask)

cv2.imshow('res',res)



k = cv2.waitKey(5) & 0xFF

if k == 27:

break

cv2.destroyAllWindows()

cap.release()

D:\Work\Jisr Labs\3.OpenCV\7\jisrlabs-opencvtut7-fig-1.png

في هذا المثال نريد الوصول إلي اللون الأحمر. الألوان التي نستهدفها في الصورة تنحصر بين 30-255، 150-255، و 50-180. هذا للون الأحمر علي الصورة الموجودة أعلي. لكن يمكنك تغييرها حتي تعمل مع الصور الخاصة بك.

في بعض الأحيان، اللون الأحمر يحمل معه درجة من الأخضر والأزرق. و في هذه الحالة فصل الأحمر عن باقي الألوان يعتبر صعب في حالة ال RGB. لكن الأمر يكون أسهل في حالة ال HSV لذلك في ال HSV يعمل بشكل أفضل في الوصول إلي الألوان.

لمعرفة نطاق الألوان في ال HSV، أفضل شيئ هي التجربة. هناك طرق في ال OpenCV لتحويل الصورة من نظام BGR إلي HSV. هذا مثال لكيفية التحويل:

dark_red = np.uint8([[[12,22,121]]])

dark_red = cv2.cvtColor(dark_red,cv2.COLOR_BGR2HSV)

الناتج هنا يعتبر لون HSV مطابق إلي اللون في نظام ال BGR لكن فقط يوجد إختلاف في القيم بين كل نظام. نظام ال BGR يعمل في بعض التطبيقات لكنه غير جيد حين إستخدامه في الوصول إلي لون محدد.

ففي البداية، علينا تحويل ال Frames إلي نظام HSV. بعد ذلك نقوم بتحديد قيم ال HSV المراد الوصول إليها. نقوم بعمل mask يستخدم جملة inRange لتحديد النطاق المرغوب. بعد ذلك نقوم بإستبدال اللون الأحمر في الصورة بتطبيق عملية bitwise. الجزء الأبيض في الصورة هي اللون الأحمر بعد تحويلة للون أبيض نقي وما غير ذلك يكون أسود. بعد ذلك نقوم بإستبدال ال pixels البيضاء بالقيم الأصلية في الصورة.

بعد ذلك سوف نقوم بإزالة ال noise باستخدام ال filters مثل استخدام ال threshold او اي filter خاص بلون محدد مثل ما قمنا به بالسابق:

D:\Work\Jisr Labs\3.OpenCV\8\jisrlabs-opencvtut8-fig-1.png

كما تري، يوجد العديد من النقاط السوداء والتي من المفروض أن تكون باللون الأحمر. يمكننا معالجة ذلك بإستخدام طرق ل smoothing و blurring. سنبدأ بهذا الكود:

import cv2

import numpy as np

cap = cv2.VideoCapture(0)

while(1):

_, frame = cap.read()

hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)



lower_red = np.array([30,150,50])

upper_red = np.array([255,255,180])



mask = cv2.inRange(hsv, lower_red, upper_red)

res = cv2.bitwise_and(frame,frame, mask= mask)

لنبدأ بتطبيق طريقة بسيطة لل smoothing بالقيام بحساب متوسط القيم لمجموعة من ال pixels. في هذا الحالة، سنستخدم مربع مساحته 15×15 أي سنعمل مع 225 pixels.

kernel = np.ones((15,15),np.float32)/225

smoothed = cv2.filter2D(res,-1,kernel)

cv2.imshow('Original',frame)

cv2.imshow('Averaging',smoothed)

k = cv2.waitKey(5) & 0xFF

if k == 27:

break

cv2.destroyAllWindows()

cap.release()

الناتج:

D:\Work\Jisr Labs\3.OpenCV\8\jisrlabs-opencvtut8-fig-2.png

الأمر بسيط لكن يوجد العديد من الأجزاء المنفصلة في الصورة. يمكننا تطبيق Gaussian blurring.

blur = cv2.GaussianBlur(res,(15,15),0)

cv2.imshow('Gaussian Blurring',blur)

الناتج:

D:\Work\Jisr Labs\3.OpenCV\8\jisrlabs-opencvtut8-fig-3.png

يمكننا أيضاً تطبيق Median filter:

median = cv2.medianBlur(res,15)

cv2.imshow('Median Blur',median)

الناتج:

D:\Work\Jisr Labs\3.OpenCV\8\jisrlabs-opencvtut8-fig-4.png

إختيار آخر وهو ال bilateral blur:

bilateral = cv2.bilateralFilter(res,15,75,75)

cv2.imshow('bilateral Blur',bilateral)

لنقارن كل ما حصلنا عليه:

D:\Work\Jisr Labs\3.OpenCV\8\jisrlabs-opencvtut8-fig-5.jpg

من خلال المقارنة، يتضح انه من الأفضل لستخدام ال median blur في تلك الصورة للحصول على النتيجة المرغوبة.

في الدرس القادم سيتم تناول موضوع ال morphological transformations.

المقال الأصلي:

https://pythonprogramming.net/color-filter-python-opencv-tutorial/?completed=/thresholding-image-analysis-python-opencv-tutorial/

https://pythonprogramming.net/blurring-smoothing-python-opencv-tutorial/?completed=/color-filter-python-opencv-tutorial/

 

 

 

تعليقات