آموزش الکترونیکآموزش پردازش تصویر

آموزش پردازش تصویر با OpenCV در پایتون و انجام مثال (#1)

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

در این مقاله ما ابتدا به مسائل تئوری مربوط به پردازش تصویر میپردازیم و سپس نصب Open CV در پایتون را آموزش میدهیم. در انتها یک پروژه پردازش تصویر ساده را انجام میدهیم.

اولین قدم رسمی در این زمینه در سال 1999 با ابتکار عمل Intel برداشته شد، هنگامی که تمام تحقیقات انجام شده با همکاری open cv (منبع باز بینایی کامپیوتر) که در اصل به صورت ++C نوشته شده بود، با انتشار اولین نسخه اصلی 1.0 در سال 2006، دومین در سال 2009، سومین در سال 2015 و چهارمین نسخه هم اکنون در سال 2018 . اکنون، opencv دارای رابطه های میانجی Python، Java و ++C است و از ویندوز، لینوکس، سیستم عامل Mac، سیستم عامل iPhone و اندروید پشتیبانی می کند. بنابراین می توان آن را به راحتی در Raspberry Pi با محیط Python و Linux نصب کرد. Raspberry Pi با openCV و دوربین الصاقی می تواند برای ایجاد بسیاری از برنامه‌های پردازش تصویر بلادرنگ مانند تشخیص چهره، face lock، ردیابی اشیا، تشخیص شماره پلاک خودرو، سیستم امنیتی منزل و غیره استفاده شود.

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

تصاویر چه هستند؟

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

تصاویر چه هستند؟

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

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

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

شکل گیری تصویر با کمک لنزها

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

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

کامپیوتر چگونه تصاویر را ذخیره می کند؟

شاید شما در مورد فرمت های مختلف تصویر مانند JPEG، PNG و غیره شنیده باشید. همه این ها نمایش دیجیتالی دنیای آنالوگ ماست. کامپیوترها این کار را با ترجمه تصویر به کد دیجیتال، برای ذخیره سازی انجام می دهند و سپس برای نمایش فایل را به یک تصویر ترجمه  می کنند. اما در ابتدا آنها از یک پلتفورم مشترک برای ذخیره تصاویر استفاده می کنند و برای openCV نیز صدق می‌کند.

برنامه openCV به طور پیش فرض از سیستم رنگی RGB (قرمز، سبز، آبی) برای تصاویر خود استفاده می کند، جایی که مختصات هر پیکسل (x, y) از سه مقدار مختلف برای شدت های 8 بیت به شکل i.e(0-255,2 8) تشکیل شده است.

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

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

قرمز = 255، سبز = 255، آبی = 0

اکنون این تصاویر در آرایه های چند بعدی ذخیره می‌شوند. در برنامه نویسی، آرایه مجموعه ای از اشیاء است. و در اینجا ما با سه نوع آرایه ی 1D، 2D و 3D سرکار داریم که D مخفف dimensional است.

کامپیوتر چگونه تصاویر را ذخیره می کند؟

تصاویر رنگی در آرایه های سه بعدی ذخیره می شوند، جایی که ابعاد سوم نمایانگر رنگ های RGB هستند ( که بعدا خواهیم دید) و آنها با هم، شدت های مختلفی از پیکسل ها را برای یک عکس تشکیل می‌دهند. در حالی که تصاویر سیاه و سفید در آرایه های دو بعدی ذخیره می شوند و همچنین دو نوع تصویرِ سیاه و سفیدِ Greyscale و Binary وجود دارد.

تصاویر Greyscale از سایه های خاکستری یک آرایه دو بعدی  [ ( 0,255 ) , ( 0,255 ) ] تشکیل شده است، درحالی که تصاویر Binary، پیکسل های سیاه و سفید هستند.

چرا شناسایی تصاویر برای دستگاه دشوار است؟

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

  • محدودیت سنسور دوربین و محدودیت لنز
  • نقاط دید متفاوت
  • تغییر روشنایی
  • مقیاس گذاری
  • استثنائات
  • تغییرات کلاس شی
  • تصاویر مبهم / توهمات نوری

برنامه OpenCV و کاربردهای آن

با وجود این مشکلات ، Computer Vision داستان های موفقیت بسیاری دارد:

  • ربات مسیر یاب – اتومبیل های اتوماتیک
  • تشخیص و شناسایی چهره
  • موتور جستجوگر تصویر
  • مجوز خواندن صفحه
  • تشخیص دست خط
  • Snapchat و فیلترهای صورت
  • تشخیص اشیاء
  • پیگیری توپ و پخش آنها در ورزش
  • و خیلی چیزهای بیشتر!

نصب OpenCV با پایتون و آناکوندا

OpenCV به زبان C++ نوشته شده است ، اما اجرای آن با C++ بسیار دشوار است و از این رو تصمیم می گیریم آن را با یک زبان سطح بالا به عنوان پایتون پیاده سازی کنیم ، همچنین مزایای دیگری نیز برای اجرای OpenCV  با پایتون وجود دارد زیرا پایتون یکی از ساده ترین زبان هاست. برای مبتدیان همچنین برای علوم داده و برنامه های کاربردی یادگیری ماشین بسیار قدرتمند است و همچنین تصاویر را در آرایه های numpy ذخیره می کند که به ما امکان می دهد عملیات بسیار قدرتمندی را به راحتی انجام دهیم.

حتما ببینید :  کاربرد آردوینو در صنعت (ساخت PLC با برد صنعتی آردوینو)

برنامه نویسی پایه با قرار گرفتن در معرض سطح ریاضی دبیرستان ، وب کم ، پایتون 2.7 یا 3.6 (بسته آناکوندا ترجیح داده می شود) مفید است.

مرحله 1: بسته Anaconda Python را دانلود و نصب کنید.

به این آدرس بروید و با توجه به شرایط دستگاه خود ویندوز ، لینوکس یا مک را انتخاب کنید و می توانید نسخه Python 2.7 یا Python 3.7 را برای سیستمهای 64 بیتی یا سیستمهای 32 بیتی انتخاب کنید ، اما این روز ها بیشتر سیستم ها 64 بیتی هستند.

توزیع آناکوندا از پایتون از طریق spyder studio ، نوت بوک های jupyter و anaconda prompt انجام می شود که باعث می شود پایتون بسیار محبوب باشد. برای انجام مثالها از spyder studio استفاده خواهیم کرد.

انتخاب بین پایتون 2.7 یا 3.7 کاملاً بی طرفانه است ، اما با این حال برای مثالها ، می خواهیم از پایتون 3.7 استفاده کنیم . زیرا آینده پایتون است و پایتون 2.7 را از سال 2020 در بر خواهد گرفت ، همچنین بیشتر کتابخانه ها در پایتون 3.7 نگهداری می شوند. جنبه آینده پایتون را در نظر داشته باشید. همچنین نتایج عملیاتی ریاضی مانند (2/5=2.5)  را نیز می دهد ، در حالی که پایتون 2.7 آن را به 2. ارزیابی می کند. همچنین چاپ به عنوان تابعی در پایتون 3.7 (print(“hello”)) ، استفاده می شود. آن به برنامه نویسان تعیین یک فرآیند یا آموزش ، که با عملکرد واقعی قطعه ای از سخت افزار درگیر است (hands-on) را میدهد.

مرحله 2: ایجاد یک بستر مجازی با OpenCV

ما قصد داریم OpenCV را با ایجاد یک بستر مجازی برای spyder با استفاده از prompt  Anaconda و پرونده YML نصب کنیم. (دانلود فایل های YML)

با استفاده از فایل های YML تمام بسته ها و کتابخانه های مورد نیاز را نصب خواهیم کرد ، اما اگر می خواهید بسته های اضافی را نصب کنید می توانید با اجرای دستور آن بسته، به راحتی از طریق anaconda prompt  نصب کنید.

به نماد جستجوی ویندوز خود بروید و anaconda prompt terminal  را پیدا کنید ، می توانید آن را در پوشه anaconda خود که به تازگی نصب کرده اید بیابید.

سپس باید فایل YML دانلود شده خود را پیدا کنید ، و از اینجا شما باید دو گزینه را انتخاب کنید یا دایرکتوری ترمینال خود را به محلی که فایل YML شما دانلود شده است تغییر دهید یا فایل YML خود را در دایرکتوری که آناکوندای شما نصب شده است کپی کنید. در اکثر موارد ، می تواند درون در درایو C باشد. پس از کپی کردن فایل YML در محل مشخص شده ، دستور زیر را در prompt خود اجرا کنید :

conda env create –f  virtual_platform_windows.yml

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

توجه: در صورت خطا در استخراج بسته ، ابتدا pytorch  و numpy  را نصب کنید و دستور فوق را اجرا کنید.

اکنون anaconda navigator را پیدا کنید و یک منوی کشویی “Applications on ___” وجود دارد و از آنجا محیط مجازی را انتخاب کرده و spyder studio  را راه اندازی کنید.

و همینه ، شما برای شروع آماده ای !

نصب OpenCV با پایتون و آناکوندا

باز کردن و ذخیره ی عکس ها در OpenCV

در این جا ما برخی فرمان های پایه ای و مجموعه ای از اصطلاحات برای استفاده از Python در OpenCV را توضیح می دهیم. ما در مورد سه عملکرد پایه در OpenCV خواهیم آموخت ، imread ، imshow وimwrite.

#comments in python are given by # symbol

با فرمان زیر opencv را در python وارد کنید.

import cv2

با استفاده از ‘imread’ مشخص کردن مسیر تصویر ، یک تصویر را بارگذاری کنید.

image =cv2.imread('input.jpg')

اکنون آن تصویر در python به عنوان متغیری که ما به عنوان تصویر نامه گذاری کرده ایم بارگذاری و ذخیره شده است.

حال برای نمایش متغیر تصویرمان ، از ‘imshow’ استفاده می کنیم و اولین پارامتر برای عملکرد imshow ، عنوانی است که در پنجره ی زیر نشان داده شده است و باید برای نمایش اسم همانند یک رشته در (‘  ‘) وارد شده باشد

cv2.imshow('hello world',image)

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

cv2.waitKey()

‘destroyAllWindows’ تمام پنجره های باز را می بندد ، عدم قرار این امر موجب قطع برنامه ی شما می شود.

cv2.destroyAllWindows()

باز کردن و ذخیره ی عکس ها در OpenCV

اکنون بیایید نگاهی بیاندازیم که چگونه تصاویر در open cv ذخیره می شوند. برای این موضوع ، ما از numpy استفاده می کنیم. numpy یک کتابخانه برای python ، برای پشیبانی از آرایه ها و ماتریکس های چند بعدی بزرگ است.

import cv2
#importing numpy
import numpy as np
image=cv2.imread('input.jpg')
cv2.imshow('hello_world', image)
#shape function is very much useful when we are looking at a dimensions of an array, it returns a tuple which gives a dimension of an image
print(image.shape)
cv2.waitKey()
cv2.destroyAllWindows()

console output - (183, 275, 3)، دو بعد تصویر، 183 پیکسل در طول و 275 پیکسل در عرض هستند و 3 یعنی که سه اجزاء دیگر نیز وجود دارند (R, G, B) ، که این تصویر را می سازد ( این نشان می دهد که تصاویر رنگی در آرایه های سه بعدی ذخیره می شوند ).

حال بیایید با اضافه کردن سطرهای کد زیر ، هر بعد از تصویر را چاپ کنیم.

print('Height of image:',(image.shape[0],'pixels'))
print('Width of image:',(image.shape[1],'pixels'))

خروجی کنسول  – طول تصویر (183, 'pixels')

عرض تصویر (275, 'pixels')

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

ما از  ‘imwrite’ برای مشخص کردن نام و تصویر ذخیره شده استفاده می کنیم.

cv2.imwrite('output.jpg',image)
cv2.imwrite('output.png',image)

اولین بحث ، نام فایلی است که می خواهیم آن را ذخیره کنیم ، { برای خواندن یا ذخیره کردن فایل ، ما از (‘  ‘) برای نشان دادن آن به عنوان یک رشته، استفاده می کنیم } و دومین بحث ، نام فایل است.

OpenCv به ما اجازه ی ذخیره کردن تصویر در فرمت های مختلف را می دهد.

سیاه و سفید کردن تصویر در OpenCV

Greyscaling  فرآیندی است که توسط آن یک تصویر تمام رنگی به سایه های خاکستری (سیاه و سفید) تبدیل می شود.

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

import cv2
# load our input image
image=cv2.imread('input.jpg')
cv2.imshow('original', image)
cv2.waitKey()
#we use cvtcolor, to convert to greyscale
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
cv2.imshow('grayscale', gray_image)
cv2.waitKey()
cv2.destroyALLWindows()

سیاه و سفید کردن تصویر در OpenCV

راه ساده تر برای تبدیل تصویر تمام رنگی  به سیاه سفید ، فقط اضافه کردن Argument0 در تابع تصویر در کنار نام تصویر است

import cv2
grey_image=cv2.imread('input.jpg',0)
cv2.imshow('grayscale',grey_image)
cv2.waitKey()
cv2.destroyAllWindows()

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

import cv2
import numpy as np
image=cv2.imread('input.jpg')
print(image.shape)
cv2.imshow('original', image)
cv2.waitKey()
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
cv2.imshow('grayscale', gray_image)
print(gray_image.shape)
cv2.waitKey()
cv2.destroyALLWindows()

خروجی کنسول:

  • (183 ، 275 ، 3) – برای تصویر رنگی
  • (183 ، 275) – برای تصویر سیاه سفید

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

فضاهای رنگی تصاویر

فضاهای رنگی نحوه ذخیره تصاویر است. RGB ، HSV ، CMYK فضاهای مختلف رنگی هستند که روش های ساده ای برای نمایش رنگ هستند.

  •  RGB – قرمز ، سبز و آبی
  •  HSV – رنگ ، اشباع و ارزش.
  •  و CMYK معمولاً در چاپگرهای جوهر افشان استفاده می شود.
حتما ببینید :  آموزش پروگرام بیسیم برد آردوینو (آپلود کد Arduino با بلوتوث)

فضای رنگی RGB یا BGR

رنگ فضای پیش فرض OpenCV ، رنگ RGB است.  RGB یک مدل رنگی افزودنی است که با ترکیب رنگ های آبی ، سبز و قرمز با شدت / روشنایی مختلف ، رنگ ها را ایجاد می کند.  در OpenCV از گستره رنگی 8 بیتی استفاده می کنیم.

  • قرمز (0-255)
  • آبی (0-255)
  • سبز (0-255)

فضای رنگی RGB یا BGR

با این حال OpenCV در واقع رنگ را با فرمت BGR ذخیره می کند.

واقعیت جالب: – ما به دلیل چگونگی ذخیره عدد صحیح 32 بیتی در حافظه ، از نظم BGR در رایانه ها استفاده می کنیم ، اما همچنان به صورت RGB ذخیره می شود.  عدد صحیح که نمایانگر یک رنگ است به عنوان مثال: – 0X00BBGGRR به صورت 0XRRGGBB ذخیره می شود.

فضای رنگی HSV

HSV (رنگ ، اشباع و ارزش / روشنایی) فضای رنگی است که سعی در نمایش رنگ هایی دارد که انسان آن را درک می کند.  اطلاعات رنگ را به صورت نمای استوانه ای از نقاط رنگ RGB ذخیره می کند.

  •  رنگ – مقدار رنگ (0-179)
  •  اشباع – نوسان رنگ (0-255)
  •  مقدار – روشنایی یا شدت (0-255)

فرمت فضای رنگ HSV در تقسیم رنگ مفید است.  در RGB ، فیلتر کردن رنگ خاص کار ساده ای نیست ، اما HSV تنظیم کردن محدوده های رنگی را برای فیلتر کردن رنگ های خاص بسیار آسان تر می کند ، همانطور که ما آنها را درک می کنیم.

فضای رنگی HSV

Hue رنگ را در HSV نشان می دهد ، مقدار رنگ از 0 – 180 و نه 360 متغیر است ، بنابراین چرخه کامل را کامل نمی کند و بنابراین متفاوت از استاندارد نقشه برداری می شود.

فیلتر های دامنه رنگ HSV در Open CV

فیلتر های دامنه رنگ :

  •  قرمز – (165-15)
  •  سبز – (45-75)
  •  آبی – (90-120)

همانطور که می دانیم تصاویر در فضای رنگی RGB (قرمز ، سبز و آبی) ذخیره می شوند و OpenCV همان را نشان می دهد ، اما اولین چیزی که باید در مورد فرمت RGB opencv به خاطر بسپارید این است که در واقع BGR است و می توانیم با نگاهی به شکل تصویر آن را بشناسیم

import cv2
import numpy as np
image = cv2.imread('input.jpg')
#B,G,R value for the first 0,0 pixel
B,G,R=image[0,0]
print(B,G,R)
print(image.shape)
#now if we apply this on grayscale image
gray_img=cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
print(gray_img.shape)
#gray_image pixel value for 10,50 pixel
print(gray_img[10,50])

خروجی کنسول: print(B,G,R) - 6 11 10

print(image.shape) -  (183, 275, 3)

 print(gray_img.shape) - (183, 275)

print(gray_img[10,50])   - 69

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

فضای رنگی مفید دیگر HSV است

import cv2
image=cv2.imread('input.jpg')
hsv_image=cv2.cvtColor(image,cv2.COLOR_BGR2HSV)
cv2.imshow('HSV image',hsv_image)
cv2.imshow('Hue channel',hsv_image[:,:,0])
cv2.imshow('saturation channel',hsv_image[:,:,1])
cv2.imshow('value channel',hsv_image[:,:,2])
cv2.waitKey()
cv2.destroyAllWindows()

فضای رنگی مفید دیگر HSV

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

تصویر کانال Hue کاملاً تاریک است زیرا مقدار آن فقط از 0 تا 180 متغیر است.

همچنین توجه داشته باشید که تابع imshow تصویر RGB یا BGR را به شما نشان می دهد ، اما تبدیل HSV روی هم تداخل دارد.

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

کاوش در اجزای تکی تصویر RGB

import cv2
image=cv2.imread('input.jpg')
#opencv's split function splits the imageinti each color index
B,G,R=cv2.split(image)
cv2.imshow("Red",R)
cv2.imshow("Green",G)
cv2.imshow("Blue",B)
#making the original image by merging the individual color components
merged=cv2.merge([B,G,R])
cv2.imshow("merged",merged)
#amplifying the blue color
merged=cv2.merge([B+100,G,R])
cv2.imshow("merged with blue amplify",merged)
#representing the shape of individual color components.
# the output wuld be only two dimension whih wouldbe height and width, since third element of RGB component is individually represented
print(B.shape)
print(R.shape)
print(G.shape)
cv2.waitKey(0)
cv2.destroyAllWindows()

کاوش در اجزای تکی تصویر RGB

خروجی کنسول :

                              (183, 275)

                              (183, 275)

                              (183, 275)

تبدیل عکس به مولفه فردی RGB

در کد پایین ما یک ماتریکس صفرها را همراه با ابعاد تصویر H×W ساخته ایم ، صفر به یک آرایه ی پرشده با صفرها برمی گردد ، اما با همان ابعاد.

عملکرد Shape (شکل) ، هنگامی که ما داریم به ابعاد تصویر نگاه می کنیم بسیار مفید است ، در این جا ما برش این عملکرد shape را انجام داده ایم. بنابراین shape[:2] همه چیز را به نقاط تعیین شده می برد یعنی به نقاط مشخص شده ی دوم  می برد که از نظر ارتفاع و عرض تصویر به عنوان سومین نمایانگر مولفه ی  RGB تصویر است و ما در اینجا به آن احتیاجی نداریم.

import cv2
import numpy as np
image = cv2.imread('input.jpg')
B,G,R = cv2.split(image)
zeros=np.zeros(image.shape[:2],dtype="uint8")
cv2.imshow("RED",cv2.merge([zeros,zeros,R]))
cv2.imshow("Green",cv2.merge([zeros,G,zeros]))
cv2.imshow("Blue",cv2.merge([B,zeros,zeros]))
cv2.waitKey(0)
cv2.destroyAllWindows()

تبدیل عکس به مولفه فردی RGB

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

نمایش هیستوگرام تصویر ، روش تجسمِ اجزای تصاویر است.

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

import cv2
import numpy as np
#we need to import matplotlib to create histogram plots
import matplotlib.pyplot as plt
image=cv2.imread('input.jpg')
histogram=cv2.calcHist([image],[0],None,[256],[0,256])
#we plot a histogram, ravel() flatens our image array
plt.hist(image.ravel(),256,[0,256])
plt.show()
#viewing seperate color channels
color=('b','g','r')
#we know seperate the color and plot each in histogram
for i, col in enumerate (color):
    histogram2=cv2.calcHist([image],[i],None,[256],[0,256])
    plt.plot(histogram2,color=col)
    plt.xlim([0,256])
    plt.show()

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

بیایید عملکرد calcHist را با پارامترهای جداگانه اش دریابیم.

cv2.calcHist(images, channels, mask, histsize, ranges)

Images : تصویر منبع نوع unit 8 یا float 32 است. آن باید دربراکت های مربعی داده شود ، یعنی“[img]” ، که همچنین آرایه ی سطح دوم آن را نشان میدهد از آنجایی که یک تصویر برای opencv ، داده در فرم آرایه است.

Channels : این نیز همچنین در براکت های مربعی داده می شود. این شاخص کانال است که برای آن هیستوگرام را محاسبه می کنیم. به عنوان مثال اگر ورودی تصویر سیاه سفید است ، مقدار آن [0] است ، برای تصاویر رنگی می توانید برای محاسبه ی هیستوگرام کانال آبی ، سبز و قرمز به ترتیب [0] ، [1] یا [2] عبور دهید.

Mask : تصویر ماسک. برای پیدا کردن هیستوگرام عکس کامل ، آن به عنوان “none” داده شده است. اما اگر می خواهید هیستوگرام قسمت خاصی از تصویر را پیدا کنید ، باید یک تصویر ماسک را برای آن بسازید و آن را به عنوان ماسک بدهید.

Histsize : این نشان دهنده ی تعداد BIN ما است. برای مقیاس کامل که از آن می گذریم ، باید در براکت های مربعی داده شود [256] .

Ranges : ین رنج ( محدوده ی ) ماست ، به صورت نرمال [0.256] است.

ترسیم تصاویر و اشکال با استفاده از OpenCV

در زیر تعدادی مثال برای ترسیم خطوط ، مستطیل ، چندضلعی ، دایره و … در OpenCV وجود دارد.

import cv2
import numpy as np
#creating a black square 
image=np.zeros((512,512,3),np.uint8)
#we can also create this in black and white, however there would not be any changes
image_bw=np.zeros((512,512),np.uint8)
cv2.imshow("black rectangle(color)",image)
cv2.imshow("black rectangle(B&W)",image_bw)

ترسیم تصاویر و اشکال با استفاده از OpenCV

رسم خط در Open CV با پایتون

#create a line over black square
#cv2.line(image, starting coordinates, ending coordinates, color, thickness)
#drawing a diagonal line of thickness 5 pixels
image=np.zeros((512,512,3),np.uint8)
cv2.line(image,(0,0),(511,511),(255,127,0),5)
cv2.imshow("blue line",image)

رسم خط در Open CV با پایتون

رسم مستطیل در Open CV با پایتون

#create a rectangle over a black square
#cv2.rectangle(image,starting coordinates, ending coordinates, color, thickness)
#drawing a rectangle of thickness 5 pixels
image=np.zeros((512,512,3),np.uint8)
cv2.rectangle(image,(30,50),(100,150),(255,127,0),5)
cv2.imshow("rectangle",image)

رسم مستطیل در Open CV با پایتون

رسم دایره در Open CV با پایتون

#creating a circle over a black square
#cv2.circle(image,center,radius,color,fill)
image=np.zeros((512,512,3),np.uint8)
cv2.circle(image,(100,100),(50),(255,127,0),-1)
cv2.imshow("circle",image)

رسم دایره در Open CV با پایتون

رسم چند ضلعی در Open CV با پایتون

#creating a polygon
image=np.zeros((512,512,3),np.uint8)
#lets define four points
pts=np.array([[10,50], [400,60], [30,89], [90,68]], np.int32)
#lets now reshape our points in form required by polylines
pts=pts.reshape((-1,1,2))
cv2.polylines(image, [pts], True, (0,255,255), 3)
cv2.imshow("polygon",image)

رسم چند ضلعی در Open CV با پایتون

تایپ متن در Open CV با Python

#putting text using opencv
#cv2.putText(image,'text to display',bootom left starting point, font,font size, color, thickness)
image=np.zeros((512,512,3),np.uint8)
cv2.putText(image,"hello world", (75,290), cv2.FONT_HERSHEY_COMPLEX,2,(100,170,0),3)
cv2.imshow("hello world",image)
cv2.waitKey(0)
cv2.destroyAllWindows()

تایپ متن در Open CV با Python

ویژن رایانه (بینایی کامپیوتری) و OpenCV موضوعات بسیار گسترده ای هستند اما این راهنما نقطه شروع خوبی برای یادگیری OpenCV و پردازش تصویر خواهد بود.

نظرتان را در مورد این مطلب با ستاره دادن اعلام کنید امیدوارم این مطلب برای شما مفید بوده باشد. نظرات ، مشکلات و پیشنهادات خود را در پایین صفحه اعلام کنید

محمد رحیمی

محمد رحیمی هستم. سعی میکنم در آیرنکس مطالب مفید را قرار دهم. (در خصوص سوال در مورد این مطلب از قسمت نظرات همین مطلب اقدام کنید)

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا