پردازش تصویر در OpenCV
تغییر فضاهای رنگی (Changing Colorspaces)
هدف#
- در این آموزش، یاد خواهید گرفت چگونه تصاویر را از یک فضای رنگی به فضای دیگر تبدیل کنید، مانند BGR Gray و BGR HSV و غیره.
- علاوه بر این، یک برنامه برای استخراج یک شیء رنگی در ویدیو خواهیم ساخت.
- توابع زیر را خواهید آموخت: cv.cvtColor()، cv.inRange() و غیره.
تغییر فضای رنگی (Changing Color-space)#
بیش از ۱۵۰ روش تبدیل فضای رنگی در OpenCV وجود دارد. اما ما تنها به دو مورد که بیشترین استفاده را دارند میپردازیم: BGR Gray و BGR HSV.
برای تبدیل رنگ، از تابع cv.cvtColor(input_image, flag) استفاده میکنیم که flag نوع تبدیل را مشخص میکند.
برای تبدیل BGR Gray، از فلگ cv.COLOR_BGR2GRAY استفاده میکنیم. به طور مشابه برای BGR HSV، از فلگ cv.COLOR_BGR2HSV استفاده میکنیم. برای دریافت سایر فلگها، کافی است دستورات زیر را در ترمینال Python خود اجرا کنید:
>>> import cv2 as cv
>>> flags = [i for i in dir(cv) if i.startswith('COLOR_')]
>>> print( flags )
ردیابی شیء (Object Tracking)#
حال که میدانیم چگونه تصویر BGR را به HSV تبدیل کنیم، میتوانیم از این برای استخراج یک شیء رنگی استفاده کنیم. در HSV، نمایش یک رنگ نسبت به فضای رنگی BGR آسانتر است. در برنامه ما، سعی میکنیم یک شیء آبی رنگ را استخراج کنیم. روش کار به این صورت است:
- هر فریم از ویدیو را بگیریم.
- از فضای رنگی BGR به HSV تبدیل کنیم.
- تصویر HSV را برای محدودهای از رنگ آبی آستانهگذاری کنیم.
- حال شیء آبی را به تنهایی استخراج کنیم و میتوانیم هر کاری که بخواهیم روی آن تصویر انجام دهیم.
کد زیر با توضیحات کامل آمده است:
import cv2 as cv
import numpy as np
cap = cv.VideoCapture(0)
while(1):
# Take each frame
_, frame = cap.read()
# Convert BGR to HSV
hsv = cv.cvtColor(frame, cv.COLOR_BGR2HSV)
# define range of blue color in HSV
lower_blue = np.array([110,50,50])
upper_blue = np.array([130,255,255])
# Threshold the HSV image to get only blue colors
mask = cv.inRange(hsv, lower_blue, upper_blue)
# Bitwise-AND mask and original image
res = cv.bitwise_and(frame,frame, mask= mask)
cv.imshow('frame',frame)
cv.imshow('mask',mask)
cv.imshow('res',res)
k = cv.waitKey(5) & 0xFF
if k == 27:
break
cv.destroyAllWindows()
تصویر زیر ردیابی شیء آبی را نشان میدهد:

چگونه مقادیر HSV را برای ردیابی پیدا کنیم؟#
این یک سؤال رایج در stackoverflow.com است. بسیار ساده است و میتوانید از همان تابع cv.cvtColor() استفاده کنید. به جای ارسال یک تصویر، فقط مقادیر BGR مورد نظر را ارسال کنید. برای مثال، برای پیدا کردن مقدار HSV رنگ سبز، دستورات زیر را در ترمینال Python امتحان کنید:
>>> green = np.uint8([[[0,255,0 ]]])
>>> hsv_green = cv.cvtColor(green,cv.COLOR_BGR2HSV)
>>> print( hsv_green )
[[[ 60 255 255]]]
حال مقادیر [H-10, 100, 100] و [H+10, 255, 255] را به ترتیب به عنوان کران پایین و کران بالا در نظر بگیرید. علاوه بر این روش، میتوانید از هر ابزار ویرایش تصویر مانند GIMP یا هر مبدل آنلاینی برای پیدا کردن این مقادیر استفاده کنید، اما فراموش نکنید محدودههای HSV را تنظیم کنید.
تمرینها#
- سعی کنید راهی برای استخراج بیش از یک شیء رنگی پیدا کنید، به عنوان مثال، اشیاء قرمز، آبی و سبز را همزمان استخراج کنید.