۱- پردازش تصویر چیست؟
۲- فرمت تصویر
۳ – نمایش فرمت تصویر
۴ – کانال
۵- خواندن یا وارد کردن تصویر
۶ – نمایش تصویر در 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):
print( img) [[[183 183 183][102 102 102][102 102 102]..., [102 102 102][102 102 102][102 102 102]] [[102 102 102][193 193 193][253 253 253]..., [168 168 168][254 254 254][193 193 193]] [[253 253 253][252 252 252][252 252 252]..., [167 167 167][253 253 253][252 252 251]] ..., [[255 255 247][255 255 247][254 254 251]..., [ 68 62 56][202 197 191][136 123 109]] [[255 255 247][255 255 246][255 255 250]..., [121 116 111][186 179 173][121 110 97]] [[255 255 244][255 255 243][255 255 246]..., [178 172 166][145 136 127][107 96 84]]]
اینجا [ ۱۴۵ ۱۳۶ ۱۲۷] و… ، مقادیر یک پیکسل، آبی، قرمز و سبز (BGR) هستند. توجه داشته باشید که OpenCV به طور پیش فرض یک تصویر را در قالب BGR بارگذاری می کند.
در تصاویر رنگی هر پیکسل دارای ۳ زیر پیکسل است که به هر کدام از این زیر پیکسل ها کانال گفته میشود. یعنی الان در تصویر بالا ما سه کانال آبی، قرمز و سبز که توسط آرایه نمایش داده شده است ، داریم.
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')
از تابع ()cv2.imshow، برای نمایش تصویر در یک پنجره استفاده می کنیم. پنجره به طور خودکار با اندازه تصویر متناسب می شود. این تابع دو آرگومان دارد. اولین آرگومان نام پنجره است که یک رشته میباشد. آرگومان دوم تصویری است که با خواندن آن، در یک متغیر ذخیره کردیم. شما میتوانید تعداد بیشتری پنجره با یک تصویر ایجاد کنید ولی باید نام تصاویر متفاوت باشد.
import cv2 img = cv2.imread('test.png') cv2.imshow('opencv',img) c = cv2.waitKey(0) cv2.destroyAllWindows()
Waits for a pressed key(منتظر برای فشار دادن یک کلید ازصفحه کلید). یک تابع اتصال به صفحه کلید است. یک آرگومان دارد که زمان در میلی ثانیه است.
cv2.waitKey([delay]) → retval
تاخیرزمان به میلی ثانیه . ۰ به عنوان آرگوان ورودی مقدار ویژه ای است به معنای “بی وقفه” است.
اگر ( ) باشد یعنی پنجره برای مدت نامحدودی منتظر می ماند تا زمانی یک کلید از صفحه کلید را فشار دهیم و آن بسته شود.
اگر مقدار delay مثبت باشد مثلا ۱۰۰۰، بعد از یک ثانیه پنجره به صورت خودکار بسته میشود.
این تابع یا کد کلید فشار داده شده از صفحه کلید را بر میگرداند یا -۱(یعنی کلیدی قبل از زمان مشخص فشار داده نشده . برای من ۲۵۵ بر میگرداند.)
نکته
این تابع زمانی کار میکند که حداقل یک پنجره
در حالی که 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 () 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 () break; if __name__ == '__main__': sufra() waitKey
به راحتی تمامی پنجره هایی که ایجاد کردیم را از بین می برد. اگر می خواهید پنجره خاصی را از بین ببرید، از تابع ()cv2.destroyWindow استفاده کنید.
یک مورد خاص وجود دارد که شما قبلا می توانید یک پنجره ایجاد کنید و تصویر را بعدا بارگذاری کنید. در این صورت، می توانید مشخص کنید که آیا پنجره قابل اندازه بندی مجدد است یا نه. این کار توسط تابع () cv2.namedWindow انجام می شود.
به طور پیش فرض، پرچم cv2.WINDOW_AUTOSIZE است.اما اگر شما پرچم را به عنوان cv2.WINDOW_NORMAL مشخص کنید،می توانید پنجره را تغییر دهید. هنگامی که تصویر در ابعاد بزرگ، مفید خواهد بود:
WINDOW_NORMAL : اگر تنظیم شده باشد، کاربر می تواند پنجره را تغییر دهد (بدون محدودیت).
WINDOW_AUTOSIZE : اگر تنظیم شده باشد، اندازه پنجره به صورت خودکار براساس تصویر نمایش داده می شود ، و شما نمی توانید اندازه پنجره را به صورت دستی تغییر دهید.
WINDOW_OPENG اگر : تنظیم شده باشد، پنجره با پشتیبانی 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.imwrite(filename, img[, params]) → retval
filename : نام برای فایل انتخاب یکنیم
image: تصویر برای ذخیره شدن
تابع imwrite تصویر را در فایل مشخص شده ذخیره می کند. فرمت تصویر بر اساس فرمت نام فایل انتخاب شده است.
قبل از ذخیره کردن تصویر، فشرده سازی جهت حذف اطلاعات تکراری، انجام میشود. نوع فایل تصویر یا رستر یا بردار است:
ساخته شده از پیکسل
تغییر اندازه باعث تغییر در کیفیت تصویر میشد.
فرمت های رایج: jpg، png، gif، tif، bmp
ساخته شده از اشیاء بردار (نه مبتنی بر پیکسل)
می تواند به هر اندازه ای تغییر کند بدون عوض کاه یا افزایش کیفیت
• فرمت های رایج: ai، eps، ps، svg، wmf، pdf
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()
سلام
ممنون میشم در خصوص مقایسه دو تصویر توضیح دهید.
فرض کنید یک عکس از شخصی داریم و حالا میخواهیم آن تصویر را با یک عکس دیگر مقایسه کنیم و بفهمیم این دو تصویر مربوط به یک نفر است یا خیر.
سپاس از لطفتون
برای فراخوانی عکس پایتون و مراحل بعدی ممکنه فیلمی تهیه کنید برای یادگیری بیشتر؟
با تشکر .
سلام. ممنون.
در آینده احتمالا
مسئله ای هست که تعداد کتاب های یک کتابخانه را با استفاده از پردازش تصویر و لبه ها بدست آورید ، از کدوم دستور میشه استفاده کرد ؟
import numpy as np
import cv2
img = cv2.imread(‘test.jpg’)
print(img)
این کد جواب نمیده و به همون خط اول و دوم ایراد میگیره.
سلام
لطفا خطایی که دریافت میکنید را اینجا قرار دهید
اگر خطای ModuleNotFoundError: No module named ‘numpy’ را دریافت میکنید باید کتابخانه numpy را نصب کنید :
pip install numpy یا pip3 install numpy
اگر خطای ModuleNotFoundError: No module named ‘cv2’ را دریافت میکنید باید opencv را نصب کنید
pip install opencv-python