کتابخانه Pillow در پایتون برای پردازش تصویر – به زبان ساده
کتابخانه Pillow در پایتون، نسخه گسترشیافته «Python Imaging Library) «PIL) است. این کتابخانه برای خواندن، ذخیرهکردن، دستکاری و پردازش تصاویر در پلتفرمهای مختلفی مانند ویندوز، لینوکس و مک مورد استفاده قرار میگیرد. پایتون، زبانی بسیار قدرتمند با سینتکس آسان و یادگیری ساده است. این زبان در بیشتر علوم و زمینههای آزمایشگاهی و تحقیقاتی، کاربرد دارد. دستکاری و پردازش تصاویر یکی از مواردی است که پایتون در آن بسیار خوب عمل میکند. برای این کار، کتابخانههای «Pillow» و «OpenCV» و «Scikit-image» و چند مورد دیگر ارائه شدهاند.
- در این مطلب، ابتدا به طور کلی با کتابخانه Pillow و قابلیتهای اصلی آن آشنا میشوید.
- سپس کدهای مربوط به رسم چند شکل هندسی ساده به کمک ماژول Pillow را یاد میگیرید.
- با چند مورد از فیلترهای کاربردی Pillow برای کار بر روی تصاویر آشنا میشوید.
- با کمک بررسی چند مثال ساده روش انجام عملیات رایج بر روی تصاویر را میآموزید.
- روش اجرای وارونگی رنگ و لبهیابی را به صورت دستی و با کدنویسی یاد میگیرید.
- متوجه میشود که چطور در پایتون هیستوگرام رنگهای تصویر را رسم کنید.


در این مطلب از مجله فرادرس با کتابخانه Pillow آشنا میشویم. ابتدا این کتابخانه را معرفی میکنیم. بعد از آن کمی درباره پردازش تصویر توضیح میدهیم. سپس با کمک مثالهای سادهای چند تابع مختلف را برای رسم اشکال هندسی به کار میبریم. در پایان هم روش کار بر روی تصاویر، اعمال فیلترهای مختلف و مفاهیمی مانند وارونگی رنگ، لبهیابی و غیره را بررسی میکنیم.
کتابخانه Pillow در پایتون
کتابخانه PIL در سال ۱۹۹۵ توسط آقای «فردریک لانچ» (Fredrik Lundh) برای انجام عملیات تخصصی بر روی تصاویر توسعه داده شد. بعد از او عدهای از برنامه نویسان توسعه این کتابخانه را ادامه دادند و نام آن را Pillow گذاشتند. این کتابخانه به صورت اوپن سورس، به وسیله زبانهای «C» و «Python» نوشته شده است و سرعت مناسبی دارد. Pillow تقریبا از تمام فرمتهای مهم تصویری پشتیبانی میکند. برای مثال میتوان به «Png» و «Jpg» و غیره اشاره کرد.
یکی از مهمترین حوزههای کاربرد کتابخانه Pillow مربوط به پردازش تصویر است. پردازش تصویر در زمینههای مختلفی مانند صنعت، پزشکی، نظامی، علمی و امنیتی کاربردهای زیادی دارد. به طور خلاصه و مختصر، پردازش تصویر شامل عملیاتی است که با اجرای آنها بتوانیم مجموعه دادههای مشخصی را از تصویر استخراج کنیم.
این کتابخانه برای انجام وظایفی مانند پرازش تصویر، تواناییهای ویژهای دارد. بعضی از مهمترین قابلیتهای کتابخانه Pillow را در فهرست پایین نوشتهایم.
- کار بر روی پیکسلهای تصویر
- شفافیت
- فیلترگذاری بر روی تصاویر
- لبهیابی
- افزودن متن
- افزودن کاراکترهای خاص به تصاویر
- و غیر

برای نصب Pillow در پایتون میتوانیم از دستور زیر در خط فرمان یا ترمینال سیستم عامل استفاده کنیم.
pip install Pillowدر بخش بعدی با مفهوم پردازش تصویر در کتابخانه Pillow آشنا میشویم.
پردازش تصویر با کمک کتابخانه Pillow در پایتون
کتابخانه Pillow یکی از ابزارهای کاربردی پایتون برای اجرای وظایف مربوط به پردازش تصویر است. به طور کل به فرآیند تغییر و تجزیه و تحلیل تصاویر دیجیتال با هدف استخراج اطلاعات مفید یا بهبود کیفیت آنها پردازش تصویر گفته میشود. این عملیات از طریق دستکاری پیکسلها اتفاق میافتد. به کوچکترین جزء ساختاری در تصاویر دیجیتال، پیکسل گفته میشود.
هر پیکسل به صورت جداگانه صفاتی مانند نور، رنگ و شفافیت دارد. این موارد را میتواند به شکل مجزا برای پیکسلهای مختلف برنامهریزی کرد. پیکسلها از دو سیستم رنگ زیر پیروی میکنند.
- RGB: این سیستم رنگ بر اساس سه رنگ اصلی «قرمز» (Red)، «سبز» (Green) و «آبی» (Blue) طراحی شده است.
- CMYK: نام این سیستم رنگی مخفف «فیروزهای» (Cyan)، «سرخرنگ» (Magenta)، «زرد» (Yellow) و «مشکی» (Key) است. در این سیستم، رنگها با ترکیب این چهار رنگ اصلی ایجاد میشوند.

