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

کتابخانه sklearn – طبقه بندی

کتابخانه sklearn شامل اجرای بسیاری از مدل ها برای طبقه بندی است و در این بخش، نحوه استفاده از Bayes Naive Gauss را برای شناسایی گل های iris به صورت Setosa، Versicolor یا Virginica  خواهیم دید. برای این منظور، بردار رشته هایی را که شامل کلاس است را به اعداد صحیح ، تبدیل می کنیم:

t = zeros(len(target))
t[target == 'setosa'] = 1
t[target == 'versicolor'] = 2
t[target == 'virginica'] = 3
print t
[۱٫ ۱٫ ۱٫ ۱٫ ۱٫ ۱٫ ۱٫ ۱٫ ۱٫ ۱٫ ۱٫ ۱٫ ۱٫ ۱٫ ۱٫ ۱٫ ۱٫ ۱٫ ۱٫ ۱٫ ۱٫ ۱٫ ۱٫ ۱٫
 ۱٫ ۱٫ ۱٫ ۱٫ ۱٫ ۱٫ ۱٫ ۱٫ ۱٫ ۱٫ ۱٫ ۱٫ ۱٫ ۱٫ ۱٫ ۱٫ ۱٫ ۱٫ ۱٫ ۱٫ ۱٫ ۱٫ ۱٫ ۱٫
 ۱٫ ۱٫ ۲٫ ۲٫ ۲٫ ۲٫ ۲٫ ۲٫ ۲٫ ۲٫ ۲٫ ۲٫ ۲٫ ۲٫ ۲٫ ۲٫ ۲٫ ۲٫ ۲٫ ۲٫ ۲٫ ۲٫ ۲٫ ۲٫
 ۲٫ ۲٫ ۲٫ ۲٫ ۲٫ ۲٫ ۲٫ ۲٫ ۲٫ ۲٫ ۲٫ ۲٫ ۲٫ ۲٫ ۲٫ ۲٫ ۲٫ ۲٫ ۲٫ ۲٫ ۲٫ ۲٫ ۲٫ ۲٫
 ۲٫ ۲٫ ۲٫ ۲٫ ۳٫ ۳٫ ۳٫ ۳٫ ۳٫ ۳٫ ۳٫ ۳٫ ۳٫ ۳٫ ۳٫ ۳٫ ۳٫ ۳٫ ۳٫ ۳٫ ۳٫ ۳٫ ۳٫ ۳٫
 ۳٫ ۳٫ ۳٫ ۳٫ ۳٫ ۳٫ ۳٫ ۳٫ ۳٫ ۳٫ ۳٫ ۳٫ ۳٫ ۳٫ ۳٫ ۳٫ ۳٫ ۳٫ ۳٫ ۳٫ ۳٫ ۳٫ ۳٫ ۳٫
 ۳٫ ۳٫ ۳٫ ۳٫ ۳٫ ۳٫]

از این جا به بعد طبقه بند را کشف کرده و آموزش میدهیم.

from sklearn.naive_bayes import GaussianNB
classifier = GaussianNB()
classifier.fit(data,t) # آموزش دیتاست iris
GaussianNB(priors=None)

طبقه بندی را می توان با متد predict (پیش بینی)،  انجام داد و آن را با یکی از نمونه ها،  آسان،  تست کرد:


print (classifier.predict(data[[0]]))
print t[0]
[۱٫]
۱٫۰
print classifier.predict(data[[1]])
[۱٫]
۱٫۰
print classifier.predict(data[[100]])

print t[100]
[۳٫]
۳٫۰
python-datamining

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

طبقه بندی(Classification)

طبقه بندی، یک تابع داده کاوی است که نمونه ها(samples ) را در یک مجموعه داده برای تعیین کلاس ها اختصاص می دهد.
مدل هایی که این تابع را اجرا می کنند، طبقه بند ، نامیده می شوند.
دو روش اساسی برای استفاده از طبقه بند وجود دارد: آموزش و طبقه بندی.
آموزش(Training ): مثلا من میام ۱۰۰ نمونه گل iris را انتخاب و با توجه به ویژگی های آنها ، آنها را به ۳ دسته(برچسب یا تارگت یا کلاس) تقسیم میکنم.
طبقه بندی(Classification ): حالا که ۱۰۰ نمونه را آموزش دادم که جزو کدام دسته باشند، نوبت به این میرسه که مثلا ۵۰ نمونه ناشناس ، توسط یک طبقه بند بررسی شوند که به کدام کلاس تعلق دارند.

python-datamining

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

  آماده سازی و تصویرسازی  داده ها

 

آماده سازی(Importing)

آموزش خود را با مثال معروف داده های زنبق(iris) ادامه میدهیم:

این دیتاست، شامل ۵۰ نمونه از  ۳ نوع گل زنبق setosa،virginica و versicolor  که جمعا ۱۵۰(۵۰*۳) نمونه میشود، می‌باشد.
داده‌ها به صورت سی اس وی(با کاما از هم جدا میشوند) می‌باشد. داده‌های دریافتی شامل ۵ ستون می‌باشند که ۴ ستون اول ویژگیها و ستون آخر کلاس نمونه ما می‌باشد.
ویژگیها (ورودی ها ، متغیر  مستقل، متغیر پیش بین ): طول و عرض کاسبرگ وطول و عرض گلبرگ

Sepal length , Sepal width , Petal length , Petal width.

کلاسها(خروجی ها ، تارگت، متغیر وابسته یا پاسخ) :

setosa،virginica و versicolor

datamining-python-iris

datamining-python-iris

یکی از مواردی که برای داده کاوی مهمه،بحث شناخت کسب و کار و فرایندهای آن میباشد.

اگر ما شناخت کافی در مورد داده ها نداشته باشیم نمیتوانیم نظری هم در مورد آنها بدهیم.

Data mining-python-iris

Data mining-python-iris

در این عکس ۴ ویژگی (طول و عرض کاسبرگ و گلبرگ گل ها) و کلاس ها به خوبی نمایش داده شده است.

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


import urllib2
url = 'http://aima.cs.berkeley.edu/data/iris.csv'
u = urllib2.urlopen(url)
localFile = open('iris.csv', 'w')
localFile.write(u.read())
localFile.close()

در قسمت بالا  از کتابخانه urllib2 برای دسترسی به یک فایل در وب سایت دانشگاه برکلی استفاده و آن را در دیسک ذخیره کردیم. این فایل حاوی دیتاست iris است .  CSV به راحتی میتواند با استفاده از تابع genfromtxt از کتابخانه numpy تجزیه و تحلیل کند.

 


from numpy import genfromtxt, zeros
# read the first 4 columns
data = genfromtxt('iris.csv',delimiter=',',usecols=(0,1,2,3))
# read the fifth column
target = genfromtxt('iris.csv',delimiter=',',usecols=(4),dtype=str)

 

در این مثال یک ماتریس از ویژگی ها و یک بردار که شامل کلاسها است ایجاد کردیم.
میتوانیم اندازه دیتا ست را به شکل ساختار داده بارگذاری و تایید کنیم:

 

print data.shape
(۱۵۰, ۴)
print target.shape
(۱۵۰,)

 

همچنین میتوانیم از نام کلاس ها و تعداد آنها مطلع شویم:

 

print set(target) # build a collection of unique elements
(set(['setosa', 'versicolor', 'virginica']

 

تصویرسازی(Visualization )

یک وظیفه مهم هنگام کار با داده های جدید این است که بفهمیم داده ها دارای چه اطلاعاتی هستند و چه ساختاری دارند.
تجسم و تصویر سازی به ما کمک میکند تا این اطلاعات را به صورت گرافیکی کشف کنیم. با استفاده از plot از کتابخانه pylab  که اینترفیسی به matplotlib است،
میتوانیم یک رسم نمودار دو بعدی داشته باشیم که ما را قادر به تجزیه و تحلیل دو بعد از دیتاست میکند و مقادیر یک ویژگی را در برابر مقادیر دیگری تحلیل میکند:

 

 

from pylab import plot, show
plot(data[target=='setosa',0],data[target=='setosa',2],'bo')
plot(data[target=='versicolor',0],data[target=='versicolor',2],'ro')
plot(data[target=='virginica',0],data[target=='virginica',2],'go')
show()

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

 

Data mining-python-iris

Data mining-python-iris

 
در این گراف حدود ۱۵۰ تا نقطه و سه رنگ برا ی نشان دادن کلاسها داریم.
نقطه های آبی نشان دهنده نمونه ای از نمونه ی setosa، قرمز versicolor و سبز نشان دهنده virginica

 

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

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

با کد زیر می توان توزیع اولین ویژگی داده های ما (طول sepal) را برای هر کلاس توزیع کرد:


from pylab import figure, subplot, hist, xlim, show
xmin = min(data[:,0])
xmax = max(data[:,0])
figure()
subplot(411) # distribution of the setosa class (1st, on the top)
hist(data[target=='setosa',0],color='b',alpha=.7)
xlim(xmin,xmax)
subplot(412) # distribution of the versicolor class (2nd)
hist(data[target=='versicolor',0],color='r',alpha=.7)
xlim(xmin,xmax)
subplot(413) # distribution of the virginica class (3rd)
hist(data[target=='virginica',0],color='g',alpha=.7)
xlim(xmin,xmax)
subplot(414) # global histogram (4th, on the bottom)
hist(data[:,0],color='y',alpha=.7)
xlim(xmin,xmax)
show()

Data mining-python-iris

Data mining-python-iris

به عنوان مثال ما مشاهده میکنیم که میانگین گل setosa،  طول کاسبرگ کوچکتری نسبت بهvirginica   دارند.

https://dzone.com

✨✨✨@pythonabb✨✨✨

🌐https://t.me/pythonabb

 

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

تبدیل فوریه برای سیگنال یک بعدی

بالاخره رسیدیم به بحث شیرین تیدیل_فوریه

استفاده از تبدیل فوریه برای تجزیه سیگنال نور

 

python-Image processing-Fourier transformation

python-Image processing-Fourier transformation

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

دیجیتال: موجی با تغییرات گسسته(سری  فوریه)

 

 

 

Fourier series

 

Fourier series

 

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

این همه بحث در مورد تبدیل_فوریه و تجزیه سیگنال به فرکانسهای تشکیل دهنده . کاربردش چیه؟؟
یکی از پر کاربردترین موارد استفاده از آن، فرایند فیلتر در پردازش سیگنال است.
مثلا اگر صدا خش دار و بی کیفیت است یا تصویر وضوح خوبی ندارد با حذف برخی از فرکانسها یا کاهش نویز توسط فیلتر به کیفیت مطلوب میرسونیم.

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

 

python-Image processing-Fourier transformation

python-Image processing-Fourier transformation

 

انواع فیلتر :
۱)فیلتر پایین گذر: فرکانسهای بالاتر از یک مقدار معین را حذف میکند و فرکانسهای پایین تر را عبور میدهد.
۲)میان گذر : فقط فرکانس های حد متوسط و میانی عبور داده میشود.
۳) بالا گذر : فرکانسهای پایین تر از یک مقدار معین را حذف میکند و فرکانسهای بالا تر را عبور میدهد.
واقعیت این است که قبل از پردازش اصلی ما یک پیش پردازش داریم تا سیگنالهای خارج از محدوده ی فرکانسی حذف شود. و این کار با فیلتر کردن انجام میشود.

python-Image processing-Fourier transformation

python-Image processing-Fourier transformation

تا اینجا ما سیگنال یک بعدی را بررسی کردیم.ولی تصویر یک سیگنال دو بعدی است

 

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

تفاوت موج و سیگنال

 

برای ادامه بحث به گیف زیر خوب توجه کنید.  کاربرد تبدیل فوریه که یک سیگنال را از حوزه زمان به حوزه فرکانس تبدیل میکند.

 

Fourier_series_and_transform

بعد از توضیح تبدیل سیگنال تک بعدی به حوزه فرکانس، به تبدیل حوزه فرکانسی  سیگنال دوبعدی (تصویر) از حوزه مکانی با استفاده از تبدیل فوریه میپرازیم. فیلتر بالاگذر و پایین گذر  را هم در ادامه بررسی میکنیم.

