پردازش تصویر با پایتون Python
تصاویر، جهان را تعریف می کنند و هر تصویر داستان خاص خود را دارد یا حاوی اطلاعات بسیار مهمی است که می تواند از بسیاری جهات مفید باشد. این اطلاعات را می توان با کمک تکنیکی به نام پردازش تصویر به دست آورد. پردازش تصویر با پایتون یکی از رایجترین حوزه هایی است که برنامه نویسان پایتون می توانند وارد آن شوند.
این بخش اصلی بینایی کامپیوتری است که در بسیاری از حوزه های دنیای واقعی مانند رباتیک، ماشینهای خودران و تشخیص اشیا نقش مهمی دارد. پردازش تصویر در پایتون به ما امکان می دهد هزاران تصویر را در یک زمان تغییر دهیم و دستکاری کنیم و بینش مفیدی را از آنها استخراج کنیم. تقریباً در هر زمینه ای طیف گسترده ای از کاربرد ها را دارد.
پایتون یکی از زبان های برنامه نویسی پرکاربرد برای این منظور است. کتابخانه ها و ابزارهای شگفت انگیز آن در دستیابی به پردازش تصویر بسیار کارآمد هستند. در این مقاله الگوریتمها، تکنیکها و ابزارهای کلاسیک برای پردازش تصویر و دریافت خروجی مورد نظر را مورد بررسی قرار می دهیم. قبل از شروع، در صورتی که با برنامه نویسی پایتون آشنایی ندارید، پیشنهاد می کنیم تا دوره آموزش برنامه نویسی پایتون را مشاهده کنید.
پردازش تصویر با پایتون چیست؟
همانطور که از نامش مشخص است، پردازش تصویر به معنای پردازش تصویر می باشد. ممکن است شامل تکنیک های مختلفی باشد که برای رسیدن به هدف می توانیم از آنها استفاده کنیم. خروجی نهایی می تواند به صورت تصویر یا ویژگی مربوط به آن تصویر باشد. این فرایند می تواند برای تجزیه و تحلیل بیشتر و تصمیم گیری استفاده شود.
تصویر چیست؟
یک تصویر را می توان به عنوان یک تابع دو بعدی F(x,y) نشان داد که در آن x و y مختصات فضایی هستند. دامنه F در یک مقدار خاص x,y به عنوان شدت تصویر در آن نقطه شناخته می شود. اگر x، y و مقدار دامنه محدود باشد، آن را تصویر دیجیتال می نامیم. آرایه ای از پیکسل ها است که در ستون ها و ردیف ها مرتب شده اند. پیکسل ها عناصر یک تصویر هستند که حاوی اطلاعاتی درباره شدت و رنگ هستند. یک تصویر همچنین می تواند به صورت سه بعدی نمایش داده شود که در آن x، y و z به مختصات فضایی تبدیل می شوند. پیکسل ها در قالب یک ماتریس مرتب شده اند. این به عنوان یک تصویر RGB شناخته می شود.
انواع مختلفی از تصاویر وجود دارد:
تصویر RGB: شامل سه لایه تصویر دو بعدی است که این لایه ها، همان کانال های قرمز، سبز و آبی هستند.
تصویر در مقیاس خاکستری: این تصاویر دارای سایه های سیاه و سفید هستند و فقط یک کانال دارند.
الگوریتم های کلاسیک پردازش تصویر
1. پردازش تصویر مورفولوژیکی
پردازش تصویر مورفولوژیکی (Morphological Image Processing) سعی در حذف نواقص از تصاویر باینری دارد، زیرا مناطق باینری تولید شده توسط آستانه ساده می توانند توسط نویز تحریف شوند. همچنین به صاف کردن تصویر با استفاده از عملیات باز و بسته کردن کمک می کند. عملیات مورفولوژیکی را می توان به تصاویر خاکستری مرتبط کرد.
این پروسه شامل عملیات غیر خطی مربوط به ساختار ویژگی های یک تصویر است. این تکنیک یک تصویر را با استفاده از الگوی کوچک به نام عنصر ساختاری که در مکانهای مختلف ممکن در تصویر قرار میگیرد و با پیکسلهای همسایگی مربوطه مقایسه میشود، تجزیه و تحلیل میکند. یک عنصر ساختاری یک ماتریس کوچک با مقادیر 0 و 1 است.
بهتر است دو عملیات اساسی پردازش تصویر مورفولوژیکی، Dilation و Erosion را ببینیم:
- عملیات Dilation: پیکسل ها را به مرزهای جسم در یک تصویر اضافه می کند.
- عملیات Erosion: پیکسل ها را از مرزهای شی حذف می کند.
تعداد پیکسل های حذف شده یا اضافه شده به تصویر اصلی به اندازه عنصر ساختار بستگی دارد.
در این مرحله ممکن است فکر کنید “عنصر ساختاری چیست؟” بگذار توضیح بدهم:
عنصر ساختاری ماتریسی است که فقط از 0 و 1 تشکیل شده است که می تواند هر شکل و اندازه دلخواه داشته باشد. در تمام مکانهای ممکن در تصویر قرار گرفته و با همسایگی پیکسلهای مربوطه مقایسه میشود.
2. پردازش تصویر گاوسی (Gaussian)
تاری گاوسی، که به هموارسازی گاوسی نیز معروف است، نتیجه تار کردن یک تصویر توسط یک تابع گاوسی است. برای کاهش نویز تصویر و کاهش جزئیات استفاده می شود. جلوه بصری این تکنیک محو کردن شبیه به تماشای یک تصویر از طریق صفحه نمایش شفاف است. گاهی اوقات در بینایی کامپیوتر برای بهبود تصویر در مقیاس های مختلف یا به عنوان یک تکنیک تقویت داده در یادگیری عمیق استفاده می شود.
تابع گاوسی مانند مثال زیر است:
در عمل، بهترین کار این است که با تقسیم فرآیند به دو پاس، از خاصیت تفکیک پذیر گاوسی استفاده کنیم. در اولین پاس، از یک هسته یک بعدی برای محو کردن تصویر فقط در جهت افقی یا عمودی استفاده می شود. در پاس دوم از همان هسته یک بعدی برای محو کردن جهت باقی مانده استفاده می شود. اثر حاصل مانند درهم پیچیدن با یک هسته دو بعدی در یک پاس است. بیایید یک مثال ببینیم تا بفهمیم فیلترهای گاوسی با یک تصویر چه می کنند.
3. تبدیل فوریه در پردازش تصویر
تبدیل فوریه یک تصویر را به اجزای سینوس و کسینوس تجزیه می کند. این برنامه چندین برنامه مانند بازسازی تصویر، فشرده سازی تصویر یا فیلتر کردن تصویر دارد. از آنجایی که ما در مورد تصاویر صحبت می کنیم، تبدیل فوریه گسسته را در نظر خواهیم گرفت. بیایید یک سینوسی را در نظر بگیریم، از سه چیز تشکیل شده است:
- بزرگی – مربوط به کنتراست
- فرکانس فضایی – مربوط به روشنایی
- فاز – مربوط به اطلاعات رنگ
تصویر در حوزه فرکانس به صورت زیر است:
4. Edge Detection در پردازش تصویر
تشخیص لبه، یک تکنیک پردازش تصویر برای یافتن مرزهای اشیاء درون تصویر است. با تشخیص ناپیوستگی در روشنایی کار می کند. این فرایند می تواند در استخراج اطلاعات مفید از تصویر بسیار مفید باشد زیرا بیشتر اطلاعات شکل در لبه ها محصور شده است. روشهای کلاسیک تشخیص لبه با تشخیص ناپیوستگی در روشنایی کار میکنند.
در صورت تشخیص نویز در تصویر در حالی که تغییرات سطوح خاکستری را تشخیص می دهد، می تواند به سرعت واکنش نشان دهد. لبه ها به عنوان ماکزیمم محلی گرادیان تعریف می شوند. رایج ترین الگوریتم تشخیص لبه، الگوریتم تشخیص لبه سوبل است. اپراتور تشخیص سوبل از هسته های کانولوشنال 3*3 تشکیل شده است. یک هسته ساده Gx و یک هسته 90 درجه چرخش Gy. اندازه گیری های جداگانه با اعمال هر دو هسته به طور جداگانه روی تصویر انجام می شود.
5. پردازش تصویر موجک
ما یک تبدیل فوریه را دیدیم اما فقط به فرکانس محدود می شود. موجک ها هم زمان و هم فرکانس را در نظر می گیرند. این تبدیل برای سیگنال های غیر ثابت مناسب است. می دانیم که لبه ها یکی از بخش های مهم تصویر هستند، در حالی که با اعمال فیلترهای سنتی متوجه شده ایم که نویز حذف می شود اما تصویر تار می شود. تبدیل موجک به گونه ای طراحی شده است که وضوح فرکانس خوبی برای اجزای فرکانس پایین بدست آوریم. در زیر مثال تبدیل موجک دو بعدی آمده است:
پردازش تصویر با پایتون توسط شبکه های عصبی
شبکه های عصبی شبکه های چند لایه ای هستند که از نورون ها یا گره ها تشکیل شده اند. این نورون ها واحدهای پردازشی اصلی شبکه عصبی هستند. آنها طوری طراحی شده اند که مانند مغز انسان عمل کنند. آنها داده ها را دریافت می کنند، خود را آموزش می دهند تا الگوهای موجود در داده ها را تشخیص دهند و سپس خروجی را پیش بینی کنند. یک شبکه عصبی پایه دارای سه لایه است:
- لایه ورودی
- لایه پنهان
- لایه خروجی
پردازش تصویر با پایتون یکی از کاربرد های پایتون است که بسیاری از فعالیت های حرفه ای در دنیای امروزی وابسته به این تکنولوژی می باشد. لایه های ورودی، ورودی را دریافت می کنند، لایه خروجی خروجی را پیش بینی می کند و لایه های پنهان بیشتر محاسبات را انجام می دهند. تعداد لایه های پنهان را می توان با توجه به نیازها تغییر داد. حداقل باید یک لایه پنهان در یک شبکه عصبی وجود داشته باشد.
اساس کار پردازش تصویر با پایتون چگونه است؟ (بر اساس شبکه عصبی) :
- بیایید یک تصویر را در نظر بگیریم، هر پیکسل به عنوان ورودی به هر نورون لایه اول تغذیه می شود، نورون های یک لایه از طریق کانال ها به نورون های لایه بعدی متصل می شوند.
- به هر یک از این کانال ها یک مقدار عددی به نام وزن اختصاص داده می شود.
- ورودی ها در وزن های مربوطه ضرب می شوند و این مجموع وزنی سپس به عنوان ورودی به لایه های پنهان داده می شود.
- خروجی از لایه های پنهان از طریق یک تابع فعال سازی منتقل می شود که تعیین می کند آیا نورون خاص فعال می شود یا خیر.
- نورون های فعال شده، داده ها را به لایه های پنهان بعدی منتقل می کنند. به این ترتیب داده ها از طریق شبکه منتشر می شوند که به آن انتشار به جلو می گویند.
- در لایه خروجی، نورونی با بالاترین مقدار، خروجی را پیش بینی می کند. این خروجی ها مقادیر احتمال هستند.
- خروجی پیش بینی شده با خروجی واقعی مقایسه می شود تا خطا بدست آید. سپس این اطلاعات از طریق شبکه بازگردانده می شود، این فرآیند به عنوان Backpropagation شناخته می شود.
- بر اساس این اطلاعات، وزن ها تنظیم می شوند. این چرخه انتشار به جلو و عقب چندین بار روی چندین ورودی انجام می شود تا زمانی که شبکه در اکثر موارد خروجی را به درستی پیش بینی کند.
- این به فرآیند آموزش شبکه عصبی پایان می دهد. زمان صرف شده برای آموزش شبکه عصبی ممکن است در برخی موارد زیاد شود.
- در تصویر زیر ai مجموعه ورودیها، wi وزنها، z خروجی و g هر تابع فعالسازی است.
در اینجا چند دستورالعمل برای آماده سازی داده ها برای پردازش تصویر آورده شده است.
- در پردازش تصویر با پایتون، داده های بیشتری باید به مدل داده شود تا نتایج بهتری حاصل آید.
- مجموعه داده های تصویر باید از کیفیت بالایی برخوردار باشند تا اطلاعات واضح تری به دست آورید، اما برای پردازش آنها ممکن است به شبکه های عصبی عمیق تری نیاز داشته باشید.
- در بسیاری از موارد تصاویر RGB قبل از تغذیه به شبکه عصبی به مقیاس خاکستری تبدیل می شوند.
ابزار های پردازش تصویر در پایتون
1. OpenCV
مخفف عبارت Open Source Computer Vision Library است. این کتابخانه شامل بیش از 2000 الگوریتم بهینه شده است که برای بینایی کامپیوتر و یادگیری ماشین مفید است. روش های مختلفی برای استفاده از opencv در پردازش تصویر وجود دارد که در زیر به چند مورد اشاره می شود:
- تبدیل تصاویر از یک فضای رنگی به فضای دیگر مانند بین BGR و HSV، BGR و خاکستری و غیره.
- انجام آستانه گذاری روی تصاویر، مانند آستانه گذاری ساده، آستانه گذاری تطبیقی و غیره.
- صاف کردن تصاویر، مانند اعمال فیلترهای سفارشی بر روی تصاویر و محو کردن تصاویر.
- انجام عملیات ریخت شناسی روی تصاویر.
- ساخت اهرام تصویری
- استخراج پیش زمینه از تصاویر با استفاده از الگوریتم GrabCut.
- تقسیم بندی تصویر با استفاده از الگوریتم حوضه آبخیز
2. Scikit-Image
Scikit-Image یک کتابخانه منبع باز است که برای پیش پردازش تصویر استفاده می شود. از یادگیری ماشین با توابع داخلی استفاده می کند و می تواند عملیات پیچیده ای را روی تصاویر تنها با چند عملکرد انجام دهد. با آرایههای numpy کار میکند و حتی برای کسانی که تازه وارد پایتون شدهاند، یک کتابخانه نسبتاً ساده است. برخی از عملیاتی هایی که می توان با استفاده از تصویر scikit انجام داد عبارتند از:
- برای پیاده سازی عملیات آستانه گذاری از متد try_all_threshold() روی تصویر استفاده کنید. از هفت الگوریتم آستانه جهانی استفاده خواهد کرد.
- برای پیاده سازی تشخیص لبه از متد sobel() در ماژول فیلترها استفاده کنید. این روش به یک تصویر 2 بعدی در مقیاس خاکستری به عنوان ورودی نیاز دارد، بنابراین باید تصویر را به مقیاس خاکستری تبدیل کنیم.
- برای پیاده سازی هموارسازی گاوسی از روش ()gaussian در ماژول فیلترها استفاده کنید.
- برای اعمال یکسان سازی هیستوگرام، از ماژول نوردهی، برای اعمال یکسان سازی هیستوگرام معمولی بر روی تصویر اصلی، از روش ()qualize_hist و برای اعمال یکسان سازی تطبیقی، از روش ()qualize_adapthist استفاده کنید.
- برای چرخاندن تصویر از تابع rotate() در زیر ماژول تبدیل استفاده کنید.
- برای تغییر مقیاس تصویر از تابع rescale() از ماژول تبدیل استفاده کنید.
- برای اعمال عملیات مورفولوژیکی از تابع binary_erosion() و binary_dilation() در زیر ماژول مورفولوژی استفاده کنید.
3.PIL/pillow کتابخانه پردازش تصویر
PIL مخفف Python Image Library و Pillow چنگال PIL توسط Alex Clark و Contributors است. این یکی از کتابخانه های قدرتمند است. این کتابخانه پردازش تصویر طیف گسترده ای از فرمت های تصویر مانند PPM، JPEG، TIFF، GIF، PNG و BMP پشتیبانی می کند.
این فریم ورک می تواند به شما کمک کند چندین عملیات را روی تصاویر انجام دهید، مانند چرخش، تغییر اندازه، برش، مقیاس خاکستری و غیره. اجازه دهید برخی از این عملیات ها را مرور کنیم. برای انجام عملیات دستکاری ماژولی در این کتابخانه وجود دارد به نام Image.
- برای بارگذاری یک تصویر از متد open() استفاده کنید.
- برای نمایش تصویر از متد show() استفاده کنید.
- برای شناخت فرمت فایل از ویژگی format استفاده کنید
- برای دانستن اندازه تصویر از ویژگی اندازه استفاده کنید
- برای اطلاع از فرمت پیکسلی از ویژگی mode استفاده کنید.
- برای ذخیره فایل تصویر پس از پردازش دلخواه، از روش save() استفاده کنید. Pillow فایل تصویر را با فرمت png ذخیره می کند.
- برای تغییر اندازه تصویر از متد resize() استفاده کنید که دو آرگومان به عنوان عرض و ارتفاع می گیرد.
- برای برش تصویر، از متد crop() استفاده کنید که یک آرگومان را بهعنوان تاپل جعبهای میگیرد که موقعیت و اندازه منطقه برشخورده را مشخص میکند.
- برای چرخاندن تصویر از متد rotate() استفاده کنید که یک آرگومان را به عنوان عدد صحیح یا عدد شناور نشان دهنده درجه چرخش می گیرد.
4. کتابخانه پردازش تصویر NumPy
با استفاده از این کتابخانه میتوانید تکنیکهای ساده تصویر مانند ورق زدن تصاویر، استخراج ویژگیها و تجزیه و تحلیل آنها را نیز انجام دهید. تصاویر را می توان با آرایه های چند بعدی numpy نشان داد و بنابراین نوع آنها NdArrays است. یک تصویر رنگی یک آرایه بی رنگ با 3 بعد است. با برش آرایه چند بعدی می توان کانال های RGB را از هم جدا کرد.
در زیر برخی از عملیاتی که می توان با استفاده از NumPy روی تصویر انجام داد (تصویر در متغیری به نام test_img با استفاده از imread بارگذاری می شود) آورده شده است.
- برای چرخاندن تصویر در جهت عمودی، از np.flipud(test_img) استفاده کنید.
- برای چرخاندن تصویر در جهت افقی، از np.fliplr(test_img) استفاده کنید.
- برای معکوس کردن تصویر، از test_img[::-1] استفاده کنید (تصویر پس از ذخیره آن به عنوان آرایه numpy به عنوان نامگذاری می شود).
- برای افزودن فیلتر به تصویر می توانید این کار را انجام دهید:
به عنوان مثال: np.where (test_img > 150, 255, 0)، این می گوید که در این تصویر اگر چیزی با 150 پیدا کردید، آن را با 255 جایگزین کنید، در غیر این صورت 0.
- همچنین می توانید کانال های RGB را جداگانه نمایش دهید. این کار را می توان با استفاده از این قطعه کد انجام داد:
برای بدست آوردن کانال قرمز، test_img[:,:,0]، برای بدست آوردن کانال سبز، test_img[:,:,1] و برای بدست آوردن کانال آبی، test_img را انجام دهید[:,:,2].
خلاصه
در این مقاله به طور خلاصه در مورد پردازش تصویر با پایتون که با استفاده از فیلتر مورفولوژیکی، فیلتر گاوسی، تبدیل فوریه و تبدیل موجک قابل انجام است توضیح دادیم. همه اینها را می توان با استفاده از کتابخانه های مختلف پردازش تصویر مانند OpenCV، Mahotas، PIL، scikit-learn انجام داد.
نحوه انجام پردازش تصویر با برنامه نویسی پایتون ممکن است با توجه به تصویری که شما در نظر گرفته اید و فرمت های مختلف تصویر تفاوت داشته باشد. به همین دلیل برای ورود به حوزه پردازش تصویر با PYTHON باید به صورت کلی عملکرد کتابخانه های موجود را مورد بررسی قرار دهید. همچنین قبل از شروع کار با کتابخانه های پایتون، باید این زبان برنامه نویسی را یاد بگیرید. برای این کار نیز می توانید نقشه یادگیری پایتون را مطالعه کنید. در صورتی که نیاز به برنامه ریزی بیشتری دارید و به دنبال پاسخ سوال “یادگیری پایتون چقدر زمان میبرد؟” هستید نیز می توانید این مطلب از سایت را مطالعه کنید.
درباره مدیریت
من عاشق برنامه نویسی و تکنولوژی هستم و 10 سال در این زمینه مشغول به فعالیت هستم و پروژه های مختلفی رو در زمینه های سایت و شبکه های کامپیوتری و امنیت اطلاعات انجام دادم و در حال حاضر مدیر و موسس شرکت انفورماتیک طراحی پایا آنوش هستم که در زمینه ی طراحی سایت و سیستم های هوشمند و برقراری امنیت اطلاعات سیستم های کامپیوتری و همچنین آموزش فعالیت دارد و میخواهم هر آنچه که در طی این 10 سال یاد گرفتم و تجربه کردم رو با شما به اشتراک بگذارم.
نوشته های بیشتر از مدیریت
دیدگاهتان را بنویسید