Hesam Mohebi
Hesam Mohebi
خواندن ۴ دقیقه·۲ سال پیش

معرفی کتابخانه OpenCv بخش ۴

توی این بخش یه نگاهی می کنیم به مختصات پیکسل ها ٬ اندازه و برش تصویر و چیزای دیگه

خب اولین نکته اینکه توی تصاویر مختصات هر پیکسل برعکس محور مختصات که از گوشه پایین سمت چپ شروع میشه از گوشه بالای چپ شروع میشه یعنی بالا چپ میشه مختصات (0,0) و پایین راست میشه اندازه پهنا و ارتفاع عکسمون .

img = cv2.imread(&quotimage.jpg&quot) print(img.shape) >> (816, 1400, 3)

خب کاری که تابع shape انجام میده اینه که یه تاپل سه تایی بهمون میده که مقدار اول ارتفاع تصویر٬ دومی پهنا و سومی چنل هایی هستند که تصویر داره که تو این مثال BGR هست .

تابع بعدی که قبلا هم در موردش گفته بودم resize هست که اندازه تصویر رو میشه تغییر داد باهاش .

imgResize = cv2.resize(img, (300, 200)) print(imgResize.shape) >> (200, 300, 3)

پارامتر های این تابع عکس ورودی و پهنا و ارتفاع مدنظر هست و همینطوری که میبینید وقتی اندازه تصویر جدید رو چاپ می کنیم همون مقادیر رو میده (اینکه چرا برای تغییر اندازه اول پهناست بعد ارتفاع و وقتی اندازه رو می خوایم نشون بدیم برعکسه نمیدونم والا به نظرم خیلی مسخرست ! )

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

imgCropped = img[125:575,500:925]

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

تصویر اولیه

و چیزی که بریده شده ازش :‌

خب موضوع بعدی ساختن ماتریس هست . یک ماتریسی که همه مقادیرش صفر باشه مشکیه و برعکس ماتریسی که همه مقادیرش یک باشه سفیده .

black = np.zeros((512, 512)) cv2.imshow(&quotblack&quot, black) print(black) >>> [[0. 0. 0. ... 0. 0. 0.]
[0. 0. 0. ... 0. 0. 0.]
[0. 0. 0. ... 0. 0. 0.]
...
[0. 0. 0. ... 0. 0. 0.]
[0. 0. 0. ... 0. 0. 0.]
[0. 0. 0. ... 0. 0. 0.]]

همونطور که میبیند وقتی ماتریس black رو چاپ می کنیم همه مقادریش صفر هست و خروجی تصویر به این شکل میشه :‌

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

white = np.ones((512,512)) cv2.imshow(&quotwhite&quot, white) print(white) >>> [[1. 1. 1. ... 1. 1. 1.]
[1. 1. 1. ... 1. 1. 1.]
[1. 1. 1. ... 1. 1. 1.]
...
[1. 1. 1. ... 1. 1. 1.]
[1. 1. 1. ... 1. 1. 1.]
[1. 1. 1. ... 1. 1. 1.]]

خب عکس هایی که ساختیم توی مقیاس خاکستریه و چنل های رنگی آبی ٬ سبز و قرمز ندارند .

برای اینکه رنگیش کنیم باید ببریمشون توی مقیاس BGR برای اینکار داریم :‌

black = np.zeros((512, 512,3), np.uint8) black[:] = 0,255,0 cv2.imshow(&quotblack&quot, black)

اگه دقت کنید میبیند که یه پارامتر سه اضافه شده که چنل های رنگی رو اضافه می کنه و نوع اعدادشم اینتیجر ۸ بیت گذاشتیم . خط بعدهم کاری که می کنه چنل سبز رو تا ته زیاد می کنه و نهایتا تصویری که داریم به این شکله :‌

حالا یه نکته دیگه اگه دقت کنید خط دوم توی براکت متغییر black یه دو نقطه بیشتر نیست و اگه یکم تو پایتون با مفهوم آرایه آشنا باشیم میفهمیم که دو نقطه خالی یعنی از اول تا آخر یه آرایه واسه همین اگه بخوایم مثلا میگم یه بخشی از تصویر رو رنگ قرمز کنیم همچین چیزی داریم :‌

black[100:250, 200:500] = 0,0,255 cv2.imshow(&quotblack&quot, black)

تابع بعدی تابع کشیدن خطه که در کنار مستطیل و دایره کشیدن جز تابع های مهم نوشتاری هستند .

به این شکل مقدار دهی میشه ‌:

black = np.zeros((512, 512,3), np.uint8) black[:] = 0,0,255 cv2.line(black, (0,0), (512,512), (255,0,0), 3) cv2.imshow(&quotblack&quot, black)

توی خط سوم پارامترا به این ترتیب هست :‌ تصویر ورودی ٬ مختصات شروع خط ٬ مختصات پایان خط ٬ رنگش و کلفت بودنش که خیلی مهمه :)

الان تصویری که داریم یه خط از اول تا آخرش کشیده :

تابع بعدی تابع مستطیل کشیدنه که پارامتراش مثل خطه واسه همین داریم :

cv2.rectangle(black, (200, 200), (300, 450), (125,125,0), 5)

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

cv2.rectangle(black, (200, 200), (300, 450), (125,125,0), cv2.FILLED)

دایره هم به همین شکل منتهی به جای اینکه ما ابتدا و انتهارو مشخص کنیم مرکز و شعاع رو مشخص می کنیم

cv2.circle(black, (270,250), 25, (100,15, 200), 3)

و اخرین تابع هم اضافه کردنه متنه که اینجوری پارامتراش مشخص میشه تقریبا همونه فقط یه فونت داره و اندازه .

cv2.putText(black, &quotShrek is love&quot, (200, 250),cv2.FONT_HERSHEY_SIMPLEX, 1, (0,255,0), 4)

خب اینم از مطالب این پست امیدوارم مفید بوده !

اگه سوالی داشتید میتونید سرچ کنید :)


برنامه نویسیپردازش تصویرپایتونopencvهوش مصنوعی
شاید از این پست‌ها خوشتان بیاید