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


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

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


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


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


یا می‌توانیم با استفاده از لنزها این مشکل را برطرف کنیم، به ما این امکان را می دهد تا اندازه دیافراگم را کنترل کنیم و در عکاسی با نام 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 ذخیره می کند که به ما امکان می دهد عملیات بسیار قدرتمندی را به راحتی انجام دهیم.

برنامه نویسی پایه با قرار گرفتن در معرض سطح ریاضی دبیرستان ، وب کم ، پایتون 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

در این جا ما برخی فرمان های پایه ای و مجموعه ای از اصطلاحات برای استفاده از 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()


اکنون بیایید نگاهی بیاندازیم که چگونه تصاویر در 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()


راه ساده تر برای تبدیل تصویر تمام رنگی  به سیاه سفید ، فقط اضافه کردن 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 معمولاً در چاپگرهای جوهر افشان استفاده می شود.

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

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

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


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

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

فضای رنگی HSV

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

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

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


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


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

  • قرمز – (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 ترکیبی است.

تصویر کانال 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(&quotRed&quot,R)
cv2.imshow(&quotGreen&quot,G)
cv2.imshow(&quotBlue&quot,B)
#making the original image by merging the individual color components
merged=cv2.merge([B,G,R])
cv2.imshow(&quotmerged&quot,merged)
#amplifying the blue color
merged=cv2.merge([B+100,G,R])
cv2.imshow(&quotmerged with blue amplify&quot,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()


خروجی کنسول :

(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=&quotuint8&quot)
cv2.imshow(&quotRED&quot,cv2.merge([zeros,zeros,R]))
cv2.imshow(&quotGreen&quot,cv2.merge([zeros,G,zeros]))
cv2.imshow(&quotBlue&quot,cv2.merge([B,zeros,zeros]))
cv2.waitKey(0)
cv2.destroyAllWindows()


نمایش هیستوگرام تصویر با 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()


بیایید عملکرد 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(&quotblack rectangle(color)&quot,image)
cv2.imshow(&quotblack rectangle(B&W)&quot,image_bw)


رسم خط در 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(&quotblue line&quot,image)


رسم مستطیل در 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(&quotrectangle&quot,image)


رسم دایره در 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(&quotcircle&quot,image)


رسم چند ضلعی در 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(&quotpolygon&quot,image)


تایپ متن در 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,&quothello world&quot, (75,290), cv2.FONT_HERSHEY_COMPLEX,2,(100,170,0),3)
cv2.imshow(&quothello world&quot,image)
cv2.waitKey(0)
cv2.destroyAllWindows()


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


حالا که تا اینجا اومدید...

حتما یوتیوب رو ساب کنید و اینستاگرام هم دنبال کنید که آموزشای باحالی تو راهن?

کد های آموزش هارو هم می تونید توی گیت هاب تمشک پیدا کنید

راستی اگه دیسکورد دارین حتما تو سرور دیسکورد هم جوین بشید که برنامه ها داریم!

اگه این پست رو دوست داشتین لایک، کامنت و دنبال کردن انتشارات یادتون نره?


پ.ن:تشکر میکنم از گوگل عزیز؛ مامانم و کتاب های آموزش عکاسیش

© منابع : تمشک، ایرنکس