image -processing-python-opencv

تغییر فضاهای رنگ- opencv

۱- تغییر فضاهای رنگ- opencv
۲- HSV
۲-۱ Hue
۲-۳ Value
۲-۴ Saturation or intensity
۲-۵ HSV چه کاربردی دارد؟
۲-۵ استخراج سه شی رنگی از تصویر
۲-۵ برای پیدا کردن مقادیر HSV چکار باید کرد؟
۳- Grayscale


تغییر فضاهای رنگ

 

در این آموزش،  نحوه ی  تبدیل تصاویر از یک فضای رنگی به دیگری را  یاد خواهیم گرفت. مانند: BGR \leftrightarrowGray, BGR \leftrightarrow HSV. علاوه بر این، یک برنامه ایجاد می کنیم که ۳ شیء رنگی را از یک تصویر استخراج کند، و در ادامه به تصاویر خاکستری می پردازیم. در OpenCV، بیش از ۱۵۰ روش تبدیل فضای رنگ وجود دارد. اما تنها دو مورد که بیشتر مورد استفاده قرار می گیرند، به BGR ↔ Gray و BGR ↔ HSV را توضیح می دهیم .


برای تبدیل رنگ، از تابع (cv2.cvtColor (input_image، flag استفاده می کنیم که در آن پرچم، نوع تبدیل را تعیین می کند.

برای تبدیل  BGR →Gray،   از پرچم cv2.COLOR_BGR2GRAY و برای BGR → HSV، از پرچم cv2.COLOR_BGR2HSV استفاده می کنیم. .
برای دریافت پرچم های دیگر، فقط دستورات زیر را در ترمینال پایتون خود اجرا کنید:

import cv2
flags = [i for i in dir(cv2) if i.startswith('COLOR_')]
print flags

 (HSV)

یک فضای رنگی مناسب، مدل رنگی HSV است. همانطور که گفتم قراره اشیاء داخل یک تصویر را  از آن جدا کنیم. تشخیص یا استخراج اشیاء در خیلی جاها از جمله کنترل وسایل نقلیه و  ترافیک کاربرد دارد. در واقع در این مدل، دو ویژگی روشنایی و شدت نور، کمک زیادی می کند. این مدل، دارای سه ویژگی متمایز است:

Hue


نام رنگ (زرد، سبز، صورتی و..) . 

Value

 

روشنایی یا تیرگی رنگ (خاکستری)



Saturation or intensity

 اشباع یا شدت نور  : خلوص رنگ، روشنایی یا تاریکی ( طیف رنگی قرمز).

 

نکته

در فضای رنگ HSV، محدوده رنگ [۰،۱۷۹]، محدوده اشباع [۰،۲۵۵] و محدوده مقدار [۰،۲۵۵] است. نرم افزار های مختلف از مقیاس های مختلف استفاده می کنند. بنابراین اگر مقادیر OpenCV را با آنها مقایسه کنید، باید این محدوده ها را نرمال کنید.

مدل رنگ HSV چه کاربردی دارد؟

 مثلا اگر  بخواهیم  قطعاتی از یک تصویر که در محدوده رنگ آبی یا  قرمز یا سبز  قرار دارند را شناسایی کنیم از این مدل استفاده می کنیم.

در HSV، رنگ آمیزی ساده تر از BGR رنگی است. 

 

 

hsv

 

hsv
hsv
hsv

HSV

 

استخراج سه شی رنگی از تصویر

رسیدیم به برنامه ای که در ابتدای این بخش به آن اشاره کردیم. در واقع قراره یک جوررایی اشیا را ردیابی کنیم.  الگوریتم، به صورت زیر است:

  1. برنامه،  تصویر را بگیرد
  2. تبدیل از فضای رنگ BGR به HSV انجام دهد.

 

ما تصویر HSV را برای طیف وسیعی از رنگ آبی وقرمز و سبز، آستانه گذاری(در جلسات بعدی آموزش داده می شود.) می کنیم:

در حال حاضر تنها ۳ شیء آبی و سبز و قرمز را استخراج می کنیم، می توانیم هر آنچه را که می خواهیم انجام دهیم.
کد:

 

import cv2
import numpy as np
img = cv2.imread('bgrtohsv.png')
#تبدیل فضای رنگ bgr to hsv
hsv = cv2.cvtColor(img,cv2.COLOR_BGR2HSV )

lower_blue = np.array([110,50,50])
upper_blue = np.array([120,255,255])

lower_green = np.array([50,50,50])
upper_green = np.array([60,255,255])

lower_red = np.array([0,50,50])
upper_red = np.array([0,255,255])
#آستانه گیری(cv2.inRange())
maskb = cv2.inRange(hsv, lower_blue, upper_blue)
maskg = cv2.inRange(hsv, lower_green, upper_green)
maskr = cv2.inRange(hsv, lower_red, upper_red)
# and تصویر اصلی با ماسک
#میشود (cv2.bitwise_and())
resb = cv2.bitwise_and(img,img, mask= maskb)
resg = cv2.bitwise_and(img,img, mask= maskg)
resr = cv2.bitwise_and(img,img, mask= maskr)

cv2.imshow('original image',img)
cv2.imshow('maskb',maskb)
cv2.imshow('maskg',maskg)
cv2.imshow('maskr',maskr)

cv2.imshow('resb',resb)
cv2.imshow('resg',resg)
cv2.imshow('resr',resr)

cv2.waitKey()
cv2.destroyAllWindows()

rgb-hsv

استخراج سه شی رنگی از تصویر

 

نکته

 نویز کمی در تصویر وجود دارد. خواهید دید که چگونه آنها را در قسمت های  بعد حذف می کنیم. این ساده ترین روش در ردیابی شی است.

 

برای پیدا کردن مقادیر HSV چکار باید کرد؟

بسیار ساده است و شما می توانید از همان تابع ()cv2.cvtColor  استفاده کنید.

برای مثال، برای پیدا کردن مقدار HSV سبز، دستورات زیر را در ترمینال پایتون امتحان کنید:

green = np.uint8([[[0,255,0 ]]])
hsv_green = cv2.cvtColor(green,cv2.COLOR_BGR2HSV)
print hsv_green
[[[ ۶۰ ۲۵۵ ۲۵۵]]]

اکنون شما می توانید [H-10، ۱۰۰،۱۰۰] و [H + 10، ۲۵۵، ۲۵۵] را به ترتیب پایین تر و بالاتر محدوده رنگ  قرار دهید.

به غیر از این روش، می توانید از هر ابزار ویرایش عکس مانند GIMP یا هر مبدل آنلاین برای پیدا کردن این ارزش ها استفاده کنید.

اما فراموش نکنید که محدوده های HSV را تنظیم کنید.

 

تصاویر Grayscale(خاکستری)

دوربین های قدیمی فقط  قادر به نمایش تصاویر مونوکروم  یا تک رنگ  بودند. درکل سنسور دوربین تنها شدت نور را ثبت میکند که شدت نور طیفی خاکستری ایجاد میکند.

ما با تصاویر خاکستری که نوعی از تصاویر مونوکروم هستند،  کار خواهیم کرد.

Grayscale

http://hamamatsu.magnet.fsu.edu

تصاویر خاکستری فقط دارای یک کانال رنگی(۸بیتی) در مقیاس ۰ تا ۲۵۵ هستند که نشان دهنده روشنایی آن پیکسل است، ۰ کاملا تاریک (سیاه) و ۲۵۵ کاملا روشن (سفید) است.

Grayscale

Grayscale

 

وقتی فیلتر های رنگی بر روی سنسور دوربین قرار میگیرد به ازای هر رنگ قرمز ، ابی  یا سبز ،  یک شدت  نور جدا (خاکستری) درست  می کنند که با ترکیب آنها با هم عکس های رنگی ایجاد می شوند.

تصویر زیر مثال خیلی خوبی  از کانال های مختلف تصویر رنگی است، که با یکی از نرم افزار های ویرایش عکس که من از gimp استفاده کردم را ببینید.  در واقع با ترکیب کانال های سمت راست، تصویر رنگی سمت چپ ایجاد می شود:

مثلا به رنگ سبز دقت کنید، فقط قسمتی که رنگ سبز داریم سفید وبقیه قسمت ها سیاه است. کانال سبز  یک کانال ۸ بیتی که به صورت   [0,255,0]:rgb مقدار دهی می شود و نشان دهنده ی این است که هر چه شدت نور به سمت ۲۵۵ باشد رنگ سبز بیشتر و هر چه به سمت ۰ باشد رنگ سبز کمتری داریم و در مورد کانال های دیگر هم همین استدلال را میشه کرد.

Grayscale

Grayscale

تبدیل تصویر به مقیاس خاکستری به ما یک  آرایه  دو بعدی و تنها یک کانال که ۸ بیت باشد  میدهد. یک جورایی پردازش راحتر و سریع تر و زوم روی یک کانال خاص است.

import numpy as np
import cv2
import matplotlib.pyplot as pltimg = cv2.imread('test.jpg')
gray_img = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
#تصویر خاکستری به عنوان آراه ای دوبعدیprint(gray_img)
[[۲۵۰ ۲۵۰ ۲۵۰ ..., ۲۵۰ ۲۵۰ ۲۵۰]
[۲۵۰ ۲۵۰ ۲۵۰ ..., ۲۵۰ ۲۵۰ ۲۵۰]
[۲۵۰ ۲۵۰ ۲۵۰ ..., ۲۵۰ ۲۵۰ ۲۵۰]
...,
[۲۵۰ ۲۵۰ ۲۵۰ ..., ۲۵۰ ۲۵۰ ۲۵۰]
[۲۵۰ ۲۵۰ ۲۵۰ ..., ۲۵۰ ۲۵۰ ۲۵۰]
[۲۵۰ ۲۵۰ ۲۵۰ ..., ۲۵۰ ۲۵۰ ۲۵۰]]
print (gray_img.shape)</span>
(۶۴۰, ۶۴۰)
print (img.dtype)
uint8

و در نهایت تبدیل به تصویر خاکستری:

import numpy as np
import cv2
import matplotlib.pyplot as plt
img = cv2.imread('test.jpg')
gray_img = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
plt.imshow(cv2.cvtColor(gray_img, cv2.COLOR_GRAY2RGB))
plt.show()
grayscale

تبدیل به تصویر خاکستری

 



۱-پردازش تصویر با پایتون-OpenCV
۲-آموزش نصب pip در پایتون
۳-
کتابخانه های مورد نیاز پردازش تصویر
۴ – خواندن و نمایش فرمت تصویر در پایتون
۵- نمایش تصویرRGB با Matplotlib و تابع تبدیل ()cvtColor در OpenCv

۶-تغییر فضاهای رنگ- opencv
۷-تقسیم و ادغام کانال های تصویری با opencv