انواع فرمتهای عکسها را بر اساس حجم و امکان کپیشدن فایلها به دستههای مختلفی تقسیم میکنند. در فهرست پایین مهمترین فرمتهای عکس را معرفی کردهایم.
- JPG
- PNG
- GIF
- BMP
تا به اینجای مطلب شناخته اولیه خوبی با کتابخانه Pillow و پردازش تصویر بدست آوردید. در ادامه توضیحات مفصلتری درباره قابلیتهای Pillow دادهایم. در صورت علاقه به مطالعه این دست مطالب، پیشنهاد میکنیم حتما از اپلیکیشن مجله فرادرس استفاده کنید.
برای نصب اپلیکیشن رایگان مجله فرادرس، کلیک کنید.
چهار مفهوم اصلی درباره تصویر و پردازش آن وجود دارد.
- اگر داده ورودی به سیستم و خروجی از آن هر دو از نوع تصویر باشند، به این عملیات «پردازش تصاویر دیجیتال» (Digital Image Processing) گفته میشود.
- اگر داده ورودی به سیستم از نوع تصویر باشد، اما دادههای خروجی از آن توضیحات یا توصیفات متنی تصویر باشند به آن «بینایی ماشین» (Machine Vision) گفته میشود.
- اگر داده ورودی از نوع توضیحات و داده خروجی از سیستم تصویر باشد به آن «گرافیک کامپیوتر» (Computer Graphics) گفته میشود.
- اما اگر داده ورودی به سیستم از نوع توضیحات بوده و داده خروجی هم «توضیح» باشد، این فرایند به طور معمول در دسته «هوش مصنوعی» و یادگیری ماشین قرار میگیرد.

در دستهبندی بالا از دو مفهوم بینایی ماشین و پردازش تصویر به طور خاص نام برده شده است. بیشتر اوقات این دو مفهوم با همدیگر یکی در نظر گرفته میشوند. اما در واقع هر کدام از آنها به رشته خاصی اشاره میکنند. بنابراین این دو مفهوم با همدیگر تفاوت دارند.
- پردازش تصویر: یکی از شاخههای پرکاربرد در هوش مصنوعی است. با این تکنیک به کامپیوترها کمک میکنیم تا خودشان تصویر را درک کرده و حتی کدگذاری کنند. برای این عملیات لازم نیست که ماشین به دوربین مجهز باشد. با کمک اسکنر یا فایل یا روشهای دیگر هم میتوان تصاویر را به ماشین ارسال کرد و نتیجه را بدستآورد. پردازش تصویر در حوزههایی مانند زمینشناسی، نقشهکشی، تشخیص بیماریها، ترمیم عکسهای قدیمی، شهرسازی، تحلیل عکسهای ماهوارهای و غیره به کار برده میشود.
- بینایی ماشین: به عملیاتی گفته میشود که در طی آن کامپیوتر قادر به دیدن و تفسیر تصاویر محیط پیرامون خود است. در حقیقت بینایی ماشین از پردازش تصویر برای شناخت بهتر محیط پیرامون خود استفاده میکند. یکی از تفاوتهای مهم این دو آن است که بینایی ماشین در سطوح پیشرفته حتی توانایی پیشبینی حرکات احتمالی آینده را هم دارد. بینایی ماشین در حوزههایی مانند درک تصاویر بارگذاری شده در شبکههای اجتماعی، تشخیص چهره، بهداشت و درمان، کاربردهای فضایی، خودروسازی، صنعت و کنترل کیفیت و غیره کاربرده دارد.
| حوزه | تعریف کوتاه | کاربردها |
|---|---|---|
| پردازش تصویر | درک و پردازش تصویر توسط کامپیوتر | پزشکی، نقشهکشی، ترمیم عکس، تصاویر ماهوارهای |
| بینایی ماشین | تفسیر تصویر و محیط اطراف | تشخیص چهره، خودرو، صنعت، شبکههای اجتماعی |
چطور با کمک فرادرس پردازش تصویر در پایتون را یاد بگیریم؟
وبسایت آموزشی فرادرس، مجموعه کاملی از فیلمهای آموزشی پردازش تصویر را با کمک تکنولوژی پایتون طراحی و تولید کرده است. پردازش تصویر، کاربردهای متنوعی در زمینههای مختلف مانند فنی، صنعتی، شهری، پزشکی و علمی دارد. این مسئله، آن را به موضوعی بسیار مهم در حوزههای مختلف تجاری و پژوهشی تبدیل کرده است. یکی از مهمترین وظایف توسعهدهندگان نرمافزارهای این رشته، انجام محاسبات مختلف بر روی تصاویر است. بهترین ابزار برای انجام این محاسبات، زبان برنامه نویسی پایتون است. این زبان یادگیری ساده و کتابخانههای تخصصی و قدرتمندی دارد.

