چگونه در پایتون عکس بگذاریم؟ و روش چرخش تصویر در پایتون

در برنامهنویسی پایتون، بارگذاری، نمایش و چرخاندن یک عکس از پایهایترین نیازها برای توسعه پروژههای گرافیکی، ساخت رباتها یا پردازش داده است. شما در این راهنما دقیقاً یاد میگیرید که چگونه با استفاده از محبوبترین ابزارها، تصاویر خود را وارد محیط پایتون کنید، روی صفحه نمایش دهید و به زوایای دلخواه بچرخانید. نتیجه عملی این مقاله این است که در پایان، کدهای آماده و تستشدهای برای مدیریت هندسی تصاویر خود خواهید داشت که میتوانید بلافاصله در پروژههای واقعی سیستم خود اجرا کنید.
ویدیوآموزشی بارگذاری عکس در پایتون را اینجا تماشا کنید:
انتخاب ابزار مناسب برای کار با تصویر در پایتون
پایتون برای مدیریت تصاویر ابزارهای متنوعی دارد که هر کدام برای هدف خاصی طراحی شدهاند. برای کارهای ساده، ساخت برنامههای کوچک و ویرایشهای روزمره، کتابخانه پردازش تصویر پایتون یا همان پیلو (Pillow) بهترین و سبکترین انتخاب است. در مقابل، اگر روی پروژههای پیچیده بینایی ماشین (Machine Vision) کار میکنید، اوپنسیوی (OpenCV) سرعت و قدرت بسیار بالاتری در اختیار شما قرار میدهد.
همچنین برای تحلیل دادهها در محیطهای آکادمیک و رسم نمودارها، کتابخانه متپلاتلیب (Matplotlib) گزینهای ایدهآل به شمار میرود. بر اساس دادههای اخیر جستجوهای توسعهدهندگان در گوگل ترندز، توجه به اوپنسیوی در پروژههای مبتنی بر هوش مصنوعی رشد پایداری داشته است، در حالی که پیلو همچنان بیشترین کاربرد را در توسعه وب و اسکریپتهای روزمره دارد. در ادامه، روش کار با هر سه ابزار را به صورت گامبهگام بررسی میکنیم.
یه نکته مهم دیگه: تابع در پایتون چیست؟ محل تعریف و 23 مثال ساده
نمایش تصویر با استفاده از کتابخانه پیلو (Pillow)
کتابخانه پیلو یکی از محبوبترین ابزارها برای باز کردن و نمایش عکس در پایتون است. برای شروع، ابتدا باید این ابزار را در خط فرمان (Terminal) سیستم خود نصب کنید. این کار با اجرای دستور pip install Pillow انجام میشود. پس از نصب، تنها با چند خط کد کوتاه میتوانید تصویر مورد نظر خود را بارگذاری کرده و در پنجره پیشفرض مرورگر عکس سیستم عامل خود مشاهده کنید. این روش برای تغییر اندازه، برش و اعمال فیلترهای اولیه عالی است.

نکات سریع برای کار با پیلو:
- همیشه فرمت و مسیر دقیق فایل عکس (آدرسدهی مطلق یا نسبی) را بررسی کنید تا با خطای یافت نشدن فایل روبرو نشوید.
- میتوانید از دستورات img.format و img.size برای دریافت اطلاعات اولیه تصویر پیش از نمایش استفاده کنید.
- این کتابخانه از اکثر فرمتهای رایج تصویر مانند JPEG، PNG، WEBP و BMP به صورت کامل پشتیبانی میکند.
چرخش تصویر در پایتون با پیلو
پس از بارگذاری تصویر، چرخاندن آن به زاویه دلخواه یکی از نیازهای بسیار رایج است. در پیلو این کار به سادگی با استفاده از متد چرخش (rotate) انجام میپذیرد. شما فقط باید مقدار زاویه چرخش را بر حسب درجه به این متد پاس بدهید. دقت کنید که چرخشها به صورت پیشفرض در جهت خلاف حرکت عقربههای ساعت انجام میشوند. در کدهای زیر روشهای مختلف چرخش را مشاهده میکنید.