signal

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

دونوع سگنال داریم:

  1. سیگنال آنالوگ یا پیوسته در دنیای واقعی:  این نوع سیگنال،  شبیه موج در زمان های مختلف مقادیر مختلفی میگیره .
    مانند:
    رادیو، تلفن، تلویزیون های قدیمی و…
  2. سیگنال دیجیتال یا گسسته: در زمانهای مختلف ممکنه مقدار بگیره، ممکنه مقدار نگیره.
    مثل کامپیوترها(۰و۱)

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

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

photo_2018-06-09_13-26-13

 

wave

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

موج: ارتعاش و نوسانی که اغلب حامل انرژی بوده و در فضا یا فضازمان منتشر می‌شود را «موج» می‌گویند.#ویکی

 

photo_2018-06-09_13-26-21

 

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

photo_2018-06-09_13-26-30

photo_2018-06-09_13-26-39

 

 

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

Smoothing_Images

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

۲D Convolution ( Image Filtering )

اهداف این بخش:

  • مات کردن تصاویر با استفاده از فیلتر های پایین گذر مختلف 
  • اعمال فیلتر های سفارشی بر روی تصاویر (۲D convolution)

همانند سیگنالهای تک بعدی، تصاویر(سگنالهای دو بعدی) را هم میتوان با استفاده از فیلترهای پایین گذر(LPF)، بالا گذر (HPF) و … فیلتر کرد. LPF در برطرف کردن نویز یا تارشدن تصویر کمک می کند. HPF در پیدا کردن لبه ها در یک تصویر کمک می کند. کتابخانه OpenCV با استفاده از تابع ()cv2.filter2D، پیمایش (convolve ) یک هسته با یک تصویر را فراهم میکند.

K =  \frac{1}{25} \begin{bmatrix} 1 & 1 & 1 & 1 & 1  \\ 1 & 1 & 1 & 1 & 1 \\ 1 & 1 & 1 & 1 & 1 \\ 1 & 1 & 1 & 1 & 1 \\ 1 & 1 & 1 & 1 & 1 \end{bmatrix}

 

 

فیلتر کردن با هسته فوق نتایج زیر را انجام می دهد . عملیات مثل این است:
برای هر پیکسل در تصویر، یک پنجره ۵×۵(کرنل) بر روی این پیکسل متمرکز است، تمام پیکسلهایی که در این پنجره قرار دارند، جمع می شوند و سپس نتیجه به ۲۵ تقسیم می شود. این محاسبه، معادل میانگین مقادیر پیکسل در داخل آن پنجره است. این عمل برای تمام پیکسل ها در تصویر برای تولید تصویر فیلتر شده انجام می شود. این کد را امتحان کنید و نتیجه را بررسی کنید:

 

import cv2
 import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('opencv_logo.png')
kernel = np.ones((5,5),np.float32)/25
dst = cv2.filter2D(img,-1,kernel)
plt.subplot(121),plt.imshow(img),plt.title('Original')
plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(dst),plt.title('Averaging')
plt.xticks([]), plt.yticks([])
plt.show()

یک آرایه۵×۵ که تمام عناصر آن از یک تشکیل شده باشه، توسط دستور زیر انجام میگیره:
np.ones: آرایه ای از ۱ درست میکند:

np.ones((5,5),np.float32)
array([[ 1., 1., 1., 1., 1.],
[ ۱٫, ۱٫, ۱٫, ۱٫, ۱٫],
[ ۱٫, ۱٫, ۱٫, ۱٫, ۱٫],
[ ۱٫, ۱٫, ۱٫, ۱٫, ۱٫],
[ ۱٫, ۱٫, ۱٫, ۱٫, ۱٫]], dtype=float32)

در نهایت تقسیم بر ۲۵ میشود.

اپن سی وی(opencv) این کار را با تابع cv2.filter2D  انجام میدهد.

cv2.filter2D(img,-1,kernel)

همانطور که مشاهده میکنید این تابع ۳ پارمتر دارد:

 

cv.filter2D (src, dst, ddepth, kernel, anchor = new cv.Point(-1, -1), delta = 0, borderType = cv.BORDER_DEFAULT)

کل پارامترهایی که این تابع میگیره اینها هستن.

۱) src: تصویر ورودی
۲) dst : تصویر خروجی که از نظر اندازه و تعداد کانال با تصویر ورودی یکی است
۳) ddepth: عمق دلخواه تصویر خروجی
۴)کرنل
۵)و….

اگر عمق -۱ باشد یعنی عمق تصویر خروجی باید مانند تصویر ورودی باشد.تصویر ورودی میتونه هر تعداد کانال داشته باشه که به صورت جداگانه پردازش شوند ولی عمق باید  CV_8U, CV_16U, CV_16S, CV_32or  CV_64باشد

دقتdepth :تعداد بیتهای در نظر گرفته شده برای هر پیکسل در کامپیوتر
توجه کنید اگر ddepth مقدار -۱ بگیرد یعنی نتیجه نوع داده تصویر خروجی برابر تصویر ورودی است مثل np.uint8 یعنی ۸بیت ۰-۲۵۵(cv2.CV_8U )
الان تصویر ورودی من دارای اطلاعات زیر میباشد:

img = cv2.imread(‘face.png’)
»> img.dtype
dtype(‘uint8’)

در opencv ،  هر پیکسل در تصویر رنگی،  نماینده ۳ پارامتر(کانال) است: آبی، سبز و قرمز. هر کدام از این پارامتر ها مقدار ۰-۲۵۵ میگیرند. به طور مثال آبی مطلق :

b g r
۲۵۵ ۰ ۰

87

 

تارشدگی تصویر (صاف کردن تصویر)

برای حذف نویز مفید است. در واقع محتوای فرکانس بالا را حذف می کند (به عنوان مثال: نویز، لبه ها)، بنابراین لبه ها ، دچار تغییرات خیلی کمی میشوند .

OpenCV تقریبا چهار نوع تکنیک صاف کردن تصویر را فراهم می کند.

۱)Averaging

این کار توسط پیمایش یک فیلتر جعبه(کرنل) نرمال شده با تصویر ورودی، با استفاده از  cv2.blur () یا cv2.boxFilter () انجام می شود. ما باید عرض و ارتفاع هسته را مشخص کنیم. یک فیلتر جعبه نرمال شده ۳ × ۳ مانند زیر می باشد:

 

7e

import cv2
import numpy as np
from matplotlib import pyplot as plt>
img = cv2.imread('8.png')
blur = cv2.blur(img,(5,5))
plt.subplot(121),plt.imshow(img),plt.title('Original')
plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(dst),plt.title('Blurred')
plt.xticks([]), plt.yticks([])
plt.show()

9

۲) Gaussian Blurring

اینجا به جای فیلتر جعبه، از هسته گوسی  استفاده میشود. تابع مورد استفاده، cv2.GaussianBlur() میباشد. باید عرض و ارتفاع هسته را  که مثبت و فرد است، مشخص کنیم :

blur = cv2.GaussianBlur(img,(5,5),0)

10

 

۳) Median Blurring

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

 median = cv2.medianBlur(img,5)

 

13

 

 

 

۴) Bilateral Filtering

فیلتر دو طرفه توسط تابع،   ()cv2.bilateralFilter ، در حذف نویز با حفظ لبه ها بسیار موثر میباشد.

import cv2
 import numpy as np
 from matplotlib import pyplot as pltimg = cv2.imread('14.png')
 temp = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
 blur = cv2.bilateralFilter(temp,9,75,75)plt.subplot(121),plt.imshow(temp),plt.title('Original')
 plt.xticks([]), plt.yticks([])
 plt.subplot(122),plt.imshow(blur),plt.title('Blurred')
 plt.xticks([]), plt.yticks([])
 plt.show()

15

ببینید، بافت روی سطح رفته است، اما لبه ها هنوز هم حفظ می شوند. 

https://commons.wikimedia.org/wiki/File:3D_Convolution_Animation.gif

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

Convolution

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

۱٫کانولوشن حوزه مکان

 

یکی از عملگر  های مهم در پردازش تصویر و سیگنال،  کانولوشن است که برروی دو سیگنال یک بعدی یا دو بعدی عمل میکند:  یعنی  می توانید یک سیگنال (یا تصویر) را به عنوان ورودی  و دیگری ( هسته)  را به عنوان فیلتر روی تصویر ورودی، در نظر بگیرید که سرانجام  باعث  تولید تصویر خروجی میشود.
(بنابراین کانولوشن دو عکس را به عنوان ورودی می گیرد و تصویر سومی را  به عنوان خروجی  تولید می کند. )
کانولوشن در حوزه مکان عملگر ضرب هم معنی میشود. در واقع  یک مفهوم فوق العاده مهم در بسیاری از زمینه های ریاضی و مهندسی (از جمله بینایی کامپیوتر است).

کانولوشن بر روی سیگنال یک بعدی را  مشاهده میکنید :

 

jjure

 

 می توانیم کانولوشن را در سیگنالهای ۲D نیز  اعمال کنیم. برای کانولوشن ۲D، هسته  روی هر پیکسل از  تصویر حرکت میکندیعنی پیمایش میکند  و عمل ضرب  تصویر ورودی و هسته، و اضافه کردن آنها – نتیجه ارزش جدیدی از تصویر است.

این قسمت یک مثال ساده از کانولوشن  در فضایی ۲D است. تعریف کانولوشن ۲D و چگونگی پیمایش در ۲D در اینجا توضیح داده شده است.

 

 

 

 

x[m,n]

ورودی

h[m,n]

هسته

y[m,n]

خروجی

 

 

 

 

 

 

 

 

 


 

 

y[0,0]y[0,0]

y[1,0]y[1,0]

y[2,0]y[2,0]

y[1,1]y[1,1]

y[2,1]y[1,1]

y[2,1]y[2,1]

y[0,2]y[0,2]

y[1,2]y[1,2]

y[2,2]y[2,2]

../_images/numerical_no_padding_no_strides.gif

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

 

 

Background Subtraction

 

تفریق تصویر

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

چندین الگوریتم برای این منظور معرفی شدند. OpenCV سه الگوریتم را اجرا کرده است که بسیار آسان است. ما آنها را توسط فیلم زیر،  یک به یک می بینیم.

 

 

https://github.com/opencv/opencv/blob/master/samples/data/vtest.avi

 

BackgroundSubtractorMOG

import numpy as np
import cv2
cap = cv2.VideoCapture('vtest.avi')
fgbg = cv2.createBackgroundSubtractorMOG()
while(1):
    ret, frame = cap.read()
    fgmask = fgbg.apply(frame)
    cv2.imshow('frame',fgmask)
    k = cv2.waitKey(30) & 0xff
    if k == 27:
        break
cap.release()
cv2.destroyAllWindows()
resmog

 

BackgroundSubtractorMOG2

import numpy as np
import cv2
cap = cv2.VideoCapture('vtest.avi')
fgbg = cv2.createBackgroundSubtractorMOG2()
while(1):
    ret, frame = cap.read()
    fgmask = fgbg.apply(frame)
    cv2.imshow('frame',fgmask)
    k = cv2.waitKey(30) & 0xff
    if k == 27:
        break
cap.release()
cv2.destroyAllWindows()
https://docs.opencv.org/3.3.0/db/d5c/tutorial_py_bg_subtraction.html

https://docs.opencv.org/3.3.0/db/d5c/tutorial_py_bg_subtraction.html

 

BackgroundSubtractorGMG

import numpy as np
import cv2
cap = cv2.VideoCapture('vtest.avi')
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(3,3))
fgbg = cv2.createBackgroundSubtractorGMG()
while(1):
    ret, frame = cap.read()
    fgmask = fgbg.apply(frame)
    fgmask = cv2.morphologyEx(fgmask, cv2.MORPH_OPEN, kernel)
    cv2.imshow('frame',fgmask)
    k = cv2.waitKey(30) & 0xff
    if k == 27:
        break
cap.release()
cv2.destroyAllWindows()
 
resgmg

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

Histogram in OpenCv

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

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

تصویر زیر یک ماتریس دو بعدی از یک تصویر است که که حاوی اطلاعات از شدت روشنایی است .اگر فرض کنیم، تعداد پیکسلهایی که شدت روشنایی مثلا ۰ دارند ۱۰ تا است، ۱۰ را در محور y و محدوده شدت روشنایی(۰ یا سیاه) را درمحور x نشان میدهد.
یک هیستوگرام  مجموعه ای از مناطق مستطیل شکل یا استوانه ای به نام سطل(bin) است. (تعریف دیگر)

 

https://docs.opencv.org

https://docs.opencv.org

اگر بخواهیم این داده ها را به صورت سازمان یافته ببینیم  باید چه کنیم؟ با توجه به اینکه محدوده ارزش اطلاعات برای این مورد ۲۵۶ مقدار است، میتوانیم محدوده را به بخشهایی مثل سطل(bins) تقسیم کنیم:

\begin{array}{l} [0, 255] = { [0, 15] \cup [16, 31] \cup ....\cup [240,255] } \\ range = { bin_{1} \cup bin_{2} \cup ....\cup bin_{n = 15} } \end{array}

 

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

../../../../../_images/Histogram_Calculation_Theory_Hist1.jpg

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

بیایید برخی ورودی های تابع  هیستوگرام را شناسایی کنیم:

  • dims: تعداد پارامترهایی که می خواهید اطلاعات را جمع آوری کنید. در مثال ما مقدار این پارامتر ۱ است. چون فقط مقدار شدت روشنایی را در نظر گرفتیم. 
  • bins : تعداد هر مستطیل یا سطل را مشخص میکند. در این مثال bins = 16
  • range: بازه ای از مقادیر [range = [0,255

اگر می خواهید دو ویژگی را حساب کنید چه؟ در این حالت نتیجه شما یک قطعه ۳D است. همین کار را برای ویژگی های بیشتر اعمال می کند (مطمئنا پیچیده تر می شود).

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

https://en.wikipedia.org/wiki/File:SunLou2.jpg

https://en.wikipedia.org/wiki/File:SunLou2.jpg

import cv2
import numpy as np
from matplotlib import pyplot as plt

gray_img = cv2.imread('images_histogram.png', cv2.IMREAD_GRAYSCALE)#histogram tasvir tak kanale
cv2.imshow('GoldenGate',gray_img)
hist = cv2.calcHist([gray_img],[0],None,[256],[0,256])
plt.hist(gray_img.ravel(),256,[0,256])
plt.title('Histogram for gray scale picture')
plt.show()

while True:
    k = cv2.waitKey(0) & 0xFF     
    if k == 27: break             # ESC key to exit 
cv2.destroyAllWindows()

hisgray

image_histogram

نکته: نحوه کارکرد تابع ()ravel, همانند (reshape(-1.

>>> import numpy as np
>>> x = np.array([[1, 2, 3], [4, 5, 6]])
>>> print (np.ravel(x))
[۱ ۲ ۳ ۴ ۵ ۶]
>>> x.reshape(-1)
array([1, 2, 3, 4, 5, 6])
>>>

()calcHist

OpenCV از  تابع ()cv2.calcHist  برای هیستوگرام استفاده میکند. بنابراین، زمان آن است که به پارامترهای خاص مربوط به تابع () cv2.calcHist نگاه کنیم:

cv2.calcHist(images, channels, mask, histSize, ranges[, hist[, accumulate]])

 

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

hist = cv2.calcHist([gray_img],[0],None,[256],[0,256])

پارامتر ها

  1. images: تصویر منبع از نوع uint8 یا float32، باید به عنوان یک لیست ارائه شود. [gray_img]
  2. channels: این مورد نیز به عنوان یک لیست [] داده شده است. این شاخص کانال است که ما با آن هیستوگرام را محاسبه می کنیم. برای مثال، اگر ورودی تصویر سیاه و سفید است، مقدار آن [۰] است. برای تصویر رنگی، می توانید [۰]، [۱] یا [۲] را به ترتیب برای هیستوگرام کانال آبی، سبز یا قرمز محاسبه کنید.
  3. mask:  برای پیدا کردن هیستوگرام  تصویرکامل ، آن را به عنوان None تنظیم شده است. با این حال، اگر ما می خواهیم هیستوگرام منطقه خاص تصویر را دریافت کنیم، باید یک تصویر ماسک برای آن ایجاد کنیم و آن را ماسک کنیم.
  4. histSize:  نشان دهنده شمارش BIN است. باید در [] داده شود. برای مقیاس کامل، ما [۲۵۶]را قرار دادیم .
  5. ranges : به طور معمول، [۰،۲۵۶] است.

 

()NumPy – np.histogram

 

همچنین NumPy یک تابع برای هیستوگرام، که ()np.histogram  است  را فراهم می کند. بنابراین، ما می توانیم به جای تابع OpenCV از NumPy استفاده کنیم:

import cv2
import numpy as np
from matplotlib import pyplot as plt

gray_img = cv2.imread('hisimage.jpg', cv2.IMREAD_GRAYSCALE)
cv2.imshow('GoldenGate',gray_img)
#hist = cv2.calcHist([gray_img],[0],None,[256],[0,256])
hist,bins = np.histogram(gray_img,256,[0,256])

plt.hist(gray_img.ravel(),256,[0,256])
plt.title('Histogram for gray scale picture')
plt.show()

while True:
    k = cv2.waitKey(0) & 0xFF     
    if k == 27: break             # ESC key to exit
cv2.destroyAllWindows()

هیستوگرام برای تصاویر رنگی

import cv2
import numpy as np
from matplotlib import pyplot as plt

img = cv2.imread('images/GoldenGateSunset.png', -1)
cv2.imshow('GoldenGate',img)

color = ('b','g','r')
for channel,col in enumerate(color):
    histr = cv2.calcHist([img],[channel],None,[256],[0,256])
    plt.plot(histr,color = col)
    plt.xlim([0,256])
plt.title('Histogram for color scale picture')
plt.show()

while True:
    k = cv2.waitKey(0) & 0xFF     
    if k == 27: break             # ESC key to exit 
cv2.destroyAllWindows()

hiscolorimage

 

متعادل سازی هیستوگرام


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

یک تصویر را که مقادیر پیکسل(شدت روشنایی) آن،  به رنج کمی از مقادیر،  محدود است را در نظر بگیرید. برای مثال، تصویر روشن تر تمام پیکسل ها را به مقادیر بالا(نزدیک به ۲۵۵) محدود خواهد کرد. اما یک تصویر خوب، پیکسل ها را از تمام نقاط تصویر انتخاب میکند.

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

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

 

histogram_equalization.png

importcv2
import numpy as  np
from matplotlib import pyplot as plt
img = cv2.imread('wiki.jpg',0)
hist,bins = np.histogram(img.flatten(),256,[0,256])
cdf = hist.cumsum()
cdf_normalized = cdf * hist.max()/ cdf.max()
plt.plot(cdf_normalized, color = 'b')
plt.hist(img.flatten(),256,[0,256], color = 'r')
plt.xlim([0,256])
plt.legend(('cdf','histogram'), loc = 'upper left')
plt.show()

 

  
 

در تصوير، مقدار ميانگين مقدار متوسط شدت روشنايی تصوير را نشان می دهد و مقدار واريانس، مقدار متوسط کنتراست تصوير را نمايش می دهد.

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

تشخیص پلاک خودروهای های ایرانی توسط کتابخانه OpenCV

بعد از تمام  شدن آموزش مقدماتی پردازش تصویر، پروژه های کوچک وبعد  پروژه تشخیص پلاک خودرو را بررسی میکنیم. 

 

🌟تشخیص حیوانات🌟

g1

2g

🌟تشخیص چهره🌟

g4

🌟تشخیص بارکد🌟

g5

‍ 🌟Credit card OCR🌟

g7

 

 

🌟تشخیص پلاک خودرو🌟

g8

 

 

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