راهنمای مبتدیان برای پردازش تصویر با OpenCV و Python

گره منبع: 1074439

این مقاله به عنوان بخشی از بلاگاتون علم داده

معرفی

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

ممکن است برخی از شما قبلاً در مورد Computer Vision بدانید و می توانید از این پاراگراف صرف نظر کنید، اما برای کسانی که ایده ای در مورد آن ندارند، Computer Vision که بیشتر به صورت مخفف CV شناخته می شود، می تواند به عنوان یک فیلد در هوش مصنوعی که تقریباً همه حوزه‌های مفید در این دوران مدرن از جمله حوزه پزشکی، خودروسازی، تولید، کشاورزی و غیره را استخراج می‌کند.

پردازش تصویر با OpenCV | بینایی کامپیوتر

تصویر 1

به عنوان یک انسان، که در حال خواندن این پست هستید، می توانید بین چیزها یا عناصر موجود در یک تصویر تمایز قائل شوید. اما، ماشین‌ها چطور؟ آیا آنها می توانستند ببینند و فکر کنند که آن را به تنهایی تشخیص دهند؟ نه؟ سپس اجازه دهید ماشین شما این کار را انجام دهد.

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

من فکر می کنم شما قبلاً Python Shell/Jupyter Notebook/PyCharm یا Visual Studio Code (به نام چند) را برای برنامه نویسی در پایتون نصب کرده اید. بیایید بسته پرکاربرد (OpenCV) را برای شروع نصب کنیم و کدهای هر سلول را در یک نوت بوک Jupyter اجرا کنیم.

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

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

بسته OpenCV را با استفاده از:

نصب پیپ opencv-python

OR

pip نصب opencv-contrib-python

هر یک از این دستورات را در ترمینال خود اجرا کنید یا اگر از Anaconda Navigator – Jupyter Notebook استفاده می کنید، می توانید "pip" را با دستور "conda" تغییر دهید و همان را نصب کنید.

واردات پکیج

پکیج در پایتون چیست؟ بسته در پایتون مجموعه ای از ماژول ها است که حاوی اسکریپت های از پیش نوشته شده است. این بسته ها به ما کمک می کنند تا ماژول ها را به طور کامل یا حتی جداگانه وارد کنیم. ما می توانیم بسته را با فراخوانی ماژول "cv2" به این صورت وارد کنیم:

وارد کردن cv2

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

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

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

تصویر خواندن | پردازش تصویر با OpenCV

این تصویر یک ماندریل است. من در حال حاضر در حال خواندن تصویر از فهرست محلی خود هستم.

# cv2.imread (مسیر_تصویر_با_پسوند_فایل، پرچم)

کد استفاده به شکل زیر است:

img = cv2.imread("mandrill.jpg"، 1)

در اینجا ما از روش "imread" بسته cv2 برای خواندن تصویر استفاده می کنیم و پارامتر اول مربوط به مسیر تصویر با نام فایل و پسوند آن است و دومی پرچمی است که می توانید تنظیم کنید که راه را نشان می دهد. نحوه خواندن در تصویر اگر دوست دارید، می توانید مسیر مطلق تصویر را در اینجا جایگزین کنید و سعی کنید آن را از رایانه محلی خود یا حتی از اینترنت بخوانید! اگر تصویر در فهرست کاری فعلی شما وجود دارد، فقط باید نام تصویر را با نوع پسوند آن مشخص کنید.

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

https://docs.opencv.org/4.5.2/d8/d6a/group__imgcodecs__flags.html#ga61d9b0126a3e57d9277ac48327799c80

تحت ImreadModes.

ویژگی های یک تصویر

شکل:

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

چاپ (img.shape)

روش اصلی برای چاپ شکل تصویر است، اما می‌توانیم شکل را با استفاده از:

h, w, c = img.shape print("ابعاد تصویر:nnارتفاع:"، h، "pixelsnWidth:"، w، "pixelsnتعداد کانال:"، c)

برای درک بهتر

برای حالت رنگ و بدون تغییر، 3 مقدار شامل ارتفاع، عرض و تعداد کانال های موجود در تصویر را برمی گرداند. اگر از حالت خاکستری استفاده کرده اید، شکل 2 خواهد بود که ارتفاع و عرض تصویر را برمی گرداند، اما پس از آن فقط باید از متغیرهای h و w استفاده کنید (به استثنای استفاده از "c")، در غیر این صورت ممکن است دریافت کنید. یک خطای مقدار که می‌گوید «مقدار کافی برای باز کردن بسته نیست (3 مورد انتظار بود، 2 دریافت شد).

نوع:

با استفاده از روش "نوع" می توانیم نوع تصویر را بشناسیم. استفاده از این روش به ما کمک می کند که بدانیم داده های تصویر چگونه نمایش داده می شوند. کد را به صورت زیر اجرا کنید:

چاپ (نوع (IMG))

نتیجه ممکن است به این صورت باشد:

به عنوان نوع تصویر این یک ظرف چند بعدی از اقلام از یک نوع و اندازه است. در لینک زیر می توانید به آرایه N بعدی مراجعه کنید:

https://numpy.org/doc/stable/reference/arrays.ndarray.html

نوع داده تصویری که به تازگی خوانده اید:

از آنجایی که تصویر یک آرایه N بعدی است، می توانیم نوع داده تصویر را بررسی کنیم:

چاپ (img.dtype)

مقادیر پیکسل تصویر:

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

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

مقادیر پیکسل تصویر | پردازش تصویر با OpenCV

تصویر 2

این تصویر بیشتر نمونه ای از نحوه نمایش ماتریسی یک تصویر است. در سمت چپ، تصویری از لینکلن است، در وسط، مقادیر پیکسل با اعداد از 0 تا 255 برچسب گذاری شده اند که شدت یا روشنایی آنها را نشان می دهد و در سمت راست، اعداد در ماتریس خود را تشکیل می دهند. هر مقدار در ماتریس مربوط به یک پیکسل است که کوچکترین عنصر اطلاعات موجود در یک تصویر است. فقط با چاپ متغیری که تصویر را بارگذاری کرده اید، مقادیر پیکسل تصویر را بررسی کنید!

چاپ (IMG)

وضوح تصویر:

وضوح تصویر را می توان به عنوان تعداد پیکسل های موجود در یک تصویر تعریف کرد. با افزایش تعداد پیکسل ها، کیفیت تصویر افزایش می یابد. قبلاً شکل تصویر را دیدیم که تعداد سطرها و ستون ها را نشان می دهد. این را می توان به عنوان وضوح آن تصویر گفت. برخی از وضوح‌های استاندارد این است که تقریباً همه می‌دانند 320 x 240 پیکسل (بیشتر برای دستگاه‌های صفحه‌نمایش کوچک مناسب است)، 1024 x 768 پیکسل (مناسب برای مشاهده در مانیتورهای استاندارد رایانه)، 720 x 576 پیکسل (برای مشاهده در تلویزیون با کیفیت استاندارد خوب است. مجموعه هایی با نسبت تصویر 4:3)، 1280 x 720 پیکسل (برای مشاهده در مانیتورهای عریض)، 1280 x 1024 پیکسل (مناسب برای مشاهده در اندازه تمام صفحه در مانیتورهای LCD با نسبت تصویر 5:4)، 1920 x 1080 پیکسل (برای مشاهده در تلویزیون های HD) و اکنون حتی رزولوشن های 4K، 5K و 8K داریم که به ترتیب 3840×2160 پیکسل، 5120×2880 پیکسل و 7,680×4,320 پیکسل هستند که توسط مانیتورها و تلویزیون های با وضوح فوق العاده پشتیبانی می شوند.

وقتی تعداد ستون ها و تعداد ردیف ها را ضرب می کنیم، می توانیم تعداد کل پیکسل های موجود در تصویر را بدست آوریم. به عنوان مثال، در یک تصویر 320 در 240، تعداد کل پیکسل های موجود در آن 76,800 پیکسل است.

مشاهده تصویر

بیایید ببینیم چگونه تصویر را در یک پنجره نمایش دهیم. برای این کار باید یک پنجره رابط کاربری گرافیکی ایجاد کنیم تا تصویر را روی صفحه نمایش دهد. اولین پارامتر باید عنوان صفحه پنجره رابط کاربری گرافیکی باشد که در قالب رشته مشخص شده است. با استفاده از متد ()cv2.imshow می‌توانیم تصویر را در یک پنجره پاپ‌آپ نشان دهیم. اما، وقتی سعی می کنید آن را ببندید، ممکن است احساس کنید در پنجره آن گیر کرده اید. بنابراین برای مبارزه با آن، می‌توانیم از روش «waitKey» ساده استفاده کنیم. این بخش کد را در یک سلول جدید امتحان کنید:

cv2.imshow('Mandrill', img) k = cv2.waitKey(0) اگر k == 27 یا k == ord('q'): cv2.destroyAllWindows()

در اینجا، پارامتر '0' را در "waitKey" مشخص کرده ایم تا پنجره باز بماند تا زمانی که آن را ببندیم. (همچنین می‌توانید زمان را به‌جای 0 بر حسب میلی‌ثانیه بدهید و مشخص کنید که چقدر باید باز شود.) پس از آن، می‌توانیم متغیر را برای بستن پنجره با فشار دادن کلید 'ESC' یا کلید ' تعیین کنیم. q'. متد cv2.destroAllWindows() برای بستن یا حذف پنجره‌های رابط کاربری گرافیکی از صفحه/حافظه استفاده می‌شود.

ذخیره تصویر

قبل از ذخیره تصویر، چگونه می توان تصویر را به مقیاس خاکستری تبدیل کرد و سپس آن را ذخیره کرد؟ با استفاده از:

خاکستری = cv2.cvtColor(img، cv2.COLOR_BGR2GRAY)

اکنون می توانیم تصویر را ذخیره کنیم:

cv2.imwrite('Mandrill_grey.jpg'، خاکستری)

