حتما تا به حال زیاد شنیده اید که زبان پایتون یکی از محبوب ترین و پرکاربردترین زبان های برنامه نویسی دنیا است. اما دلیل آن را می دانید؟ دلیل این محبوبیت چیزی نیست جز نحو (Syntax) ساده و ابزار ها و کتابخانه های غنی. یکی از این کتابخانه ها در زمینه ویرایش تصاویر با پایتون که شاید تا به حال اسم آن را نشنیده باشید، کتابخانه Jupyter است.
در این آموزش ما قصد داریم تا یک عکس گوزن را به تصویری تبدیل کنیم که قابل رنگ آمیزی برای کودکان باشد. بدین صورت که ابتدا لبه ها یا خطوط مرزی اشیاء را استخراج کرده و سپس پس زمینه را سفید می کنیم.
نصب Jupyter
مانند نصب سایر کتابخانه ها، برای نصب این کتابخانه نیز مانند دستورات زیر عمل می کنیم:
1 2 3 4 5 |
$ python -V Python 3.8.5 $ pip install jupyterlab pillow # Installation process ommitted $ jupyter lab |
در این آموزش ما از یک تصویر گوزن به نام deer.jpg استفاده خواهیم کرد.
پس از نصب، باید آن کتابخانه را به برنامه خود اضافه کنیم:
1 |
from PIL import Image |
حالا می توانید با استفاده از تابع ()open تصاویر خود را باز کرده و آن اه را پردازش کنید.
1 |
pic = Image.open("deer.jpg") |
برای شروع کار خوب است تا اندازه تصویر را بدست آوریم:
1 |
pic.size |
که خروجی آن به شکل زیر است:
1 |
(3561, 5342) |
می بینید که اندازه تصویر خیلی بزرگ است. برای کوچک تر کردن ابعاد تصویر، از تابع ()resize استفاده می کنیم. کد زیر مقیاس تصویر مورد نظر را به 10 برابر کاهش می دهد.
1 2 3 4 |
x, y = pic.size x //= 10 y //= 10 smaller = pic.resize((x, y)) |
تصویر به شکل زیر خواهد بود:
حالا نوبت به لبه های آن را مشخص کنیم. ما می خواهیم تصویر را تمیز کنیم تا برای رنگ آمیزی آماده شود. خوشبختانه Jupyter دارای الگوریتمی به نام تشخیص لبه است که کار ما را ساده می کند. تصویر بالا برای الگوریتم تشخیص لبه این کتابخانه مناسب به نظر می رسد.
کار بسیار ساده است. کافیست تا آرگومان ImageFilter.FIND_EDGES را به متد ()filter بدهیم:
1 2 3 |
from PIL import ImageFilter edges = smaller.filter(ImageFilter.FIND_EDGES) |
خروجی به شکل زیر خواهد بود:
در این مرحله باید تمام جزئیات اضافی را از بین برده و خطوط واضحی بر جای می گذارد. رنگ تصویر کمی عجیب است اما مشکلی نیست. با استفاده از متد ()split تصویر را به نوار های رنگی تقسیم کرده و یکی از آن ها را انتخاب می کنیم:
1 2 |
bands = edges.split() bands[0] |
خروجی:
تصویر حالا بهتر و واضح تر شده است. اما برای رنگ آمیزی خوب نیست زیرا پس زمینه آن سیاه است. تمام کاری که لازم است انجام دهیم این است که رنگ های آن را معکوس کنیم. پیکسل ها باید یا سفید کامل باشند و یا سیاه کامل. با استفاده از یک عبارت lambada این شرط را به متد ()point می فرستیم تا پردازش انجام شود:
1 |
outline = bands[0].point(lambda x: 255 if x<100 else 0) |
خروجی:
تصویر نواحی اضافی زیادی دارد که باید آن ها را برش دهیم. با استفاده از متد ()cut تصویر مورد نظر خود را بیرون می آوریم:
1 |
outline.crop((10, 200, 300, 400)) |
خروجی:
حالا فقط باید از تصویر خروجی بگیریم. من آن را با فرمت PDF ذخیره می کنم تا برای چاپ راحت تر باشد:
1 |
outline.save("deer.pdf") |
کار ما تمام است!
دیدگاه ها
سوالات پیش از ثبت نام یا نظرات خود را در مورد این پست مطرح نمایید.