اضافه کردن پارامتر بسط دادن (expand=True) در کد بالا باعث میشود کادر تصویر به صورت خودکار متناسب با زاویه جدید بزرگ شود. این ویژگی از بریده شدن و سیاه شدن گوشههای عکس در زوایای خاص (مانند ۴۵ درجه) جلوگیری میکند. این قابلیت در پروژههایی مثل ساخت آلبومهای دیجیتال، تولید تصاویر برای شبکههای اجتماعی یا نرمافزارهای ویرایش عکس بسیار کلیدی است و خروجی تمیزتری را تولید میکند.
کار با تصاویر به کمک اوپنسیوی (OpenCV)
اگر قصد دارید وارد دنیای حرفهای پردازش تصویر شوید، اوپنسیوی ابزار اصلی شما خواهد بود. این کتابخانه به زبان سیپلاسپلاس نوشته شده و به همین دلیل در پایتون با سرعت فوقالعاده بالایی اجرا میشود. نصب آن از طریق مدیریت بستهها با دستور pip install opencv-python امکانپذیر است. نمایش عکس با این ابزار کمی متفاوت است و نیاز به تعریف یک پنجره اختصاصی و یک کلید خروج دارد تا تصویر پس از باز شدن، بلافاصله بسته نشود.

نکات سریع برای اوپنسیوی:
- این ابزار تصاویر را به صورت پیشفرض در قالب رنگی BGR (آبی، سبز، قرمز) میخواند، در حالی که استاندارد معمول RGB است.
- تابع انتظار (waitKey) حتماً باید مقدار صفر داشته باشد تا پنجره تا زمان فشردن دکمه باز بماند. اعداد دیگر به معنای توقف بر حسب میلیثانیه هستند.
- همیشه در انتهای کد از تابع تخریب پنجرهها (destroyAllWindows) استفاده کنید تا حافظه سیستم و پردازنده به درستی آزاد شود.
چرخش تصویر با اوپنسیوی در سطوح پیشرفته
چرخاندن عکس در اوپنسیوی میتواند از طریق توابع از پیش آماده یا به کمک ماتریسهای انتقال هندسی انجام شود. برای زوایای استاندارد مانند ۹۰، ۱۸۰ و ۲۷۰ درجه، تابعی بسیار بهینه وجود دارد که مستقیماً زاویه را روی پیکسلها اعمال میکند. اما اگر نیاز به چرخش در زوایای خاص مثلاً ۳۳ درجه داشته باشید، باید ابتدا نقطه مرکز تصویر را پیدا کرده و سپس ماتریس چرخش را از طریق روابط ریاضی محاسبه کنید.

استفاده از ماتریس انتقال در روش دوم به شما اجازه میدهد علاوه بر چرخش، مقیاس تصویر را نیز در همان لحظه تغییر دهید. پارامتر آخر (عدد 1.0) در تابع دریافت ماتریس چرخش، میزان بزرگنمایی یا کوچکنمایی را مشخص میکند. این روش در ساخت برنامههای تشخیص چهره یا پلاکخوانهای پارکینگ که عکسها زاویههای انحرافی متنوعی دارند، به شدت پرکاربرد است و دقت مدلهای یادگیری ماشین را افزایش میدهد.
ویدیو آموزشی پردازش عکس در اوپنسیوی در پایتون را تماشا کنید:
نمایش و چرخش عکس با متپلاتلیب (Matplotlib)
گاهی اوقات نیازی به ساخت نرمافزار گرافیکی مجزا نداریم و فقط میخواهیم نتیجه پردازشها را در محیطهای علمی مثل ژوپیتر نوتبوک (Jupyter Notebook) بررسی کنیم. در اینجا کتابخانه متپلاتلیب بهترین عملکرد را از خود نشان میدهد. این ابزار به صورت پیشفرض تصاویر را در قالب یک نمودار نشان میدهد و محورهای مختصات را در اطراف آن رسم میکند که برای تحلیل موقعیت دقیق پیکسلها در علم داده بینظیر است.