و تصویر ذخیره شده در فهرست کاری فعلی را بررسی کنید. پارامتر اول مربوط به نام فایلی است که تصویر در آن ذخیره می شود و پارامتر دوم متغیری است که حاوی تصویر (اطلاعات پیکسل) است.

استخراج صفحات بیت تصویر و بازسازی آنها

ما می توانیم یک تصویر را به سطوح مختلف صفحات بیت تقسیم کنیم. به عنوان مثال، یک تصویر را به صفحات 8 بیتی (0-7) تقسیم کنید، جایی که چند صفحه آخر اکثر اطلاعات یک تصویر را شامل می شود.

طرح های بیت

تصویر 3

برای انجام این کار، می توانیم دو بسته دیگر را وارد کنیم:

وارد کردن matplotlib.pyplot به عنوان plt وارد کردن numpy به عنوان np

اگر هنگام وارد کردن هر یک از بسته ها با خطا مواجه شدید، می توانید آنها را با استفاده از:

conda install -c conda-forge matplotlib conda install -c anaconda numpy

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

def extract_bit_plane(cd): # استخراج همه بیت ها یک به یک # از 1 تا 8 در متغیر # از c1 تا c8 به ترتیب c1 = np.mod(cd, 2) c2 = np.mod(np.floor(cd/2) , 2) c3 = np.mod(np.floor(cd/4), 2) c4 = np.mod(np.floor(cd/8), 2) c5 = np.mod(np.floor(cd/16 )، 2) c6 = np.mod(np.floor(cd/32)، 2) c7 = np.mod(np.floor(cd/64)، 2) c8 = np.mod(np.floor(cd/ 128)، 2) # ترکیب دوباره تصویر برای تشکیل معادل تصویر اصلی در مقیاس خاکستری , c2, c2, c2, c8, c7, c6, cc] fig, axes = plt.subplots(nrows=3, ncols=1,figsize=(2, 3), subplot_kw={'xticks': [], ' yticks': []}) fig.subplots_adjust(hspace=4، wspace=5) برای ax، i در zip(axes.flat، to_plot): ax.imshow(i، cmap='gray') plt.tight_layout() ()plt.show بازگشت cc

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

reconstructed_image = extract_bit_plane (خاکستری)

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

بازسازی تصویر | پردازش تصویر با OpenCV

چطور می شود که به تنهایی یک تصویر کوچک بسازیم؟ بیایید آن را امتحان کنیم!

ساخت یک تصویر مصنوعی کوچک

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

40، 80، 160 و 220.

con_img = np.zeros([256, 256]) con_img[0:32, :] = 40 # ردیف بالا con_img[:, :32] = 40 #ستون چپ con_img[:, 224:256] = 40 # ستون سمت راست con_img[224:, :] = 40 # ردیف پایین con_img[32:64, 32:224] = 80 # ردیف بالا con_img[64:224, 32:64] = 80 # ستون سمت چپ con_img[64:224, 192: 224] = 80 # ستون سمت راست con_img[192:224, 32:224] = 80 # ردیف پایین con_img[64:96, 64:192] = 160 # ردیف بالا con_img[96:192, 64:96] = 160 # ستون سمت چپ con_img[96:192, 160:192] = 160 # ستون سمت راست con_img[160:192, 64:192] = 160 # ردیف پایین con_img[96:160, 96:160] = 220 plt.imshow(con_img)

تصویر حاصل به شکل زیر خواهد بود:

تولید

می‌توانیم در مقاله‌ای دیگر به استفاده از فیلترها و تبدیل‌های مختلف روی تصاویر نگاه کنیم.

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

الگوهای رفتاری

تصویر 4

پیشنهادات خود را زیر نظرات اضافه کنید و اگر این مقاله را دوست داشتید به اشتراک بگذارید. کد برنامه نویسی کامل پایتون در Jupyter Notebook که در این مقاله ذکر شده است در مخزن Github من موجود است:

https://github.com/jissdeodates/Beginner-s-Guide-to-Computer-Vision

منابع:

  1. تصویر 1 – https://seevisionc.blogspot.com/2013/09/computer-vision-is-everywhere.html
  2. تصویر 2- https://towardsdatascience.com/everything-you-ever-wanted-to-know-about-computer-vision-heres-a-look-why-it-s-so-wesome-e8a58dfb641e
  3. Image 3- https://nptel.ac.in/content/storage2/courses/117104069/chapter_8/8_13.html
  4. تصویر 4- https://memegenerator.net/instance/21508026/willy-wonka-oh-so-you-created-a-computer-vision-algorithm-you-must-never-lose-the-remote

https://docs.opencv.org/4.5.2/d1/dfb/intro.html

https://docs.opencv.org/4.5.2/db/deb/tutorial_display_image.html

رسانه های نشان داده شده در این مقاله متعلق به Analytics Vidhya نیستند و به صلاحدید نویسنده استفاده می شوند.

منبع: https://www.analyticsvidhya.com/blog/2021/09/a-beginners-guide-to-image-processing-with-opencv-and-python/

تمبر زمان:

بیشتر از تجزیه و تحلیل Vidhya