به همین دلیل فرادرس سعی کرده است که بهترین آموزشهای این حوزه را جمعآوری کرده و در اختیار علاقهمندان قرار بدهد. فیلمهای تولید شده توسط فرادرس از مراحل ابتدایی تا پیشرفته را آموزش میدهند. بنابراین دانشجویان با مشاهده و بررسی این فیلمها میتوانند خود را برای تصدی شغلهای مربوط به تخصص پردازش تصویر و بینایی ماشین آماده کنند.
در پایین چند مورد از فیلمهای مجموعه آموزش پردازش تصویر در پایتون را معرفی کردهایم. برای آشنایی با سایر فیلمها بر روی تصویر بالا کلیک کنید.
- فیلم آموزشی مقدماتی پردازش تصویر با «اپن سی وی» (OpenCV) در «پایتون» (Python) + گواهینامه
- فیلم آموزشی پیاده سازی سیستم تشخیص پلاک ماشین با پایتون به صورت گامبهگام و عملی + گواهینامه
- فیلم آموزشی پروژه محور پایتون، پیاده سازی بینایی ماشین با کتابخانه MediaPipe
- فیلم آموزشی پردازش تصویر با پایتون با کمک کتابخانه NumPy + گواهینامه
- فیلم آموزشی ناحیه بندی تصاویر در پایتون همراه با ارزیابی روش های مختلف
در بخش بعدی مطلب، روش رسم چند شکل هندسی ساده را با کمک کتابخانه Pillow بررسی میکنیم.
رسم اشکال هندسی
از کتابخانه Pillow هم میتوانیم برای رسم اشکال هندسی در پایتون استفاده کنیم. البته با کمک کتابخانههای مختلفی میتوان این کار را انجام داد. هر کتابخانه، کاربرد مخصوص به خود را دارد.
رسم دایره
در کادر پایین نمونهای از اشکال هندسی ساده را با استفاده از Pillow رسم کردهایم.
بعد از اجرای کدهای بالا خروجی پایین به عنوان تصویر نمونه ساخته خواهد شد. این تصویر در آدرسی ذخیره میشود که در لحظه اجرای اسکریپت کنسول پایتون آن را نشان میدهد.

توجه کنید که در خط دوم، سایز کلی بوم به اندازه ۲۰۰*۲۰۰ پیکسل تعیین شده است. در نتیجه نباید اندازه شکل بیش از این مقدار باشد، وگرنه چیزی در تصویر قابل تشخیص نخواهد بود.
رسم مستطیل
در کادر پایین میخواهیم مستطیل رسم کنیم. توجه کنید برای مشخص کردن رنگ داخل مستطیل دو روش مختلف وجود دارد.
- هم میتوانیم از نام رنگ به طور خاص استفاده کنیم.
- هم اینکه برای رسیدن به نتیجه دقیقتر میتوانیم کد رنگی متناسب با آن را بنویسیم.
در بخش قبل رنگ قرمز را با نام 'red' تعریف کردیم. در این بخش از کد برای مشخص کردن رنگ استفاده میکنیم.
پارامتر quality بر روی کیفیت مربوط به تصویر اثر میگذارد.

رسم بیضی با کتابخانه Pillow در پایتون
در کد پایین میخواهیم با کمک کتابخانه Pillow در پایتون، شکل بیضی رسم کنیم.
این کد هم مانند کدهای بالاست. با این تفاوت که اندازه بوم نسبت به شکل دایره بزرگتر شده است. به کمک پارامتر outline رنگ مشکی را به عنوان خط دور شکل رسم کردهایم. با تغییر دادن مقدار اعداد داخل تاپل میتوان از رنگهای مختلف استفاده کرد. محل ذخیرهسازی تصویر در همان محلی است که نشانگر خط فرمان در زمان اجرای کد نشان میدهد.

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

برای وضوح بیشتر در تصویر بالا خودمان نقاط را پررنگتر و درشتتر کردهایم. در صورت اجرای این کد در کامپیوتر شما نقاط کمرنگتر و ریزتر خواهند بود. در بخش بعدی روشهای دستکاری تصاویر با کتابخانه Pillow را یاد میگیریم.
کار بر روی تصاویر با کتابخانه Pillow در پایتون
در این بخش از مطلب روش پیادهسازی چند عملیات رایج و پرکاربرد بر روی تصاویر دیجیتالی را با کمک کتابخانه Pillow بررسی میکنیم.
در جدول پایین، این عملیات را همراه با متدهای کاربردی و توضیح مختصر معرفی کردهایم.
| عملیات | متد / ابزار | توضیح کوتاه |
|---|---|---|
| ذخیره همراه با تغییر فرمت تصویر | save() | ذخیره تصویر با فرمت جدید |
| تغییر اندازه تصویر | resize() | تغییر عرض و ارتفاع تصویر |
| برش تصویر | crop() | بریدن بخشی از تصویر با مختصات مشخص شده |
| چرخاندن تصویر | rotate() | چرخش تصویر با زاویه دلخواه |
| قرینه افقی | FLIP_LEFT_RIGHT | قرینه کردن از چپ و راست |
| قرینه عمودی | FLIP_TOP_BOTTOM | قرینه کردن از بالا به پایین |
| ساخت تصویر بندانگشتی | thumbnail() | ساخت نسخه کوچک تصویر |
| تغییر کیفیت تصویر | save(quality=…) | کاهش یا افزایش کیفیت ذخیره |
| نوشتن متن روی تصویر | ImageDraw.text() | درج متن با مختصات و رنگ |
| درج تصویر روی تصویر | paste() | افزودن واترمارک یا لوگو |
تمام عملیات جاری در این مطلب بر روی تصویر زیر اجرا خواهند شد.

تغییر فرمت عکسها
یکی از رایجترین عملیات بر روی عکسها تغییر فرمت است. با این کار میتوانیم قالب ذخیرهسازی تصاویر مختلف را عوض کنیم. به کدهای پایین توجه کنید.
عکس اصلی در فرمت PNG ساخته شده است. با کمک کدهای بالا به سادگی نسخهای از این عکس با فرمت JPG ایجاد میکنیم. با کمک متد save() میتوان نسخهای از عکس را در هر فرمت دلخواه ذخیره کرد.
نکته: توجه کنید که برای باز کردن عکس از متد open() استفاده کردهایم. در این متد باید آدرس دقیق عکس داده شود. در اینجا چون فایل کدهای پایتون و عکس در داخل دایرکتوری یکسان قرار داشتند، فقط نام عکس را نوشتیم. اگر عکس در دایرکتوری به غیر از فایل کدها ذخیره شده بود، باید آدرس کامل آن را مینوشتیم.
تغییر اندازه عکس
برای تغییر اندازه عکسها میتوانیم از متد resize() استفاده کنیم. در کدهای پایین، اندازه عکس مورد نظر را کوچکتر کردهایم.
بعد از نوشتن کدهای بالا، تصویر به شکل زیر نمایش داده میشود.

در فهرست پایین نکات مهم کد بالا را یادداشت کردهایم.
- برای باز کردن تصویر از متد open() استفاده کردهایم.
- سپس با کمک متد resize() اندازه تصویر را کوچکتر کرده و آن را در متغیر new قرار دادیم.
- از متد .show() برای نمایش تصویر استفاده کردیم. تصویر بالا به دلیل استفاده از این متد ظاهر شده است.
- با کمک دستور print(new.size) هم اندازه تصویر را در کنسول پایتون چاپ کردیم این مقدار به صورت (250, 250) نمایش داده میشود. توجه کنید که این اندازه قبلا مشخص شده بود اما با کمک این متد میتوانیم اندازه تصاویری را بدست بیاوریم که از از قبل اطلاعی درباره آنها نداریم.

برش دادن عکس
برای برش دادن تصویر میتوانید از تابع crop() استفاده کنید. در این روش ابتدا محدودهای مشخص میشود که تصویر باید بر اساس آن برش داده شود. این محدوده به صورت تاپل و با ترتیب مختصات چپ، بالا، راست و پایین تعریف میشود.
نکات مهم کدهای بالا را در فهرست پایین نوشتهایم:
- در این کدها بعد از باز کردن عکس (خط ۲) و قرار دادن آن در متغیر image کادر مورد نظر را (در خط ۳) برای برش مشخص کردیم. این کادر به صورت تاپلی در داخل متغیر box ذخیره شده است.
- سپس با کمک متد crop() تصویر را در داخل کادر مشخص شده برش زدیم.
- با کمک دستور show() عکس زیر نمایش داده میشود.
- از دستور .convert('RGB') برای تبدیل حالت عکس به RGB استفاده کردهایم. اگر میخواستیم عکس را با فرمت PNG ذخیره کنیم نیازی به نوشتن این دستور نبود.
- در انتها هم عکس را در فرمت Croped_image.jpg ذخیره کردهایم.

با تغییر دادن اندازه box میتوانید تاثیر این اعداد را در تصویر برش داده شده مشاهده کنید.
چرخاندن تصویر
برای چرخاندن تصویر میتوانیم از متد rotate() استفاده کنیم. در کادر پایین، عکس مورد نظر را ۴۵ درجه چرخاندهایم.
بعد از اجرای کدهای بالا تصویر زیر نمایش داده شده و سپس با نام rotated_image.jpg در کامپیوتر ذخیره میشود.

عدد 45 نشان دهنده زاویه چرخش در جهت خلاف عقربههای ساعت است. با تغییر دادن این عدد میتوان مقدار چرخش عکس را تنظیم کرد.
قرینه کردن تصویر
برای قرینه کردن تصویر میتوانیم از متد transpose() استفاده کنیم. این متد کاربردهای دیگری مانند چرخاندن ۱۸۰ درجه هم دارد. به منظور استفاده صحیح از آن باید با پارامترهای قابل پذیرش توسط متد transpose() آشنا شوید.
بعد از اجرای کدهای بالا خروجی به شکل زیر بر روی صفحه نمایش ظاهر شده و در کامپیوتر ذخیره میشود.

در ضمن با تغییر دادن پارامتر متد transpose() میتوانیم این تصویر را بالا به پایین نیز قرینه بکنیم.
بعد از اجرای کدهای بالا خروجی به شکل زیر بر روی صفحه نمایش ظاهر شده و در کامپیوتر ذخیره میشود.

ساخت تصویر بند انگشتی یا Thumbnail
گاهی از اوقات برای ذخیره تصویر در پایگاه داده یا حتی نمایش آن در گوشه مطالب سایت و غیره لازم است که از نسخه بندانگشتی تصویر استفاده کنیم. با کمک کدهای زیر میتوان نسخه «Thumbnail» از تصویر را ساخت.
بعد از اجرای کدهای بالا خروجی به شکل زیر بر روی صفحه نمایش ظاهر شده و در کامپیوتر ذخیره میشود.

توجه کنید که قبل از ساخت تصویر بندانگشتی لازم است اندازه آن را مشخص کنیم. این کار با دستور max_size = (100,100) انجام شده است. عبارت max_size در اینجا اختیاری است. میتوانیم هر مقداری بهجای آن قرار بدهیم. اما اندازه باید به صورت تاپل و به پیکسل نوشته شود. حتی اگر بخواهیم اندازه تصویر با مستقیم به متد thumbnail() بدهیم باز هم باید آن را به شکل تاپل myimage.thumbnail((100,100)) بنویسیم.
تغییر کیفیت تصویر
برای تغییر دادن کیفیت عکس فقط کافی است که در زمان ذخیرهسازی تصویر از پارامتر quality استفاده کنیم. در کادر پایین، عکس اصلی را با ۴ کیفیت مختلف ذخیره کردهایم.
بعد از اجرای کدهای بالا خروجی به شکل زیر بر روی صفحه نمایش ظاهر شده و در کامپیوتر ذخیره میشود.

- اگر از کد myimage.save('quality-25.jpg',quality = 25) استفاده کنیم، تصویر به صورت زیر نمایش داده شده و ذخیره میشود.

- اگر از کد myimage.save('quality-5.jpg',quality = 5) استفاده کنیم، تصویر به صورت زیر با کیفیت پایینتر نمایش داده شده و ذخیره میشود.

- و اگر از کد myimage.save('quality-1.jpg',quality = 1) استفاده کنیم، تصویر به صورت زیر با کمترین کیفیت نمایش داده شده و ذخیره میشود.

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

در کدهای بالا ابتدا تصویر را به ابزار ImageDraw ارسال کردهایم. در این ابزار با کمک متد text() متن خود را بر روی عکس مینویسیم. این متد ۳ پارامتر دریافت کرده است.
- پارامتر اول: مختصات متن است. با دستکاری آن میتوانید متن خود را بر روی عکس جابهجا کنید.
- پارامتر دوم: همان متنی است که باید نوشته شود.
- پارامتر سوم: هم رنگ متن است.
درج عکسی بر روی عکس دیگر
درج عکسی بر روی عکس دیگر بیشتر از همه زمانی به کار برده میشود که بخواهیم بر روی عکسهای خود واترمارک قرار بدهیم. گاهی از اوقات از این تکنیک در وبسایتها یا مطالب مختلف استفاده میشود. البته روشهای دیگری هم برای درج واترمارک بر روی تصاویر وجود دارند. هدف ما در این بخش بررسی تکنیک انجام این کار با کمک کتابخانه Pillow است. به منظور آشنایی با بهترین روشهای انجام این عملیات میتوانید مطلب مربوط به آن را در مجله فرادرس مطالعه کنید.
بعد از اجرای کدهای بالا خروجی به شکل زیر بر روی صفحه نمایش ظاهر شده و در کامپیوتر ذخیره میشود.

اعمال فیلتر بر روی تصاویر
یکی دیگر از رایجترین عملیات در زمان کار با تصاویر مربوط به استفاده از فیلترهای مختلف است. این فیلترها با هدف استخراج اطلاعات و جزئیات بیشتر از تصاویر به کار برده میشوند. برای بررسی کاملتر این فیلترها پیشنهاد میکنیم که فیلم آموزش رایگان بررسی سایر فیلترها در کتابخانه Pillow برای پردازش تصویر در پایتون را در فرادرس مشاهده بکنید. به منظور کمک به مخاطبان مجله، لینک دسترسی به این فیلم را در پایین نیز قرار دادهایم.
در جدول پایین مجموعهای از فیلترها را معرفی کردهایم. این فیلترها در این بخش از مطلب مورد بررسی قرار میگیرند.
| نام فیلتر | کاربرد اصلی | نتیجه روی تصویر |
|---|---|---|
| SHARPEN | افزایش شفافیت | ظهور واضحتر جزئیات |
| SMOOTH | کاهش نویز | تصویر نرمتر |
| SMOOTH_MORE | کاهش نویز بیشتر | جزئیات کمتر |
| MedianFilter | حذف نویز با حفظ لبهها | لبهها حفظ میشوند. |
| EMBOSS | برجستهسازی | حالت سهبعدی میشود. |
| BLUR | محو کردن | تصویر تار میشود. |
| ModeFilter | کاهش نویز با حفظ لبه | تصویر یکنواختتر میشود. |
| CONTOUR | نمایش خطوط اصلی | حالت طراحی با مداد |
| FIND_EDGES | تشخیص لبهها | لبهها مشخص میشوند. |
| EDGE_ENHANCE | تقویت لبهها | لبهها قویتر میشوند. |
| Split() | جدا کردن کانالها | نمایش کانالهای R و G و B |
| کشش کنتراست | افزایش جزئیات پنهان | وضوح جزئیات تصویر بیشتر میشود. |
در تصویر پایین سه مورد از فیلترهای کتابخانه Pillow در پایتون را معرفی کردهایم.

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

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

فیلتر صاف کردن تصویر
این فیلتر با هدف حذف نویز از تصویر به کار برده میشود. باید توجه کرد که علاوه بر حذف نقاط رنگی و بیمعنا ممکن است که جزئیات ظریف تصویر هم حذف شوند. برای صاف کردن تصویر از فیلتر SMOOTH (تمام حروف بزرگ) استفاده میکنیم.
همین طور که مشاهده میکنید، تمام فیلترها از بخش ImageFilter به محیط کدنویسی اضافه میشوند. بعد از اجرای کدهای بالا خروجی به شکل زیر بر روی صفحه نمایش ظاهر شده و در کامپیوتر ذخیره میشود.

