پردازش تصویر

آموزش پردازش تصویر OpenCV با رزبری پای – عملیات پایه روی تصاویر

opencv-with-raspberry-pi-image-processing-digispark
نوشته شده توسط آرش کدخدایی

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

 


عملیات پایه روی تصاویر


در این آموزش تمرکز ما بیشتر روی Numpy خواهد بود و می‌آموزیم که چگونه به مقادیر پیکسل تصاویر دسترسی پیدا کنیم و آنها را تغییر دهیم، چگونه به خواص تصویر دسترسی پیدا کنیم، ROI تصویر را تنظیم کنیم و چگونه تصاویر را از هم جدا و یا به هم ادغام کنیم.

 


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


ابتدا یک تصویر رنگی را بارگیری کنیم:

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

 

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

px = img[100,100]
print px
# خروجی: [۲۲۸ ۲۴۴ ۲۵۱]

# دسترسی فقط به شذت رنگ آبی
blue = img[100,100,0]
print blue
# خروجی: ۲۲۸

 

 

تغییر مقادیر پیکسل را به همان شیوه تغییر دهید:

img[100,100] = [255,255,255]
print img[100,100]
# خروجی: [۲۵۵ ۲۵۵ ۲۵۵]

 

روش دسترسی و ویرایش بهتر پیکسل:

# دسترسی به رنگ قرمز
img.item(10,10,2)
# خروجی: ۵۹

# تفییر رنگ قرمز
img.itemset((10,10,2),100)
img.item(10,10,2)
# خروجی: ۱۰۰

 

 

 


دسترسی به خواص تصویر


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

شکل تصویر توسط img.shape قابل دسترسی است. یک لیست از تعداد ردیف ها، ستون ها و کانال ها (اگر تصویر رنگی باشد) برگردانده میشود:

print img.shape
# خروجی: (۶۰۰۰, ۴۰۰۰, ۳)

 

تعداد کل پیکسل ها توسط img.size قابل دسترسی است:

print img.size
# خروجی: ۷۲۰۰۰۰۰۰

 

نوع داده تصویر توسط img.dtype بدست می آید:

print img.dtype
# خروجی: uint8

 

برخی از خطا ها در پایتون بخاطر نوع داده نامعتبر است که با این کد میتوانید نوع داده را چک کنید.

 


ROI تصویر


گاهی اوقات، شما باید با یک منطقه خاص از تصاویر کار کنید. به عنوان مثال برای تشخیص چشم در تصاویر ابتدا تشخیص چهره را در تصویر انجام میدهیم، سپس در داخل چهره، چشم ها را جستجو میکنیم. این رویکرد دقت را به دلیل کوچکتر کردن منطقه جستجو بهبود می بخشد. ROI با استفاده از شاخص Numpy بدست می آید. در اینجا یک توپ را انتخاب میکنیم و آن را در منتطقه دیگری از تصویر کپی میکنیم:

ball = img[280:340, 330:390]
img[273:333, 100:160] = ball

 


تقسیم و ترکیب کانال‌های تصویر


کانال های B، G، R در صورت نیاز می توانند به قسمت های جداگانه تقسیم شوند. سپس کانال های فردی را می توان با هم دوباره ترکیب کرد تا یک تصویر BGR را دوباره بسازند. به مثال دقت کنید:

b,g,r = cv2.split(img)
img = cv2.merge((b,g,r))
# یا
b = img[:,:,0]

در قسمت دوم برنامه اندیس سوم img رنگ را مشخص میکند که به ترتیب ۰ و ۱ و ۲ برابر آبی، سبز و قرمز هستند. فرض کنید شما می خواهید تمام پیکسل های قرمز را صفر کیند، شما نیازی به تقسیم کردن و برابر صفر قرار دادن قرمز نخواهید بود. شما می توانید به سادگی از Indexing Numpy استفاده کنید.

img[:,:,2] = 0

 


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


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

– تصویر ورودی
– قطر کادر در به ترتیب بالا، پایین، چپ و راست تصویر
– نوع کادر که عبارتند از:

  • cv2.BORDER_CONSTANT
  • cv2.BORDER_REFLECT
  • cv2.BORDER_REFLECT_101 یا cv2.BORDER_DEFAULT
  • cv2.BORDER_REPLICATE
  • cv2.BORDER_WRAP

– رنگ مرزی برای کادر نوع cv2.BORDER_CONSTANT در زیر یک کد نمونه برای نشان دادن انواع کادر است:

import cv2
import numpy as np
from matplotlib import pyplot as plt

BLUE = [255,0,0]

img1 = cv2.imread('img.png')

replicate = cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_REPLICATE)
reflect = cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_REFLECT)
reflect101 = cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_REFLECT_101)
wrap = cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_WRAP)
constant= cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_CONSTANT,value=BLUE)

plt.subplot(231),plt.imshow(img1,'gray'),plt.title('ORIGINAL')
plt.subplot(232),plt.imshow(replicate,'gray'),plt.title('REPLICATE')
plt.subplot(233),plt.imshow(reflect,'gray'),plt.title('REFLECT')
plt.subplot(234),plt.imshow(reflect101,'gray'),plt.title('REFLECT_101')
plt.subplot(235),plt.imshow(wrap,'gray'),plt.title('WRAP')
plt.subplot(236),plt.imshow(constant,'gray'),plt.title('CONSTANT')

plt.show()

 

 

 

در صورت نصب نبودن matplotlib با استفاده کد زیر در ترمینال آن را نصب کنید:

sudo apt-get install python-matplotli

 

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

 


پروژه و دریافت بن ارسال رایگان


برای دریافت بن خرید از دانشجو کیت، کاربران بایستی با استفاده از وسایل این آموزش، پروژه را اجرا کرده و یا حتی مدار جدیدی تعریف کنید. سپس از اجرای کار فیلم گرفته و در شبکه‌های اجتماعی از جمله آپارات و اینستگرام، با هشتگ‌های دیجی_اسپارک   دانشجوکیت    digispark    daneshjookit منتشر کنند. سپس از طریق بخش نظرات در ادامه همین آموزش، جهت دریافت بن خرید ارسال رایگان به ارزش ۱۲۰۰۰ تومان از دانشجو کیت، لینک را زیر همین پست ارسال کنید.

 

در پایان نظرات و پیشنهادات خود را با ما درمیان بگذارید و با اشتراک گذاری این آموزش در شبکه های اجتماعی , از وبسایت دیجی اسپارک حمایت کنید.

 

 

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

آرش کدخدایی

یک تازه کار علاقه مند به تکنولوژی :)

تبادل نظر و رفع عیب با ثبت دیدگاه

۳ دیدگاه