نوشته‌ها

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

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

 

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

 

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

 

python-Image processing-Fourier transformation

python-Image processing-Fourier transformation

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

فوریه

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

آنالوگ

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

دیجیتال

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

 

 

 

Fourier_series

Fourier series

 

python-Image processing-Fourier transformation

Fourier series

 

سیگنال صوت

 

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

 

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

 

فرکانس یا بسامد

 

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

 

python-Image processing-Fourier transformation

python-Image processing-Fourier transformation

 

انواع فیلتر :

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

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

python-Image processing-Fourier transformation

python-Image processing-Fourier transformation

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


آموزش قبلی

image -processing-python-opencv

خواندن و نمایش و نوشتن تصویر در پایتون

۱- پردازش تصویر چیست؟
۲- فرمت تصویر
۳ – نمایش فرمت تصویر
۴ – کانال
۵- خواندن یا وارد کردن تصویر
۶ – نمایش تصویر در OpenCv
۷ – نوشتن یا ذخیره تصویر در OpenCV
۷-۱ – فشرده سازی تصویر
۷-۲ – تصاویر رستری
۷-۳ – تصاویر برداری


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

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

 

شروع کار پردازش تصویر  با  ایمپورت ها است. ما از کتابخانه های  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

BGR

 

نمایش فرمت تصویر

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

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

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

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

 

کانال 

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


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

BGR-RGB

تصویر اصلی

 

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

برای خواندن تصویر در opencv، از تابع 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)

 

۳) 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  چاپ نمیشود.

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

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

 cv2.imshow()

 

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

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

cv2.imshow()

 

 

 

 

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

cv2.waitKey([delay]) → retval

 

پارامتر ها

delay 

تاخیرزمان به میلی ثانیه . ۰ به عنوان آرگوان ورودی مقدار ویژه ای است به معنای “بی وقفه” است.

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

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

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

نکته

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

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

 

destroyAllWindows

تابع 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()

تابع ()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

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

 

cv2.imwrite()


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

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

پارامتر ها

 

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

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

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

 

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

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

تصاویر رستری 

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

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

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

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

 

vector-raster

Bitmap-vector-raster

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

 

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

 با استفاده از تابع imwrite،  می توان فقط تصاویر  8 بیتی (یا ۱۶ بیت بدون امضای (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: </span>
cv2.destroyAllWindows()
#اگر این حرف را فشار بدهیم تصویر با نام انتخابی ذخیره میشود.
elif k == ord('s'): </span>
cv2.imwrite('save.jpg',img)</span>
cv2.destroyAllWindows()</span>


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

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

 


آموزش قبلی

آموزش بعدی

کتابخانه های مورد نیاز پردازش تصویر


برنامه های این  دوره از  پردازش تصویر، با پایتون ۲٫۷ هست. کتابخانه های مورد نیاز به صورت زیر می باشد:

۱- Numpy
۲- Matplotlib
۳-opencv


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

Numpy

برای کار با اعداد، آرایه ها و ماتریس ها از کتابخانه ی numpy استفاده می شود. در پردازش تصویر، کار با تصاویر هم نوعی کار با ماتریس ها  می باشد.

 برای نصب این کتابخانه، وارد آدرس C:\Python27\Scripts(یا هر درایوی که پایتون را در آن نصب کرده ایم)  می شویم. کلید شیفت را پایین نگه داشته و در قسمتی خالی از این مکان کلیک راست کرده و گزینه open command را انتخاب می کنیم سپس خط زیر را تایپ می کنیم :

pip install numpy

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

Matplotlib

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

pip install python-dateutil
pip install pyparsing
pip install matplotlib
</span>

opencv

از لینک زیر opencv را دانلود کرده و از حالت فشرده خارج می کنیم. 

https://github.com/opencv/opencv/releases/download/3.3.0/opencv-3.3.0-vc14.exe

سپس وارد مسیر C:\opencv\build\python\2.7\x86 شده و فایل موجود را کپی کرده و در مسیر C:\Python27\Lib\site-packages قرار می دهیم. 

نصب کتابخانه های مورد نیاز پرازش تصویر تموم شد. برای مطمئن شدن از نصب صحیح این کتابخانه ها، وارد شل پایتون شده و آنها را import  می کنیم. نباید خطایی نمایش داده شود. 

Numpy-Matplotlib-opencv

Numpy-Matplotlib-opencv

برای اطلاع از نسخه opencv دستور زیر را در شل پایتون وارد کنید:

 

 import cv2
cv2.__version__
 '۳٫۲٫۰'


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

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

 

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



آموزش قبلی 

آموزش بعدی