معرفی کتابخانه OpenCv بخش ۲
خب توی این پست ادامه مطالب مربوط به opencv رو توضیح میدم . توی این بخش بیشتر روی فیلتر ها و ماسک ها تمرکز می کنیم .
قدم اول مثل همیشه اضافه کردن کتابخونه ها و گذاشتن تصویر توی یک متغیر هست .
import cv2
import numpy as np
img = cv2.imread("shrek.jpg")
width, height = img.shape[:2]
img = cv2.resize(img, (int(height / 2), int(width / 2)))
cv2.imshow("shrek", img)
cv2.imwrite("res.jpg", img)
خط چهارم طول و عرض تصویر رو در میاره و خط پنجم ابعاد تصویر رو تغییر میده من برای این اینکارو کردم که سایز اصلی تصویر خیلی بزرگ بود برای همین ابعاد تصویر رو نصف کردم .
خط بعدی هم تصویر رو نمایش میده و خط آخر هم تصویر رو ذخیره می کنه .
خروجی res.jpg به شکل زیر میشه :
بخش بعدی خاکستری کردن تصویر هست که به شکل زیر پیاده سازی میشه
imgGray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
cv2.imshow('grayshrek',imgGray )
cv2.imwrite("grayres.jpg", imgGray)
پارامتر هایی که تابع cvtColor میگره یکی تصویر ورودی هستش و دیگری تبدیلی هست که قراره انجام بشه که تو این مثال از رنگی به خاکستری هست . این نکته رو هم اضافه بکنم که توی opencv به جای RGB ترتیب رنگ ها BGR هستش .
دو خط بعدی هم مثل بالایی نشون میده و ذخیره می کنه .
خروجی grayres.jpg :
بخش بعدی مات کردن تصویر هست که به شکل زیر پیاده سازی میشه .
imgBlur = cv2.GaussianBlur(imgGray, (17,17), 0)
cv2.imshow('blurres',imgBlur )
cv2.imwrite("blurres.jpg", imgBlur)
برای مات کردن تصویر از تابع GuassianBlur استفاده میشه که سه تا پارامتر اصلی اون یکی تصویر ورودی هست بعدیش اندازه کرنل هست که کارش اینه که شدت مات کردن رو تعیین می کنه هرچه قدر بیشتر باشه ٬ بیشتر تصویر مات میشه اندازه کرنل هم باید به شکل یه تاپل دوتایی مقادیر فرد یکسان داده بشه .
خروجی blurres.jpg :
تابع بعدی canny هست که کارش پیدا کردن لبه های تصویر هست یعنی پیکسل هایی که کنتراست زیادی با هم دیگه دارند
imgCanny = cv2.Canny(img, 100, 50)
cv2.imshow("canny", imgCanny)
cv2.imwrite("cannyres.jpg", imgCanny)
پارامتر اول تصویر ورودی هست و دو تا پارامتر بعدی میزان threshold یا گذردهی رو تعیین می کنه . اگه با پارامتراش بازی کنید به فهمش خیلی کمک می کنه .
خروجی cannyres :
تابع بعدی dilate هست که کارش اتساع یا پهن کردن خطوط و لبه هایی هستند که توسط canny ایجاد شده .
kernel = np.ones((5,5), np.uint8)
imgDialation = cv2.dilate(imgCanny, kernel, iterations=1)
cv2.imshow("dialation", imgDialation)
cv2.imwrite("dialres.jpg", imgDialation)
برای مقداردهی به تابع dilate ابتدا میبایست یک هسته kernel تعریف کرد. در این مثال این هسته یک ماتریس ۵ در ۵ می باشد که همه مقادیر آن یک میباشد و وظیفه آن ٬ تشدید مقادیر تصویر ورودی است . پارامتر سوم تابع dilate تعداد چرخش هایی تصویر ورودی در هسته ای که ساختیم را تعیین می کند که هرچه قدر بیشتر باشد ٬ تصویر خروجی شدت بیشتر دارد .
خروجی dialres.jpg :
اخرین تابع erosion یا فرسایش هست که برعکس تابع dilate عملکرده و ویژگی هارا کاهش میدهد .
imgErode = cv2.erode(imgDialation, kernel, iterations=1)
cv2.imshow("er", imgErode)
cv2.imwrite("eroderes.jpg", imgErode)
پارامتر های erosion همانند dilate هست چون عمل عکس اونو انجام میده.
خروجی eroderes.jpg :
خب تو این پست سعی کردم یه سری از تابع های اصلی که استفاده زیاده ازشون توی فیلتر کردن تصاویر میشه رو یه توضیح مختصری داده باشم اما ممکنه براتون سوال پیش اومده باشه که اینا اصن به چه کاری میاد که توی پست های بعدی سعی می کنم یه مثال عملی رو پیاده کنم .
مطلبی دیگر از این انتشارات
Garage چیست؟ 0 تا 100 پلتفرم آموزشی گوگل در 2022
مطلبی دیگر از این انتشارات
تعلق
مطلبی دیگر از این انتشارات
تجربه کاری من با ریداکس و context