پردازش تصویر با پایتون قسمت یازدهم

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

هدف

در این آموزش،  نحوه تبدیل تصاویر از یک فضای رنگی به دیگری را  یاد خواهیم گرفت، مانند: BGR \leftrightarrowGray, BGR \leftrightarrow HSV  ، 
علاوه بر این، یک برنامه ایجاد می کنیم که ۳ شیء رنگی را از یک تصویر استخراج کند، و با توابع زیر آشنا خواهید شد:
()cv2.cvtColor () ، cv2.inRange  .

 

در 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

 

hsv2

hsv3hsv4
  بنابراین در اینجا روش به شکل زیر است:

برنامه،  تصویر را بگیرد
تبدیل از فضای رنگ 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()
 

rgbtohsv

 

نکته

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

 

برای پیدا کردن مقادیر 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 را تنظیم کنید.

پردازش تصویر با پایتون قسمت دهم

 

هدف

عملیات اساسی و پایه بر روی تصاویر

دسترسی به مقادیر پیکسل و تغییر آنها

دسترسی به مشخصات تصویر
تنظیم قسمت موردنظر در تصویر ((ROI)Region of Interes)

تقسیم و ادغام تصاویر
تقریبا تمام عملیات در این بخش به طور عمده به Numpy بیشتر از  OpenCV مربوط می شود. دانش خوبی از Numpy برای نوشتن کد بهینه سازی بهتر با OpenCV لازم است.

* (نمونه ها در ترمینال پایتون نشان داده می شوند، زیرا اکثر آنها فقط کدهای خطی هستند)

 

دسترسی و تغییر مقادیر پیکسل – opencv

[gap height=”19″]

[gap height=”19″]
اجازه دهید یک تصویر رنگی را بار اول بگذاریم:

 

>>> import cv2
>>>import numpy as np
>>>img = cv2.imread('img2.png')
>>>

شما می توانید از طریق مختصات ردیف و  ستون به یک مقدار پیکسل دسترسی پیدا کنید. برای تصویر BGR، آرایه ای از مقادیر آبی، سبز، قرمز را باز می گرداند. برای تصویر خاکستری ، فقط شدت  نور  متناظر بازگشته است.

px = img[100,100]
 >>> print (px)
 [۲۴۷ ۲۵۳ ۲۳۴]
>>> blue = img[100,100,0]
 >>> print (blue)
 ۲۴۷
 >>> green = img[100,100,1]
 >>> print(green)
 ۲۵۳
>>> red = img[100,100,2]
 >>> print(red)
 ۲۳۴
 >>>

شما می توانید مقادیر پیکسل را به همین شیوه تغییر دهید. به عنوان مثال :


>>> img[20,20] = [0,0,0]
 >>> print (img[20,20])
 [۰ ۰ ۰]
 >>>
point

تغییر مقدار پیکسل

 

هشدار

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

نکته

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

برای دسترسی به پیکسل های تکی، متدهای  آرایهNumpy ،  () و array.itemset () array.item   بهتر است در نظر گرفته شود. اما همیشه یک اسکالر را برمیگرداند. بنابراین اگر میخواهید به تمام مقادیر B، G، R  دسترسی داشته باشید، باید با استفاده از array.item () به طور جداگانه برای همه صدا بزنید.

روش دسترسی و ویرایش بهتر پیکسل:

>>> img.item(20,20,2)
 ۰
>>> img.item(10,10,2)
 ۲۳۵
 >>> img.itemset((20,20,2),100)
 >>> img.item(20,20,2)
 ۱۰۰
 >>>

دسترسی به ویژگی های تصویر(img.shape)

خواص تصویر شامل تعداد ردیف ها، ستون ها و کانال ها، نوع داده های تصویر، تعداد پیکسل ها و غیره

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

>>> print (img.shape)
 (۶۴۰, ۶۴۰, ۳)
>>>

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

تعداد کل پیکسل ها توسط img.size قابل دسترسی است:

>>> print (img.size)
 ۱۲۲۸۸۰۰
 >>>

نوع داده تصویر توسط img.dtype بدست می آید:

>>> print (img.dtype)
 uint8
 >>>

نکته

توجه داشته باشید img.dtype بسیار مهم است در اشکال زدایی، زیرا تعداد زیادی از خطا در کد OpenCV-Python ناشی از نوع داده معتبر است.

 

Image ROI

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

در اینجا من با انتخاب الله در تصویر و کپی کردن،  آن را به یک منطقه دیگر در تصویر منتقل کردم:

import cv2
import numpy as np
img = cv2.imread('img2.PNG')
allah = img[105:190,435:521]
img[79:164,1:87] = allah
img[544:623,115:194] = [0,255,0]
img[544:623,17:96] = [255,0,0]
img[544:623,212:290] = [0,0,255]
cv2.namedWindow('My Image', cv2.WINDOW_NORMAL)
cv2.imshow('My Image',img)
cv2.waitKey(0)
roi

 

تقسیم و ادغام کانال های تصویری  با opencv

گاهی اوقات شما باید جداگانه در کانال های B، G، R کار کنید. سپس شما نیاز دارید برای تقسیم تصاویر BGR به یک تک کاناله:


b,g,r = cv2.split(img)
blue =cv2.split(img)[0]
green=cv2.split(img)[1]
red = cv2.split(img)[2]

import cv2
import numpy
import matplotlib.pyplot
image = cv2.imread("img2.png",1)
print(image.shape)
b,g,r = cv2.split(image) # the order is not r,g,b
cv2.namedWindow("Image", cv2.WINDOW_NORMAL)
cv2.imshow("Image",image)
cv2.namedWindow("ImageR", cv2.WINDOW_NORMAL)
cv2.imshow("ImageR",r)
cv2.namedWindow("ImageG", cv2.WINDOW_NORMAL)
cv2.imshow("ImageG",g)
cv2.namedWindow("ImageB", cv2.WINDOW_NORMAL)
cv2.imshow("ImageB",b)
cv2.waitKey(0)
cv2.destroyAllWindows()

rgb7

یا بعضی وقتها، ممکن است نیاز به پیوستن این کانال های فردی و تبدیل آن به  تصویر BGR باشید:

 

img = cv2.merge((b,g,r))

یا

b = img[:,:,0]

فرض کنید شما می خواهید تمام پیکسل های قرمز را صفر کنید
شما نیازی به تقسیم کردن این کار ندارید و آن را برابر صفر قرار دهید. شما می توانید به راحتی از Indexing Numpy استفاده کنید و سریع تر است.

img[:,:,2] = 0

 

شما می توانید تبدیل رنگ قرمز به سیاه را  به سادگی انجام دهید:

 

>>> import cv2
import numpy as np
img = cv2.imread('img2.PNG')
b,g,r = cv2.split(img)
img = cv2.merge((b,g,r))
b = img[:,:,0]
img[:,:,2] = 0
cv2.namedWindow('My Image', cv2.WINDOW_NORMAL)
cv2.imshow('My Image',img)
cv2.waitKey(0)
b

 

 

هشدار

cv2.split () یک است  عملیات پر هزینه  (از لحاظ زمان) پس فقط اگر شما به آن نیاز دارید. در غیر اینصورت برای شاخص کردن Numpy بروید

 

ساخت مرز و حاشیه برای تصاویر

 

اگر می خواهید حاشیه ای در اطراف تصویر ایجاد کنید، چیزی شبیه یک قاب عکس، شما می توانید از تابع ()cv2.copyMakeBorder  استفاده کنید. اما این تابع کاربردهای بیشتری برای عملیات کانولوشن، صفر کردن و غیره دارد. این تابع با استفاده از آرگومانهای های زیر عمل می کند:
src – تصویر ورودی

top, bottom, left, right:  تعداد پیکسل ها در جهت های مربوطه

borderType: – پرچم  برای تعریف اینکه چه نوع حاشیه ای اضافه می شود. می تواند انواع زیر باشد:

cv2.BORDER_CONSTANT : حاشیه رنگ ثابت را اضافه می کند. ارزش باید به عنوان آرگومان بعدی داده شود.

cv2.BORDER_REFLECT : مرز بازتابی از عناصر مرزی است، مثل این: fedcba | abcdefgh | hgfedcb

cv2.BORDER_REFLECT_101 یا cv2.BORDER_DEFAULT – همانند بالا، اما با تغییر جزئی، مانند این است: gfedcb | abcdefgh | gfedcbacv2.BORDER_REPLICATE

cv2.BORDER_REPLICATE – آخرین عنصر در سراسر تکرار شده است، مانند این: aaaaaa | abcdefgh | hhhhhhh

cv2.BORDER_WRAP – نمی توان توضیح داد، به نظر می رسد: cdefgh | abcdefgh | abcdefg
value – رنگ مرزی اگر نوع مرزی cv2.BORDER_CONSTANT باشد
در زیر یک کد نمونه برای نشان دادن تمام این انواع مرز برای درک بهتر است:

قطعه کد زیر از  from matplotlib import pyplot as plt  برای نمایش استفاده کرده است.

 



import cv2
import numpy as np
from matplotlib import pyplot as plt
yellow = [255,255,0]
img1 = cv2.imread('openCV (1).png')
img2 = cv2.cvtColor(img1, cv2.COLOR_BGR2RGB)
replicate = cv2.copyMakeBorder(img2,10,10,10,10,cv2.BORDER_REPLICATE)
reflect = cv2.copyMakeBorder(img2,10,10,10,10,cv2.BORDER_REFLECT)
reflect101 = cv2.copyMakeBorder(img2,10,10,10,10,cv2.BORDER_REFLECT_101)
wrap = cv2.copyMakeBorder(img2,10,10,10,10,cv2.BORDER_WRAP)
constant= cv2.copyMakeBorder(img2,10,10,10,10,cv2.BORDER_CONSTANT,value=yellow)
plt.subplot(231),plt.imshow(img2,'gray'),plt.title('ORIGINAL')
plt.subplot(232),plt.imshow(replicate,'gray'),plt.title('REPLICATE')
plt.subplot(233),plt.imshow(reflect,'gray'),plt.title('REFLECT')
plt.subplot(234),plt.imshow(reflect101,'gray'),plt.title('REFLECT_101')
plt.subplot(235),plt.imshow(wrap,'gray'),plt.title('WRAP')
plt.subplot(236),plt.imshow(constant,'gray'),plt.title('CONSTANT')
plt.show()

copyMakeBorder

در قطعه کد زیر از opencv برای نمایش استفاده شده است:

 

import cv2
import numpy
image = cv2.imread("openCV.png")
BLUE = [255,0,0]
replicate = cv2.copyMakeBorder(image,10,10,10,10,cv2.BORDER_REPLICATE)
reflect = cv2.copyMakeBorder(image,10,10,10,10,cv2.BORDER_REFLECT)
reflect101 = cv2.copyMakeBorder(image,10,10,10,10,cv2.BORDER_REFLECT_101)
wrap = cv2.copyMakeBorder(image,10,10,10,10,cv2.BORDER_WRAP)
constant= cv2.copyMakeBorder(image,10,10,10,10,cv2.BORDER_CONSTANT,value=BLUE)
#cv2.imshow("image",replicate)
#cv2.imshow("image",reflect)
cv2.namedWindow('My Image', cv2.WINDOW_NORMAL)
cv2.imshow("My Image",reflect101)
#cv2.imshow("image",wrap)
#cv2.imshow("image",constant)
#cv2.imshow("image",image)
cv2.waitKey(0)

 

در قطعه کد زیر نوشتن یک متن، رسم چند ضلعی، دایره ، مستطیل و یک خط نمایش داده شده است:

import numpy as np
import cv2
img = cv2.imread('carr.jpg',cv2.IMREAD_COLOR)
print(img.shape)
cv2.line(img,(0,0),(100,100),(255,255,255),5)
cv2.rectangle(img,(0,100),(100,200),(0,0,0),5)
cv2.circle(img,(63,250), 63, (0,255,0), -1)
pts = np.array([[10,100],[40,50],[50,10],[30,10]], np.int32)
pts = pts.reshape((-1,1,2))
cv2.polylines(img, [pts], True, (255,100,0), 3)
font = cv2.FONT_HERSHEY_SIMPLEX
# def putText(img, text, org, fontFace, fontScale, color, thickness=None, lineType=None, bottomLeftOrigin=None):
cv2.putText(img,"I Iove Lamborghini!",(200,40), 0, 0.8, (255,100,0), 3, cv2.LINE_AA) cv2.imshow('image',img) cv2.waitKey(0) cv2.destroyAllWindows() car-red

 

در این قطعه کد: تعداد کانال نوع تصویر با استفاده از if( در تصاویر رنگی img.shape  دارای ۳ مقدار طول، عرض و تعداد کانال میباشد ولی در خاکستری دیگر تعداد کانال را مشخص نمیکند و ۲ مقدار دارد
)  تصویر خاکستری را از رنگی تشخیص میدهد. شما میتوانید با استفاده از تصویر خاکستری نتیجه دیگر بگیرید:

import numpy as np
import cv2
image = cv2.imread('carr.jpg',cv2.IMREAD_COLOR)
print(image.shape)
print(image.shape[2])
if image.shape[2] == 2:
print("Gray Image")
elif image.shape[2] == 3:
print("RGB Image")
print(image.size)
print(image.dtype)

۳
RGB Image
۶۵۸۳۵۹
uint8

 

 

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

 

تبدیلات (Transformations)

OpenCV دو تابع تبدیل، cv2.warpAffine و cv2.warpPerspective را فراهم می کند که  شما می توانید تمام انواع تبدیلات را داشته باشید. Cv2.warpAffine یک ماتریس تبدیل ۲×۳ را در حالی که cv2.warpPerspective یک ماتریس تبدیل ۳×۳ را به عنوان ورودی می گیرد.

Scaling

 

Scaling  فقط تغییر اندازه تصویر است ،OpenCV ، تابع ()cv2.resize  برای این منظور عرضه می کند.اندازه تصویر را می توان بصورت دستی مشخص کرد، یا می توانید فاکتور مقیاس را مشخص کنید.  روش های مختلفی استفاده می شود.

روش های مختلفی استفاده می شود. روش پیشنهادی cv2.INTER_AREA برای کاهش و (cv2.INTER_CUBIC (slow و cv2.INTER_LINEAR برای بزرگنمایی است. به طور پیش فرض، تابع cv2.INTER_LINEAR برای همه اهداف تغییر اندازه است.

در  کد زیر سایز تصویر را ۲ برابر کردیم:

 

import cv2
import numpy
import matplotlib.pyplot
image = cv2.imread("car.jpg")
print(image.shape)
# def resize(src, dsize, dst=None, fx=None, fy=None, interpolation=None): # real signature unknown; restored from __doc__
#res = cv2.resize(image,None,fx=2, fy=2, interpolation = cv2.INTER_CUBIC)
# or
height, width = image.shape[:2]
res = cv2.resize(image,(2*width,2*height), interpolation = cv2.INTER_CUBIC)
cv2.imshow("image",res)
cv2.waitKey(0)
cv2.destroyAllWindows()

 

Translation 

Translation جابجایی شی از یک مکان به مکان دیگر. اگر می دانید تغییر جهت (x، y)، با اجازه  آن را (tx، ty) قرار می هیم، شما می توانید ماتریس تبدیل M به شرح زیر ایجاد کنید:

 

M = \begin{bmatrix} 1 & 0 & t_x \\ 0 & 1 & t_y  \end{bmatrix}

می توانید آن را به یک آرایه Numpy از نوع np.float32  تبدیل و بعد آن را به تابع ()cv2.warpAffine  منتقل کنید. مثال زیر را برای شیفت به مکان (۱۰۰،۵۰) زیر را ببینید:

 

import cv2
import numpy
import matplotlib.pyplot
image = cv2.imread("car.jpg")
print(image.shape)
rows,cols = image.shape[:2]
M = numpy.float32([[1,0,100],[0,1,50]])
dst = cv2.warpAffine(image,M,(cols,rows))
cv2.namedWindow('image', cv2.WINDOW_NORMAL)
cv2.imshow("image",dst)
cv2.waitKey(0)
cv2.destroyAllWindows()

car2

 

هشدار

آرگومان سوم تابع ()cv2.warpAffin  اندازه تصویر خروجی است که باید در فرم (عرض، ارتفاع) باشد.
به یاد داشته باشید عرض = تعداد ستون ها، و ارتفاع = تعداد ردیف.

 width = number of columns, and height = number of rows.

Rotation

چرخش یک تصویر برای زاویه تتا به دست می آید توسط ماتریس M تبدیل فرم.

M = \begin{bmatrix} cos\theta & -sin\theta \\ sin\theta & cos\theta   \end{bmatrix}

اما OpenCV چرخش مقیاس پذیر با مرکز قابل تنظیم چرخش را فراهم می کند به طوری که شما می توانید در هر مکانی که ترجیح می دهید چرخش دهید.
ماتریس تبدیل اصلاح شده است:

\begin{bmatrix} \alpha &  \beta & (1- \alpha )  \cdot center.x -  \beta \cdot center.y \\ - \beta &  \alpha &  \beta \cdot center.x + (1- \alpha )  \cdot center.y \end{bmatrix}

 

\begin{array}{l} \alpha =  scale \cdot \cos \theta , \\ \beta =  scale \cdot \sin \theta \end{array}

 

برای پیدا کردن این ماتریس تبدیل، OpenCV تابع cv2.getRotationMatrix2Dرا فراهم می کند، .

 مثال زیر را بررسی کنید که تصویر را به اندازه  ۹۰ درجه میچرخاند:

 

import cv2
import numpy
import matplotlib.pyplot
image = cv2.imread("car.jpg")
print(image.shape)
rows,cols = image.shape[:2]
#or
# rows,cols,_ = image.shape
#or
#rows,cols,ch=image.shape
M = cv2.getRotationMatrix2D((cols/2,rows/2),90,1)
dst = cv2.warpAffine(image,M,(cols,rows))
cv2.namedWindow('image', cv2.WINDOW_NORMAL)
cv2.imshow("image",dst)
cv2.waitKey(0)
cv2.destroyAllWindows()



car3

 

Affine Transformation


در تبدیل شکل ، تمام خطوط موازی در تصویر اصلی هنوز در تصویر خروجی موازی هستند.

برای پیدا کردن ماتریس تبدیل، ما نیاز به سه نقطه از تصویر ورودی و نقاط  متناظر خود را در تصویر خروجی داریم. سپس cv2.getAffineTransform یک ماتریس ۲×۳ ایجاد می شود که به cv2.warpAffine منتقل می شود.

 

import cv2
import numpy
import matplotlib.pyplot
image = cv2.imread("carr.jpg")
print(image.shape)
rows,cols = image.shape[:2]
pts1 = numpy.float32([[50,50],[200,50],[50,200]])
pts2 = numpy.float32([[10,100],[200,50],[100,250]])
M = cv2.getAffineTransform(pts1,pts2)
dst = cv2.warpAffine(image,M,(cols,rows))
cv2.namedWindow('image', cv2.WINDOW_NORMAL)
cv2.imshow("image",dst)
cv2.waitKey(0)
cv2.destroyAllWindows()


car5

Perspective Transformation

برای Perspective Transformation، شما نیاز به یک ماتریس تبدیل ۳×۳ دارید. خطوط راست هم حتی پس از تغییر نیز باقی خواهند ماند.برای پیدا کردن این ماتریس تبدیل، شما نیاز به ۴ نقطه در تصویر ورودی و نقاط متناظر در تصویر خروجی دارید. ماتریس تبدیل را می توان با عملکرد cv2.getPerspectiveTransform پیدا کرد. سپس cv2.warpPerspective را با این ماتریس تبدیل ۳×۳ اعمال کنید.

کد زیر را ببینید:


import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread("sudoku-original.jpg")
rows,cols,ch = img.shape
rows,cols,ch = img.shape
pts1 = np.float32([[56,65],[368,52],[28,387],[389,390]])
pts2 = np.float32([[0,0],[300,0],[0,300],[300,300]])
M = cv2.getPerspectiveTransform(pts1,pts2)
dst = cv2.warpPerspective(img,M,(300,300))
plt.subplot(121),plt.imshow(img),plt.title('Input')
plt.subplot(122),plt.imshow(dst),plt.title('Output')
plt.show()

Transformation

پردازش تصویر با پایتون قسمت نهم

.

نمایش تصویرRGB با Matplotlib

[gap height=”19″]

[gap height=”19″]

ما می دانیم که matplotlib ، کتابخانه پایتون برای کار با نمودارها و ارقام است. اما اگر می خواستیم یک تصویر ساده RGB را نمایش دهیم چه؟ آیا می توانیم با matplotlib انجام دهیم؟

در این قسمت مابه شما نشان می دهیم که چگونه یک تصویرRGB   را با matplotlib فقط در چند خط کد  میشه نشان داد و هرگونه ابهاماتی را که هنگام استفاده از OpenCV و matplotlib وقتی با هم اجرا میشوند، مواجه می شوید روشن کنید.

یک تصویر RGB، که گاهی اوقات به عنوان یک تصویر رنگی واقعی نامیده می شود، به صورت یک آرایه سه بعدی  داده m × n × ۳ ذخیره می شود که کانالهای قرمز، سبز و آبی رنگ را برای هر پیکسل تعریف می کند. رنگ هر پیکسل با ترکیبی از فرمت های فایل های گرافیکی تصاویر RGB، به عنوان تصاویر ۲۴(۸*۳) بیتی ذخیره می شود، حال آنکه هر کدام از کانالهای قرمز، سبز و آبی ۸ بیت هستند.

در این قسمت میخواهیم یک تصویر را با OpenCV می خوانیم وبا   matplotlibنمایش میدهیم.

[gap height=”19″]

تصویر اصلی

تصویراصلی

[gap height=”19″]

کد زیر فقط از opencv برای خواندن و نمایش تصویر استفاده  کرده است.

[gap height=”19″]

import numpy as np
import cv2
img = cv2.imread('test.png')
cv2.imshow('opencv',img)
cv2.waitKey (0)
cv2.destroyAllWindows ()

[gap height=”19″]

خروجی:

11

نمایش تصویر با استفاده از opencv

[gap height=”19″]

در کد زیر هم فقط از matplotlib برای خواندن و نمایش تصویر  استفاده شده است.

 [gap height=”19″]

import matplotlib.pyplot as plt
import matplotlib.image as mpimg
image = mpimg.imread("img2.png")
plt.imshow(image)
plt.show()

[gap height=”19″]

اولین کاری که ما انجام می دهیم این است که کتابخانه matplotlib را وارد کنیم.

ولی ما فقط از یک قسمتی از این کتابخانه مربوط به خواندن تصویر است به عنوان mpimg  ، که جایگزین  matplotlib.image،  همچنین از plt که جایگزین matplotlib.pyplot است  برای نمایش استفاده کردیم.

ما می توانیم تصویر زیر را ببینیم:

[gap height=”19″]

12

نمایش تصویر با استفاده از matplotlib با محور دور تصویر

[gap height=”19″]

در مورد خلاص شدن از محور  و اعداد از کد زیر استفاده میکنیم:

plt.axis(“off”)
plt.imshow(image)
plt.show()
 
 

خواندن تصویر با opencv و نمایش آن توسط matplotlib :

[gap height=”19″]

import cv2
import matplotlib.pyplot as plt
image = cv2.imread("img2.png") 
 plt.axis("off") 
plt.imshow(image)
plt.show() 

[gap height=”19″]

اما نتیجه انتظار نمی رفت تصویر زیر باشد:

[gap height=”19″]

13

خواندن تصویر با opencv و نمایش آن توسط matplotlib

[gap height=”19″]

چرا نتیجه مورد انتظار نیست؟

پاسخ به عنوان یک نکته در opencv نهفته است.

[gap height=”10″]

نکته

[gap height=”10″]

فرمت رنگ پیش فرض در OpenCV اغلب به عنوان RGB نامیده می شود اما در واقع BGR است (بایت ها معکوس می شوند).

  بنابراین بایت اول یک تصویر استاندارد ۲۴ بیتی  ۸ بیتی،  آبی ، بایت دوم سبز  و بایت سوم قرمز خواهد بود. بایت های چهارم، پنجم و ششم پیکسل دوم (آبی، سپس سبز، سپس قرمز)، و غیره

OpenCV تصاویر RGB را به عنوان آرایه های چند بعدی Numpy معرفی می کند … اما به ترتیب معکوس! به این معنی که تصاویر در واقع به جای فضای RGBدر فضای  BGR  نشان داده و ذخیره  شده است!

پس چگونه این مسئله را حل کنیم؟

هرچند که ثابت است اما همه ما باید انجام دهیم. تصویر را از BGR به RGB   تبدیل   میکنیم:

[gap height=”19″]

import numpy as np
 import matplotlib.pyplot as plt
 import cv2
img = cv2.imread('img2.png')
temp = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
 plt.imshow(temp)
plt.imshow(temp)
plt.axis('off')
plt.show()

[gap height=”19″]

نتیجه اسکریپت ما نشان می دهد که رنگ های تصویر ما درست است.

پردازش تصویر با پایتون- قسمت هشتم

تابع تبدیل ()cvtColor در OpenCv

 

این تابع یک تصویر ورودی را از یک فضای رنگی به یکی دیگر تبدیل می کند.  در صورت تغییر به-از فضای رنگ RGB، منظور از کانال ها باید صریح مشخص شود (RGB یا BGR).

 

cv2.cvtColor(src, code[, dst[, dstCn]]) → dst

پارامتر ها

src : تصویر ورودی:

۸-bit unsigned, 16-bit unsigned ( CV_16UC… )

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

code : کد تبدیل فضای رنگ

dstCn – تعداد کانال ها در تصویر مقصد؛ اگر پارامتر ۰ باشد، تعداد کانال ها به صورت خودکار از src و کد به دست می آید.

چرا در OpenCV  فضای رنگ BGR  است؟

 توجه داشته باشید که فرمت رنگ پیش فرض در OpenCV اغلب به عنوان RGB نامیده می شود اما در واقع BGR است (بایت ها معکوس می شوند).

  بنابراین بایت اول یک تصویر استاندارد ۲۴ بیتی  ۸ بیتی،  آبی ، بایت دوم سبز  و بایت سوم قرمز خواهد بود. بایت های چهارم، پنجم و ششم پیکسل دوم (آبی، سپس سبز، سپس قرمز)، و غیره

محدوده  معمول برای مقادیر کانال R، G و B عبارتند از:

۰ to 255 for CV_8U images

۰ to 65535 for CV_16U images

۰ to 1 for CV_32F images

CV_8U  – یعنی یک پیکسل می تواند مقادیر ۰-۲۵۵ داشته باشد، این محدوده طبیعی برای اکثر فرمت های تصویری و فیلم است.

CV_32F – پیکسل می تواند هر مقدار بین ۰-۱٫۰ داشته باشد، برای برخی از مجموعه محاسبات در داده ها مفید است – اما باید آن را به ۸ بیت برای ذخیره یا نمایش با ضرب کردن هر پیکسل به ۲۵۵ تبدیل کنید.

CV_8U: یک عدد صحیح بدون علامت ۱ بایت (unsigned char).
CV_32S عدد صحیح علامت دار (int).
CV_32F: نقطه شناور ۴ بایت (float).

پردازش تصویر با پایتون- قسمت هفتم

در این قسمت، شما نحوه نوشتن یا ذخیره یک تصویر را  با استفاده از تابع ()cv2.imwrite    در OpenCV خواهید آموخت.

 نوشتن یا ذخیره تصویر در OpenCV 

 
از تابع ()cv2.imwrite  برای ذخیره یک تصویر در یک فایل مشخص شده استفاده میشود.

cv2.imwrite(filename, img[, params]) → retval

پارامتر ها

 

filename : نام  برای فایل انتخاب یکنیم 

image: تصویر  برای ذخیره شدن

تابع imwrite تصویر را در فایل مشخص شده ذخیره می کند. فرمت تصویر بر اساس فرمت نام فایل انتخاب شده است. 

 

فشرده سازی تصویر

قبل از ذخیره کردن تصویر، فشرده سازی  جهت  حذف اطلاعات تکراری، انجام میشود. نوع فایل تصویر یا رستر یا بردار است:

تصاویر رستری 

ساخته شده از پیکسل
تغییر اندازه باعث تغییر در کیفیت تصویر میشد.

فرمت های رایج: jpg، png، gif، tif، bmp

تصاویر برداری:

ساخته شده از اشیاء بردار (نه مبتنی بر پیکسل)
می تواند به هر اندازه ای تغییر کند بدون عوض کاه یا افزایش کیفیت
• فرمت های رایج: ai، eps، ps، svg، wmf، pdf

 

vector-raster

https://commons.wikimedia.org/wiki/File:Bitmap_VS_SVG.svg

 

 در پردازش تصویر، تصاویر رستری به کار میرود.

 با استفاده از این تابع imwrite  می توان فقط تصاویر  ۸ بیتی (یا ۱۶ بیت بدون امضای (CV_16U) در حالت تک کانال یا ۳ کانال ( BGR) را ذخیره کرد.( مانند PNG، JPEG 2000 و TIFF) 

امکان استفاده از این تابع برای ذخیره تصاویر PNG با کانال آلفا وجود دارد.

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

 
 
import numpy as np
import cv2
img = cv2.imread('test.png')
cv2.imshow('image',img)
k = cv2.waitKey(0)
# را فشار بدیم Escاگر
#پنجره بسته میشود
if k == 27: 
cv2.destroyAllWindows()
#اگر این حرف را فشار بدهیم تصویر با نام انتخابی ذخیره میشود.
elif k == ord('s'): 
cv2.imwrite('save.jpg',img)
cv2.destroyAllWindows()

 

🆔@image_Process
🌐https://t.me/image_Process

پردازش تصویر با پایتون قسمت ششم

 

در این قسمت ، شما نحوه نمایش تصویر را با استفاده از تابع ()cv2.imshow در OpenCV خواهید آموخت. 
 

 نمایش یک تصویر در  OpenCv

 

از تابع ()cv2.imshow  برای نمایش یک تصویر در یک پنجره استفاده می کنیم. پنجره به طور خودکار با اندازه تصویر متناسب می شود.

 

دو آرگومان دارد. اولین آرگومان نام پنجره است که یک رشته میباشد. آرگومان دوم تصویری است که با خواندن  آن، در یک متغیر ذخیره کردیم. شما میتوانید تعداد بیشتری پنجره با یک عکس ایجاد کنید ولی باید نام عکسها متفاوت باشد. 


import cv2
img = cv2.imread('test.png') 
cv2.imshow('opencv',img)
c = cv2.waitKey(0)
cv2.destroyAllWindows()

11

cv2.imshow()

 


()cv2.waitKey 

Waits for a pressed key(منتظر برای فشار دادن یک کلید ازصفحه کلید).  یک تابع اتصال به  صفحه کلید است. یک آرگومان دارد که زمان در میلی ثانیه است.


cv2.waitKey([delay]) → retval

 

پارامتر ها

delay : تاخیرزمان به میلی ثانیه . ۰ به عنوان آرگوان ورودی مقدار ویژه ای است به معنای “بی وقفه” است.
اگر  (\texttt{delay}\leq 0 ) باشد یعنی پنجره برای مدت نامحدودی منتظر می ماند تا زمانی یک کلید از صفحه کلید را فشار دهیم و آن بسته شود. 

اگر مقدار delay  مثبت باشد مثلا ۱۰۰۰، بعد از یک ثانیه پنجره به صورت خودکار بسته میشود. 

این تابع یا کد کلید فشار داده شده از صفحه کلید را بر میگرداند یا -۱(یعنی کلیدی  قبل از زمان مشخص فشار داده نشده . برای من ۲۵۵ بر میگرداند.) 

نکته 

این تابع زمانی کار میکند که  حداقل یک پنجره HighGUI ایجاد شده و پنجره فعال باشد. اگر چندین پنجره HighGUI وجود داشته باشد، هر کدام از آنها می توانند فعال باشند. چون waitKey تنها متدHighGUI  است که میتواند رویداد ها را اداره کند.

در حالی که OpenCV برای استفاده در برنامه های کاربردی تمام عیار طراحی شده است و می تواند در چارچوب های عملکردی غنی از UI (مانند Qt *، WinForms * یا Cocoa *) یا بدون استفاده از رابط کاربری مورد استفاده قرار گیرد، گاهی اوقات لازم است که سرعت عمل را امتحان و نتایج را تصور کنید. این همان چیزی است که ماژول HighGUI برای آن طراحی شده است.

تابع destroyAllWindows تمام پنجره های باز شده HighGUI را از بین می برد.

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


import cv2

def sufra():
 img = cv2.imread('test.png')
 cv2.imshow('image', img)
 cv2.waitKey(0)
 cv2.destroyAllWindows()
 print ("waitkey")

if __name__ == '__main__':
 sufra()

waitkey
>>> 

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

۱۰۶ کد اسکی حرف h  میباشد.


import cv2

def sufra():
 img = cv2.imread('test.png')
 cv2.imshow('image', img)
 key=cv2.waitKey(1000)
 cv2.destroyAllWindows()
 print (key)
 print ("waitkey")

if __name__ == '__main__':
 sufra()

۲۵۵
waitkey
>>> 

۱۰۴
waitKey
>>> 

در کد  از دستور if استفاده کردیم که فقط با  فشار دادن کلید q،پنجره بسته میشود. 

تابع ()ord یک رشته یا کاراکتر میگرد و کد اسکی آن را بر میگرداند.


import cv2

def sufra():
 img = cv2.imread('test.png')

while True:
 cv2.imshow('image', img)
 if cv2.waitKey(1)  == ord('q'):
 cv2.destroyAllWindows()
 print ("q")
 break;

if __name__ == '__main__':
 sufra()

waitKey
>>> 

 

() cv2.destroyAllWindows

به راحتی تمامی پنجره هایی که ایجاد کردیم  را از بین می برد. اگر می خواهید پنجره خاصی را از بین ببرید، از تابع ()cv2.destroyWindow  استفاده کنید.

cv2.destroyAllWindows() → None

نکته 

یک مورد خاص وجود دارد که شما قبلا می توانید یک پنجره ایجاد کنید و تصویر را بعدا بارگذاری کنید. در این صورت، می توانید مشخص کنید که آیا پنجره قابل اندازه بندی مجدد است یا نه.
  این کار توسط تابع () cv2.namedWindow  انجام می شود. به طور پیش فرض، پرچم cv2.WINDOW_AUTOSIZE است.اما اگر شما پرچم را به عنوان cv2.WINDOW_NORMAL مشخص کنید،می توانید پنجره را تغییر دهید. هنگامی که تصویر در ابعاد بزرگ، مفید خواهد بود: 

cv2.namedWindow(winname[, flags]) → None

پارامترها

name : نامی برای پنجره که ممکنه به عنوان شناسه هم استفاه شود

flags : پرچم های پنجره:

WINDOW_NORMAL اگر تنظیم شده باشد، کاربر می تواند پنجره را تغییر دهد (بدون محدودیت).
WINDOW_AUTOSIZE اگر تنظیم شده باشد، اندازه پنجره به صورت خودکار براساس تصویر نمایش داده می شود ، و شما نمی توانید اندازه پنجره را به صورت دستی تغییر دهید.
WINDOW_OPENGL اگر تنظیم شده باشد، پنجره با پشتیبانی OpenGL ایجاد خواهد شد.

 import cv2
img = cv2.imread('test.png')
cv2.namedWindow('image', cv2.WINDOW_NORMAL)
cv2.imshow('image',img)
cv2.waitKey(0)
k=cv2.destroyAllWindows()
print(k)
None
>>> 
 

 

پردازش تصویر با پایتون قسمت پنجم

 

در این قسمت، شما نحوه خواندن یک تصویر را  با استفاده از تابع  ()cv2.imread   در OpenCV خواهید آموخت.

 

 خواندن  یا بارگذاری یک تصویر در  OpenCv

از تابع ()cv2.imread  برای خواندن تصویر استفاده  میکنیم:

cv2.imread(filename[, flags]) → retval

cv2.imread('test.jpg',0 or 1 or -1) 

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

آرگومان دوم یک پرچم است که مشخص می کند چگونه تصویر را باید خواند.

۱) cv2.IMREAD_COLOR: تصویر رنگی را بارگیری می کند و هر گونه شفافیت تصویر را نادیده می گیرد. این پرچم پیش فرض است:

پرچم بزرگتر از ۰ تصویر رنگی سه کاناله(قرمز، سبز،آبی)  و عمق ۸ بیتی برمیگرداند. BGR


cv2.imread('test.jpg')
 or
 cv2.imread('test.jpg',1)
 or
 cv2.imread('test.jpg',cv2.IMREAD_COLOR)

۲) cv2.IMREAD_GRAYSCALE: بارگیری تصویر در حالت خاکستری یک کانال و عمق ۸ بیتی:


cv2.imread('test.jpg',0)
 or 
cv2.imread('test.jpg',cv2.IMREAD_COLOR) 

 

۳) cv2.IMREAD_UNCHANGED: تصویر را به عنوان  کانال آلفا بارگیری می کند:

اگر پرچم کوچکتر از ۰ باشد تصویر ۴ کاناله برمیگرداند. تابع وقتی تصویر ۱۶/۳۲ بیتی برمیگرداند که تصویر ورودی دارای یک همچین عمقی باشد وگرنه آ ن را به ۸ بیتی تبدیل میکند


cv2.imread('test.jpg',-1)
or
cv2.imread('test.jpg',cv2.IMREAD_UNCHANGED)

نکته

به جای این سه پرچم، به سادگی می توانید عدد صحیح ۱، ۰ یا -۱ را منتقل کنید.

کد زیر را ببینید:

 import numpy as np
import cv2
img = cv2.imread('test.jpg',0)

 

همانطور که در قطعه کد بالا  ملاحظه میکنید بعد از خواندن تصویر آن را در متغییری به نام img قرار میدهیم. از این متغیر برای نمایش تصویر، نوشتن تصویر و … استفاده میکنیم.

هشدار

حتی اگر مسیر تصویر اشتباه باشد، خطایی نخواهد داشت، اما img  چاپ نمیشود.

پردازش تصویربا پایتون-قست چهارم

پردازش تصویر چیست؟

پردازش تصویر فرایند دستکاری یا انجام عملیات بر روی تصاویر، برای دستیابی به یک اثر معین (ایجاد یک تصویر سیاه و سفید به عنوان مثال) یا گرفتن اطلاعاتی از یک تصویر(مانند شمردن تعداد دایره ها یا مربع ها ) توسط  یک کامپیوتر  است.

 

شروع کار پردازش تصویر  با  ایمپورت ها است. ما از cv2، numpy و کمی از matplotlib (اغلب به عنوان یک روش راحت برای نمایش تصاویر) استفاده می کنیم .

matplotlib : کتابخانه ای برای رسم نمودارها

matplotlib.pyplot: هر تابع pyplot باعث تغییراتی در شکل می شود: به عنوان مثال

  شکلی را  می گیرد،  یک منطقه ترسیم در شکل ایجاد می کند،   چند خط در یک منطقه  از شکل ترسیم میکند،  شکل را با برچسب و غیره تزئین می کند و … .

NumPy : کتابخانه ای  برای محاسبات علمی با پایتون است. این شامل موارد زیر است:
۱) یک آبجکت آرایه n بعدی قدرتمند

۲) ابزار برای ادغام C / C ++ و کد Fortran 

۳) …..

import cv2, matplotlib

import numpy as np

import matplotlib.pyplot as plt 

 

فرمت عکس

 

بسيار خوب! ما نیاز داریم تصاویر را بخوانیم تا فرمتی که آنها نشان میدهند را بفهمیم.در OpenCv تصاویر به صورت زیر آرایه ۳ بعدی numpy نمایش داده می شوند. یک تصویر رنگی  از ردیف های پیکسل تشکیل شده و هر پیکسل با آرایه ای از مقادیر رنگ نمایش داده می شود.

BGR

 

نکته
در تصاویر رنگی هر پیکسل دارای ۳ زیر پیکسل است که به هر کدام از این زیر پیکسل ها کانال گفته میشود. یعنی الان در تصویر بالا ما سه کانال آبی، قرمز و سبز  که توسط آرایه نمایش داده  شده است ، داریم.
تصویر اصلی

تصویر اصلی

 

 

import numpy as np 

import cv2

 img = cv2.imread('test.jpg') 

print(img)

خواندن یا وارد کردن تصویر:

img = cv2.imread('test.jpg')

نمایش فرمت آن (اساسا یک آرایه ۳ بعدی از اطلاعات رنگ پیکسل، در قالب BGR):

print( img)
[[[۱۸۳ ۱۸۳ ۱۸۳][۱۰۲ ۱۰۲ ۱۰۲][۱۰۲ ۱۰۲ ۱۰۲]..., [۱۰۲ ۱۰۲ ۱۰۲][۱۰۲ ۱۰۲ ۱۰۲][۱۰۲ ۱۰۲ ۱۰۲]]

[[۱۰۲ ۱۰۲ ۱۰۲][۱۹۳ ۱۹۳ ۱۹۳][۲۵۳ ۲۵۳ ۲۵۳]..., [۱۶۸ ۱۶۸ ۱۶۸][۲۵۴ ۲۵۴ ۲۵۴][۱۹۳ ۱۹۳ ۱۹۳]]
[[۲۵۳ ۲۵۳ ۲۵۳][۲۵۲ ۲۵۲ ۲۵۲][۲۵۲ ۲۵۲ ۲۵۲]..., [۱۶۷ ۱۶۷ ۱۶۷][۲۵۳ ۲۵۳ ۲۵۳][۲۵۲ ۲۵۲ ۲۵۱]]
..., [[۲۵۵ ۲۵۵ ۲۴۷][۲۵۵ ۲۵۵ ۲۴۷][۲۵۴ ۲۵۴ ۲۵۱]..., [ ۶۸ ۶۲ ۵۶][۲۰۲ ۱۹۷ ۱۹۱][۱۳۶ ۱۲۳ ۱۰۹]]
[[۲۵۵ ۲۵۵ ۲۴۷][۲۵۵ ۲۵۵ ۲۴۶][۲۵۵ ۲۵۵ ۲۵۰]..., [۱۲۱ ۱۱۶ ۱۱۱][۱۸۶ ۱۷۹ ۱۷۳][۱۲۱ ۱۱۰ ۹۷]]
[[۲۵۵ ۲۵۵ ۲۴۴][۲۵۵ ۲۵۵ ۲۴۳][۲۵۵ ۲۵۵ ۲۴۶]..., [۱۷۸ ۱۷۲ ۱۶۶][۱۴۵ ۱۳۶ ۱۲۷][۱۰۷ ۹۶ ۸۴]]]  >>>

اینجا [ ۱۴۵ ۱۳۶ ۱۲۷] و… ، مقادیر یک پیکسل، آبی، قرمز و سبز (BGR) هستند. توجه داشته باشید که OpenCV به طور پیش فرض یک تصویر را در قالب BGR بارگذاری می کند.

داده کاوی با پایتون_قسمت دوم

datamining

http://www.adaptivecycle.nl/index.php?title=File:Data_Mining.png

 

روشهای داده کاوی

 

۱) طبقه بندی

۲) خوشه بندی

۳) کشف قانون همبستگی

۴) تشخیص و کشف خطا

۵) کشف الگوی ترتیبی

 

فرایند داده کاوی

 Knowledge Discovery in Databases (KDD) 

کشف دانش از پایگاه داده ها

فرایند داده کاوی

فرایند داده کاوی

همانطور که در تصویر بالا مشاهده میکنیم داده کاوی یکی از مراحل فرایند کشف دانش را تشکیل میدهد.

داده کاوی در کل مراحل و روش های مختلفی دارد. 

برای داده کاوی اول باید داده ها را  تمیز کرد، دسته بندی کرد، مشکلاتی که دارند رو حل کرد و …

 

روش الگوریتم   CRISP

Cross Industry Standard Process:فرایندهای استاندارد صنعت متقابل برای داده‌کاوی(ویکی)

CRISP

Cross Industry Standard Process

مراحل الگوریتم   CRISP

 

مرحله اول فهم کسب و کار

 مرحله دوم  درک داده ها 

 مرحله سوم  آماده سازی داده ها 

 مرحله چهارم درست کردن مدل اجرایی برای انجام داده کاوی 

مرحله پنجم ارزیابی مدلی که ایجاد کردیم با یکسری دادههای تستی 

مرحله آخر از این مدل استفاده می کنیم برای تحلیل داده و توسعه

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

دایره بزرگ هم نشان دهنده ی تکمیل کل فرایند و آماده شدن آن برای استفاده در این پروژه یا پروژه های دیگر است. 

داده کاوی با پایتون_قسمت اول

داده کاوی(Datamining)

داده کاوی

بیایید با هم تصور کنیم انبوه داده ی ما معدن سنگ است(Big_Data )

datamining-big-data

داده کاوی-داده های بزرگ

 

اگر دانشی که قرار است از میان انبوه داده کشف شود، رگه طلایی باشد که باید از میان آن همه سنگ کشف شود،  با داده کاوی دانش پنهان   را  از  داه های بزرگ کشف می کنیم.

دانش

Knowledge-دانش

داده های بزرگ(Big_Data )

 

برای داده_کاوی ما نیاز به حجم زیادی داده داریم که این داده ها، Big_Data نامیده میشود. حجم زیاد یعنی اونقدر داده ها زیاد باشه که به راحتی نشه تجزیه و تحلیل کرد. فق با ابزار خاص.

از ویژگیهای مهم Big_Data :

۱) ارزشمند بودن داده ها(value)

۲)متنوع بودن داده ها(variety

۳)حجیم بودن داده ها(volume)حجم زیاد یعنی اونقدر داده ها زیاد باشه که به راحتی نشه تجزیه و تحلیل کرد. فقط با ابزار خاص.

۴)داده ها به سرعت در حال تغییر و تولید هستند(Velocity)

۵)داده ها به درد بخور و صحیح هستند(veracity)

 

در کل سه ویژگی اول از همه مهمتر هستند.