برای چرخش عکس در این روش معمولاً از ماژول پردازش تصویر سایپای (SciPy) کمک گرفته میشود. ترکیب متپلاتلیب و سایپای اکوسیستم کاملی برای مهندسان داده فراهم میکند تا بدون نیاز به ساخت رابطهای کاربری سنگین، خروجی دادههای تصویری خود را مصورسازی کنند. خاموش کردن محورهای مختصات با دستور خط هفتم در کد بالا، کمک میکند تا تمرکز منحصراً روی خود تصویر قرار گیرد.
ذخیره تصویر ویرایششده روی حافظه سیستم
تمام کارهایی که برای تغییر زاویه و پردازش عکس انجام دادیم زمانی ارزشمند است که بتوانیم نتیجه نهایی را در قالب یک فایل جدید ذخیره کنیم. در کتابخانه پیلو، این کار تنها با فراخوانی متد ذخیرهسازی (save) و تعیین یک نام و پسوند جدید انجام میشود.
در اوپنسیوی نیز از تابع نوشتن تصویر (imwrite) برای ثبت آرایههای پیکسلی روی دیسک استفاده میکنیم. در هنگام ذخیرهسازی، پایتون به صورت خودکار بر اساس پسوندی که تایپ میکنید (مانند فرمتهای فشردهساز پیانجی یا جیپیجی) ساختار داخلی فایل را تنظیم میکند تا نیازی به تنظیمات پیچیده و دستی نداشته باشید.

تفاوت چرخش هندسی با قرینهسازی تصاویر (Flipping)
بسیاری از برنامهنویسان تازهکار، مفهوم چرخش را با آینهای کردن یا قرینهسازی تصویر اشتباه میگیرند. در چرخش، تمام پیکسلها حول یک نقطه مرکزی تاب میخورند، اما در قرینهسازی، جای پیکسلهای چپ و راست (یا بالا و پایین) دقیقاً عوض میشود؛ درست مانند زمانی که روبروی آینه میایستید.
اگر میخواهید دوربین سلفی ربات خود را تنظیم کنید، به جای چرخش باید از قرینهسازی افقی استفاده کنید. در کتابخانه اوپنسیوی این کار با تابع flip انجام میشود و عدد یک نمایانگر قرینه افقی، عدد صفر برای قرینه عمودی و منفی یک برای ترکیب هر دو حالت است.
نکات سریع برای قرینهسازی:
- در کتابخانه پیلو برای آینهای کردن باید از متد جابهجایی به شکل img.transpose(Image.FLIP_LEFT_RIGHT) استفاده کنید.
- قرینهسازی عمودی با چرخش ۱۸۰ درجه متفاوت است؛ در چرخش ۱۸۰ درجه تصویر وارونه میشود، اما نوشتههای درون عکس خوانایی خود را (اگرچه برعکس) حفظ میکنند.
- عملیات آینهای کردن در پردازش تصویر بسیار سریعتر از چرخش با ماتریسها پردازش میشود، زیرا نیازی به محاسبات سینوس و کسینوس زوایا ندارد.
حفظ شفافیت پسزمینه در عکسهای بدون کادر
وقتی تصویر را در زوایایی به جز مضاربی از نود درجه میچرخانید، پایتون مجبور است فضاهای خالی ایجاد شده در گوشههای کادر جدید را با رنگی پر کند. این رنگ به صورت پیشفرض در بیشتر کتابخانهها مشکی است که ظاهر کار را خراب میکند.
برای رفع این مشکل، باید مطمئن شوید که تصویر شما از کانال آلفا (Alpha) یا همان قابلیت شفافیت پشتیبانی میکند. پیش از اعمال تغییر زاویه در کتابخانه پیلو، تصویر را به حالت چهار کاناله (RGBA) تبدیل کنید تا فضاهای خالی ایجاد شده به صورت کاملاً شیشهای و بدون رنگ تنظیم شوند و بتوانید به راحتی آنها را روی عکسهای دیگر قرار دهید.