برای صاف کردن دوباره میتوانیم از فیلتر SMOOTH_MORE هم استفاده کنیم. مانند بخش بالا این کار باعث صاف شدن بیشتر تصویر میشود. حتی میتوان از این فیلترها پشت سر هم نیز استفاده کرد.
فیلتر میانه
از این فیلتر نیز برای حذف کردن نویزها استفاده میشود. با این تفاوت که لبههای تصویر از دست نمیروند. این فیلتر از ساختار ریاضی منسجم و مشخصی پیروی میکند. یعنی برای هر پیکسل اندازه پیکسلهای دور و بر آن را حساب کرده و میانگین آنها را در پیکسل مورد نظر قرار میدهد.
مهمترین ویژگی فیلتر میانه این است که لبههای تصویر را صاف نمیکند. این لبهها حفظ میشوند.
بعد از اجرای کدهای بالا خروجی به شکل زیر بر روی صفحه نمایش ظاهر شده و در کامپیوتر ذخیره میشود.

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

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

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

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

در فهرست پایین، مراحل انجام کد بالا را نوشتهایم.
- خط ۱: ابتدا کلاسهای Image و ImageFilter را از کتابخانه Pillow وارد میکنیم.
- خط۲: سپس تصویر Bus-passenger.png را باز میکنیم.
- خط۳: با استفاده از ModeFilter فیلتر اولیهای روی تصویر اعمال میکنیم.
- خطوط ۴ و ۵: در ادامه با کمک حلقه for ، همین فیلتر، چهار بار دیگر روی تصویر اعمال میشود. در نتیجه اثر آن قویتر شود.
- خط ۶: بعد از پایان فیلترگذاری، تصویر نهایی با نام Filtered-Image-25.jpg ذخیره میشود.
- خط ۷: در آخر، تصویر فیلتر شده روی صفحه نمایش داده میشود.
تجزیه تصویر به رنگهای اصلی
با این روش میتوان متوجه شد که تصویر موجود از چه کانالهایی تشکیل شده است. میدانیم که تصویر اصلی در این مطلب از فرمت PNG ساخته شده است و از سیستم رنگ RBG استفاده میکند. با کمک کدهای زیر میتوانیم هر سه بخش تصویر را از هم جدا کرده و به شکل جداگانه ذخیره کنیم.
بعد از اجرای کدهای بالا خروجی به شکلهای زیر بر روی صفحه نمایش ظاهر شده و در کامپیوتر ذخیره میشوند.
- تصویر در کانال قرمز به شکل زیر است.

- تصویر در کانال سبز به شکل زیر است.

- تصویر در کانال آبی به شکل زیر نشان داده میشود.

فیلتر Contour با کمک کتابخانه Pillow در پایتون
این فیلتر، تصویری مانند نقاشی سیاه قلم از عکس اصلی ایجاد میکند. انگار بخشهای برجسته عکس را با مداد سیاه بر روی کاغذ سفید نقاشی کردهاید. برای نوشتن این فیلتر باید عبارت CONTOUR به این شکل و با حروف بزرگ نوشته شود.
بعد از اجرای کدهای بالا خروجی زیر بر روی صفحه نمایش ظاهر شده و در کامپیوتر ذخیره میشود.

لبه یابی با کمک فیلتر FIND_EDGES
لبهیابی یکی از تخصصیترین تکنیکهای پردازش تصویر و بینایی ماشین است. در کتابخانه Pillow در پایتون ابزارهای مختلفی برای این کار وجود دارد. یکی از سادهترین آنها فیلتر FIND_EDGES است.

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

کشش کنتراست با کمک کتابخانه Pillow در پایتون
کشش کنتراست برای ظاهر کردن و دیدن جزئیات پنهان شده در تصاویر به کار برده میشود. یکی از مهمترین کاربردهای این تکنیک در زمان بررسی تصاویر پزشکی و تشخیص ناهنجاریها در بافتهای بدن است. در اصطلاح گفته میشود که این عملیات تصویر را بهبود میدهد. در نتیجه، جزئیات بیشتری از تصویر قابل دیدن است.
این تکنیک پیکسلها را به شکلی تغییر میدهد که شدت رنگ در آنها بیشتر شود. به این فرمول، فرمول عادیسازی تصویر گفته میشود.
تمام پارامترهای این فرمول را در فهرست پایین معرفی کردهایم.
- lo: مقدار پیکسل خروجی
- li: مقدار پیکسل ورودی
- MINi: کمترین پیکسل ورودی
- MAXo: بیشترین پیکسل خروجی
- MINo: کمترین پیکسل خروجی
- MAXi: بیشترین پیکسل ورودی
در کدهای زیر این فرمول را بر روی تصویر جنگل مهآلود، پیادهسازی کردهایم.
با اجرای این کدها کنتراست تصویر زیر تغییر میکند. تصویر پایین قبل از اجرای تکنیک «کشش کنتراست» است.

تصویر زیر بعد از اجرای تکنیک کشش کنتراست است.

