پردازش تصویر در پایتون با استفاده از   Pillow

Image processing in Python with Pillow

14 شهریور 1402
python-image-processing-pillow

python در حال حاضر یکی از پرکاربردترین زبان های برنامه نویسی در جهان است. می توان از آن برای انجام وظایف مختلف با استفاده از یک کد ساده استفاده کرد. یکی از این کارها پردازش تصویر در پایتون است.

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

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

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

چنانچه به پایتون تسلط ندارید کافیست مجموعه دوره های آموزشی پایتون را مطالعه بفرمایید.

Pillow چیست؟

Pillow زیر مجموعه ای از کتابخانه های پردازش تصویر در پایتون به نام PIL است. این کتابخانه رایگان و منبع باز است و برای دستکاری و پردازش تصاویر به کار می­رود.

PIL به خودی خود یک کتابخانه قدرتمند است، اما از سال 2009 به روز نشده است و از پایتون 3 پشتیبانی نمی کند. Pillow ویژگی ها و پشتیبانی بیشتری را برای Python 3 ارائه می دهد.

Pillow از طیف وسیعی از فرمت‌های تصویر مانند PNG، JPEG، PPM، GIF، TIFF و BMP پشتیبانی می‌کند. با استفاده از این کتابخانه می‌توانید عملیات‌های مختلفی مانند برش، تغییر اندازه، افزودن متن، چرخش، تغییر رنگ و موارد دیگر را بر روی تصاویر انجام دهید.

نصب و راه اندازی پروژه

می‌توانید Pillow را با استفاده از pip، که یک ابزار مدیریت پکیج برای پایتون است، نصب کنید:

python3 -m pip install --upgrade pip

python3 -m pip install --upgrade Pillow

Pillow آبجکت Image را ارائه می کند که دارای توابع و ویژگی های داخلی است که می توان با استفاده از آن ها عملیات دستکاری را بر روی تصاویر انجام داد.

برای شروع، ابتدا شی Image را در کد پایتون import یا وارد کنید.

from PIL import Image

سپس، تصویر را با فراخوانی تابع Image.open() آپلود یا بارگذاری کنید، که نوع بازگشتی آن مقداری از نوع شی Image است.

image = Image.open('sample.jpg')

برای برنامه خود، از یک تصویر نمونه از Unsplash استفاده می کنیم.

همچنین گفتن این نکته ضروری است که تصاویر باید در همان دایرکتوری باشند که فایل پایتون در حال اجرا است.

ویژگی های (پراپرتی های) شی Image

تصویر ویژگی هایی دارد که می توانیم برای دریافت اطلاعات بیشتر از تصویر به آنها دسترسی داشته باشیم. از جمله:

  • width طول تصویر را برمی گرداند
  • height عرض تصویر را برمی گرداند
  • format فرمت فایل تصویر را برمی گرداند (به عنوان مثال، JPEG، BMP، PNG، و غیره)
  • size ارتفاع و وزن تصویر را برمی گرداند
  • palette جدول پالت رنگ را در صورت وجود برمی گرداند
  • mode قالب پیکسلی تصویر را برمی گرداند (به عنوان مثال، 1، L، RGB، CMYK)

عملیات اصلی برای تصویر

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

هر تغییری که در شی Image ایجاد شود را می توان با متد save() در یک فایل تصویری ذخیره کرد. تمام چرخش ها، تغییر اندازه، برش، ترسیم و سایر دستکاری های تصویر از طریق فراخوانی روی این شی Image انجام می شود.

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

تغییر فرمت تصویر

Pillow از طیف گسترده ای از فرمت های تصاویر پشتیبانی می کند. یک تصویر را می توان از یک فرمت به فرمت دیگر به صورت زیر تبدیل کرد:

image = Image.open('sample.jpg')

image.save('sample_formatted.png')

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

image = Image.open('sample.jpg')

image.thumbnail((200, 200))

image.save('sample_thumbnail.jpg')

ایجاد thumbnail ها

با ایجاد یک thumbnail یا تصویر بند انگشتی از تصویر با استفاده از Pillow می توانید اندازه تصاویر را تغییر دهید.

با استفاده از تابع thumbnail اندازه تصویر تغییر می کند تا نسبت ابعاد آن حفظ شود. این تابع دو مقدار می گیرد که نشان دهنده حداکثر عرض و حداکثر ارتفاع تصویر کوچک است.

image = Image.open('sample.jpg')

image.thumbnail((200, 200))

image.save('sample_thumbnail.jpg')

ایجاد thumbnail ها با Pillow
ایجاد thumbnail ها

برگرداندن و چرخش تصاویر

اگر نیاز دارید تصویر برگردانده شود یا بچرخد، Pillow  به شما امکان می‌دهد این کار را بکنید. این کار با استفاده از تابع transpose انجام می شود که پارامترهای زیر را می گیرد:

  • FLIP_LEFT_RIGHT، که تصویر را به صورت افقی بر می گرداند
  • FLIP_TOP_BOTTOM، که تصویر را به صورت عمودی بر می گرداند
  • ROTATE_90، که با توجه به اندازه زاویه، تصویر را تا حدودی می چرخاند

image = Image.open('sample.jpg')

image.transpose(Image.FLIP_TOP_BOTTOM)

image.save('sample_flip.jpg')

برگرداندن تصویر با Pillow
تصویر به دست آمده به صورت عمودی برگردانده می شود.

همچنین می توانید تصاویر را با استفاده از متد rotate() بچرخانید. این تابع یک آرگومان صحیح یا اعشاری می گیرد که نشان دهنده درجه چرخش است و یک شی Image جدید از تصویر چرخانده شده را برمی گرداند. چرخش در خلاف جهت عقربه های ساعت است.

image = Image.open('sample.jpg')




image.rotate(90)

image.save('image_rotate90.jpg')

چرخش تصویر با Pillow
تصویر با زاویه 90 درجه می چرخد.

برش تصاویر

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

تابع crop در Pillow تصویر را به صورت مستطیلی برش می­دهد. این متد یک تاپل را می گیرد که موقعیت و اندازه ناحیه برش خورده را مشخص می کند و یک شی Image که تصویر برش خورده را نشان می دهد برمی گرداند. ناحیه­ی برش با یک 4 تایی تعریف می شود که مختصات آن (چپ، بالا، راست، پایین) است.

image = Image.open('sample.jpg')

image.crop(200, 50, 450, 300)

image.save('sample_cropped.jpg')

برش تصاویر

در مثال بالا، دو مقدار اول مکان شروع برای برش را از سمت چپ بالا نشان می دهند. مقادیر سوم و چهارم نشان دهنده فاصله به پیکسل از موقعیت شروع به سمت راست و پایین است.

اندازه کامل تصویر برش داده شده را می توان 250×250 پیکسل محاسبه کرد.

تغییر رنگ

اشکال مختلفی از نمایش پیکسل ها از جمله L (درخشندگی)، RGB و CMYK وجود دارد.

Pillow به شما امکان می دهد با استفاده از متد convert تصاویر را برای نمایش های مختلف به مقدار پیکسلی تبدیل کنید. این کتابخانه از تبدیل بین هر حالت پشتیبانی شده و همچنین از حالت های "L" و "RGB" پشتیبانی می کند. برای تبدیل بین حالت های دیگر، ممکن است مجبور باشید از یک تصویر "RGB" استفاده کنید.

image = Image.open('sample.jpg')




grayscale_image = image.convert('L')

grayscale_image.save('sample_grayscale.jpg')

با استفاده از تابع convert، تصویر نمونه از حالت RGB به حالت L (درخشندگی) تبدیل می شود که منجر به ساخت یک تصویر در مقیاس خاکستری می شود.

تغییر رنگ

فیلتر کردن تصویر

عمل ویرایش و بهبود تصاویر برای بهبود ظاهر آن را می توان فیلتر کردن نامید.

با استفاده از ماژول ImageFilter از Pillow، می توانید از متد filter استفاده و از تکنیک های مختلف فیلتر استفاده کنید، از جمله:

  • BLUR
  • CONTOUR
  • DETAIL
  • EDGE_ENHANCE
  • EDGE_ENHANCE_MORE
  • EMBOSS
  • FIND_EDGES
  • SHARPEN
  • SMOOTH
  • SMOOTH_MORE

برای مثال، اجازه دهید نگاهی به فیلتر FIND_EDGES بیندازیم:

from PIL import Image, ImageFilter

image = Image.open('sample.jpg')
edges_image = image.filter(ImageFilter.FIND_EDGES)
edges_image.save('sample_edges.jpg')

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

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

پردازش تصاویر با Pillow: یک مثال عملی

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

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

برای حل مشکل، می توانید یک فایل پایتون به نام script.py در همان پوشه ای که تصاویر وجود دارد ایجاد کنید.

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

import os

from PIL import Image

ماژول os در پایتون توابعی را برای ایجاد و حذف دایرکتوری و تغییر و شناسایی دایرکتوری فعلی ارائه می دهد.

یک دایرکتوری برای تصویر پردازش شده ایجاد کنید:

os.makedirs('watermarked_images')

طول و عرض تصویر لوگو را ذخیره کنید:

logo_image = Image.open('watermark_logo.png')

logo_image = logo_image.resize((50, 50))

logo_width, logo_height = logo_image.size

از تابع os.listdir همراه با یک حلقه for استفاده کنید:

for image in os.listdir('./images'):

try:

# Separting the filepath from the image's name

path, filename = os.path.split(image)

filename = os.path.splitext(filename)[0]

Open the image:

image = Image.open('./images/'+image)

#Resizing the image to a set size.

edited_image = image.resize((300, 300))

#Setting the position for the placement

width = edited_image.width

height = edited_image.height

برای قرار دادن لوگو روی تصویر از تابع  paste استفاده کنید:

edited_image.paste(logo_image, (width - logo_width, height - logo_height), logo_image)

تصاویر را در دایرکتوری جدید ذخیره کنید:

edited_image.save('./watermarked_Images/' + filename + ".jpg")

هر تصویر در دایرکتوری پردازش شده و واترمارک به آن اضافه می­شود. این کد ما را قادر می سازد تا کار را در زمان کمتری به بهترین شکل انجام دهیم.

همچنین می‌توانید GitHub را برای کد کامل و منابع مرتبط با این آموزش بررسی کنید.

نتیجه گیری

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

اگر می خواهید بیشتر بدانید، اسناد رسمی Pillow را بررسی کنید.

منبع:  وبسایت لاگراکت

نویسنده شوید
دیدگاه‌های شما (1 دیدگاه)

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

بنده خدا
24 آبان 1402
حیف که متون فارسی رو پشتیبانی نمیکنه و از چپ به راست نمایش میده :(

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.