رفع مشکل چرخش ناخواسته در عکسهای دوربین و موبایل
یکی از کلافهکنندهترین مشکلات هنگام کار با عکسهای ثبتشده توسط موبایل، این است که در گالری گوشی کاملاً صاف به نظر میرسند اما وقتی آنها را در پایتون باز میکنید، به صورت نود درجه کج نمایش داده میشوند. دلیل این اتفاق، دادههای پنهان درون فایل عکس یا همان اگزف (EXIF) است که سنسور جاذبه گوشی زاویه دست شما را در آن ثبت کرده است.
کتابخانههای پایتون معمولاً این فرادادهها را نادیده میگیرند و تصویر خام را میخوانند. برای حل این مشکل نیازی به کدنویسی پیچیده ندارید؛ ماژول عملیات تصویر در پیلو، تابعی اختصاصی برای خواندن این دادهها و اصلاح خودکار زاویه پیش از شروع پردازش دارد.
نکات سریع برای رفع کجی عکس موبایل:
- همیشه در ابتدای کدهای پردازش تصویر خود از دستور ImageOps.exif_transpose(img) استفاده کنید تا زاویههای پنهان خنثی شوند.
- اگر قصد دارید حجم عکس را برای وبسایت کم کنید، پاک کردن متادیتای اگزف راهکار خوبی است، اما حتماً قبل از آن چرخشها را ثابت کنید.
- اوپنسیوی در نسخههای جدید خود تلاش کرده است این مشکل را رفع کند، اما همچنان در فایلهای حجیم ممکن است با خطای جهتیابی مواجه شوید.
اصلاح رنگها هنگام ترکیب اوپنسیوی و متپلاتلیب
اگر بخواهید قدرت پردازشی اوپنسیوی را با زیبایی رسم نمودار در متپلاتلیب ترکیب کنید، با یک چالش رنگی عجیب روبرو میشوید؛ تصاویر شما ناگهان آبیرنگ به نظر میرسند. همانطور که پیشتر اشاره شد، اوپنسیوی رنگها را با چینش آبی-سبز-قرمز (BGR) میخواند، اما متپلاتلیب انتظار چینش استاندارد قرمز-سبز-آبی (RGB) را دارد.
برای حل این تداخل، نیازی نیست تکتک پیکسلها را جابهجا کنید. کافی است بلافاصله پس از خواندن تصویر توسط اوپنسیوی، از تابع تبدیل فضای رنگی استفاده کنید تا ساختار ماتریس رنگها برای نمایش در هر رابط کاربری یا کتابخانه دیگری کاملاً استاندارد و بهینه شود.
مقایسه روشها و آمار استفاده از کتابخانهها
انتخاب ابزار مناسب میتواند تأثیر چشمگیری در سرعت توسعه پروژه و عملکرد نهایی سیستم شما داشته باشد. برای اینکه بتوانید بهترین تصمیم را برای پروژه فعلی خود بگیرید، ویژگیهای کلیدی این سه کتابخانه را در جدول زیر خلاصهسازی کردهایم. این مقایسه بر اساس سرعت، پیچیدگی و کاربرد اصلی هر ابزار در دنیای واقعی تدوین شده است.
| نام کتابخانه | سطح پیچیدگی | سرعت اجرا در چرخش | کاربرد اصلی در پروژهها | نیاز به ابزارهای جانبی |
|---|---|---|---|---|
| پیلو (Pillow) | بسیار ساده | متوسط | ویرایش سریع، باتهای تلگرامی | خیر |
| اوپنسیوی (OpenCV) | پیشرفته | بسیار بالا | پردازش تصویر بلادرنگ، ویدیو | بله (عموماً نامپای) |
| متپلاتلیب (Matplotlib) | متوسط | پایین | رسم نمودار، تحلیل علمی داده | بله (عموماً سایپای) |
اگر یک اسکریپت ساده مینویسید که روی تصاویر واترمارک قرار میدهد، پیلو پاسخگوی تمام نیازهای شما با کمترین میزان کدنویسی است. اما اگر روی فیلترهای ویدیویی زنده یا تشخیص خطوط جاده در خودروهای هوشمند کار میکنید، بدون شک باید روی یادگیری اوپنسیوی و ماتریسهای چرخشی آن سرمایهگذاری کنید تا سرعت فریمها کاهش پیدا نکند.
گام بعدی: همین حالا محیط برنامهنویسی خود را باز کنید، یکی از کدهای بخش اوپنسیوی یا پیلو را کپی کرده و تلاش کنید تصویر یک چهره را به صورت وارونه (۱۸۰ درجه) چرخانده و نمایش دهید.