وارونگی رنگ با کتابخانه Pillow در پایتون
وارونگی رنگ ارتباطی با کانال رنگی تصویر ندارد. در این تکنیک با کالیبراسیون نتایج، همه کانالها تصویر نهایی ساخته میشود. دو روش برای وارونگی رنگ در کتابخانه Pillow تعبیه شدهاند.
- روش اول استفاده از ماژول ImageChops است.
- روش دوم استفاده از فرمولهای مخصوص این کار و پیادهسازی عملیات به صورت دستی است.
به تصویر زیر دقت کنید.

اکنون رنگهای تصویر بالا را با کمک ماژول ImageChops وارونه میکنیم.
بعد از اجرای کدهای بالا تصویر پایین بر روی صفحه نمایش ظاهر شده و در کامپیوتر ذخیره میشود.

اجرای دستی عملیات وارونگی رنگ
برای اجرای دستی وارونگی رنگ باید فرمول مربوط به این عملیات را خودمان برنامه نویسی کنیم. به این منظور لازم است کتابخانه Numpy را از قبل بر روی سیستم نصب کرده باشیم. در صورت نیاز به نصب این کتابخانه میتوانید از دستور pip install numpy در خط فرمان استفاده کنید.
کتابخانه «Numpy» ابزار بسیار مناسبی برای کار بر روی آرایههای یکبعدی و چند بعدی است. این کتابخانه در محاسبات علمی و عددی بسیار به کار برده میشود.
بعد از اجرای کدهای بالا تصویر زیر بر روی صفحه نمایش ظاهر شده و در کامپیوتر ذخیره میشود.

لبه یابی تصاویر با کتابخانه Pillow در پایتون
در بخش بالا با فیلتر مخصوصی برای پیدا کردن لبههای تصویر آشنا شدهایم. در این بخش میخواهیم به صورت تخصصیتر این عملیات را انجام بدهیم. کتابخانه Pillow از هستههای ۳×۳ یا ۵×۵ پشتیبانی میکند. این هستهها نوعی ماتریس دو بعدی هستند. برای اجرای این عملیات از هستههای کانولوشنی استفاده میکنیم.
هسته کانولوشن، ماتریسی است که در هر درایه آن مقادیر رنگ مربوط به آن موقعیت ذخیره میشود. البته این مقادیر به مدل رنگی تصویر وابسته هستند. در نسخههای فعلی Pillow از هستههای کانولوشنی برای تصاویری با مدلهای رنگی «L» و «RGB» استفاده میشود.
بعد از اجرای کدهای بالا تصویر زیر بر روی صفحه نمایش ظاهر شده و در کامپیوتر ذخیره میشود.

در تصویر بالا از فیلتر Kernel استفاده کردهایم. این فیلتر ۴ پارامتر اصلی دارد.
- پارامتر اول: سایز یا اندازه ماتریس که همیشه باید ۳×۳ یا ۵×۵ باشد.
- پارامتر دوم: پارامتر دوم خود ماتریس مورد نظر است. اینجا از ماتریس ۳×۳ استفاده کردهایم.
- پارامتر سوم: این پارامتر «Scale» است. هر مقداری که به این پارامتر بدهیم باقی پیکسلها بر آن تقسیم میشوند. مقدار پیشفرض برای این پارامتر مجموع وزن هسته است.
- پارامتر چهارم: این پارامتر نماینده «Offset» است که در این عملیات برابر با صفر قرار داده شده.

از آنجا که برای استفاده از هستههای کرنل، تصویر باید از سیستمهای رنگی «L» یا «RGB» استفاده کند، با کمک دستور myImage = myImage.convert('L') سیستم رنگی عکس را به L تغییر دادیم.
یادگیری کار با کتابخانههای پایتون به کمک فرادرس
فرادرس برای کمک به یادگیری استفاده از کتابخانههای متنوع پایتون، فیلمهای آموزشی زیادی درست کرده است. میتوان گفت که پایتون به یکی از مشهورترین و پرکاربردترین زبانهای برنامه نویسی دنیا تبدیل شده است. وجود کتابخانههای متنوع و قدرتمند یکی از مهمترین دلایل این استفاده گسترده از پایتون است. با کمک کتابخانههای متنوع، پایتون تقریبا در هر حوزهای به کار برده میشود. به همین دلیل فرادرس سعی کرده است که روش آموزش تمام کتابخانههای پایتون را به مرور زمان و به شکل حرفهای تولید و منتشر بکند. در این مجموعه آموزشی با کمک بهترین فیلمها میتوانید کار با فریمورکها و ماژولهای مشهور پایتون را یاد بگیرید.
در پایین چند مورد از فیلمهای مجموعه آموزش کتابخانههای پایتون را معرفی کردهایم.
- فیلم آموزش پروژه محور جنگو و پایتون درباره طراحی سایت و وب اپلیکیشن با فریمورک Django + گواهینامه
- فیلم آموزش یادگیری عمیق در پایتون با «تنسورفلو و کراس» (TensorFlow و Keras) + گواهینامه
- فیلم آموزش pandas برای تحلیل اطلاعات در پایتون + گواهینامه
- فیلم آموزش کتابخانه «scikit-learn» در پایتون همراه با بررسی الگوریتم های یادگیری ماشین + گواهینامه
- فیلم آموزش پروژه محور بینایی ماشین با پایتورچ، درباره تشخیص اشیا در PyTorch با پایگاه داده COCO + گواهینامه
برای مشاهده فیلمهای بیشتر بر روی تصویر زیر کلیک کرده و به صفحه اصلی این مجموعه آموزش بروید.

هیستوگرام رنگهای تصویر
در این بخش از مطلب، با استفاده از کتابخانه Pillow، هیستوگرام رنگهای تصویر را بررسی میکنیم. هدف این است که اطلاعات مربوط به توزیع رنگهای تصویر نمایش داده شود.
متد Histogram اطلاعات مربوط به تعداد رنگ در باندهای مختلف را نشان میدهد. اگر تصویر از نوع RGB باشد، برای هر کدام از کانالهای رنگی قرمز، سبز و آبی، ۲۵۶ مقدار ممکن وجود دارد. در نتیجه، هر تصویر RGB میتواند در مجموع شامل ۷۶۸ مقدار رنگی یا نوع پیکسل متفاوت باشد. برای مثال میخواهیم تمام پیکسلهای موجود در کانال قرمز از تصویر خودمان را چاپ بکنیم.
بعد از اجرای کد بالا، خروجی زیر در کنسول پایتون نمایش داده میشود. در این خروجی ۲۵۶ پیکسل مختلف وجود دارد.
[171, 451, 590, 1020, 1793, 2232, 2582, 2596, 2351, 2478, 2248, 2335, 2229, 2244, 2048, 1986, 2051, 2028, 1952, 1753, 1881, 1722, 1768, 1704, 1725, 1577, 1579, 1543, 1491, 1448, 1419, 1294, 1217, 1158, 1063, 1114, 1085, 1028, 951, 921, 841, 944, 833, 789, 821, 793, 694, 570, 589, 551, 555, 557, 497, 506, 539, 542, 480, 550, 522, 513, 570, 556, 562, 512, 529, 521, 502, 542, 551, 551, 565, 541, 549, 606, 518, 476, 558, 556, 554, 603, 604, 538, 546, 510, 431, 527, 523, 518, 522, 483, 506, 468, 492, 500, 515, 527, 511, 500, 509, 465, 538, 552, 524, 563, 537, 552, 571, 542, 557, 523, 533, 535, 508, 566, 562, 550, 584, 553, 529, 576, 576, 547, 510, 517, 556, 592, 581, 569, 613, 582, 583, 627, 647, 619, 585, 670, 619, 652, 676, 736, 720, 774, 847, 875, 768, 762, 737, 615, 728, 681, 571, 509, 530, 471, 480, 447, 435, 410, 400, 413, 397, 468, 403, 343, 378, 359, 386, 364, 390, 336, 359, 320, 402, 434, 424, 425, 444, 442, 397, 418, 414, 411, 466, 468, 445, 449, 468, 445, 467, 475, 521, 498, 476, 507, 469, 419, 452, 456, 383, 406, 377, 410, 387, 459, 402, 375, 329, 347, 330, 292, 247, 268, 230, 196, 212, 210, 225, 231, 202, 199, 198, 143, 137, 116, 102, 94, 87, 92, 80, 48, 63, 64, 41, 36, 45, 48, 39, 41, 32, 16, 22, 16, 24, 9, 13, 13, 8, 4, 8, 5, 8, 7, 5, 5, 4, 1]در این قسمت میخواهیم اطلاعات مربوط به رنگهای تصویر نمایش داده شوند. بهترین کار برای رسیدن به این هدف رسم نموداری از مقادیر پیکسلهای کانالهای رنگی مختلف است. به این منظور از کتابخانه Matplotlib استفاده میکنیم. این کتابخانه یکی از بهترین ابزارها برای رسم نمودارهای گوناگون و جذاب بر روی انواع دادهها است. در صورت نیاز به نصب این ابزار میتوانید از دستور pip install matplotlib در خط فرمان ویندوز یا ترمینال لینوکس استفاده کنید.
با کمک کدهای بالا نمودار تغییر رنگ پیکسلها و تعدادشان را به شکل زیر رسم میکنیم.

جمعبندی
در این مطلب از مجله فرادرس با کتابخانه Pillow آشنا شدیم. این کتابخانه نسخه مدرن و قدرتمندی از (Python Imaging Library | PIL) است. کتابخانه Pillow امکان خواندن، ذخیره و پردازش تصاویر در فرمتهای متنوعی مانند JPG و PNG و GIF و غیره را با سرعت بالا فراهم میکند. در ضمن از طیف گستردهای از عملیات پایه و پیشرفته نیز پشتیبانی میکند. برای مثال میتوان به تغییر اندازه، برش، چرخش، قرینهسازی، ساخت Thumbnail، افزودن متن و واترمارک، اعمال فیلترهای گوناگونی مانند SHARPEN و BLUR و EMBOSS و CONTOUR و Edge Enhancement و Find Edges و جداسازی کانالهای رنگی، وارونگی رنگ، لبهیابی با کرنل و رسم هیستوگرام اشاره کرد.
Pillow در پروژههای اتوماسیون ویرایش عکس، پیشپردازش داده برای یادگیری ماشین، تولید محتوای وب، تحلیل تصاویر پزشکی، ترمیم عکس و ساخت ابزارهای گرافیکی کاربرد گستردهای دارد. برنامهنویسان پایتون که با دادههای تصویری کار میکنند، بهتر است با قابلیتهای اصلی Pillow آشنا شوند تا بتوانند راهحلهای سریع، خودکار و کارآمد پیادهسازی کنند.












