در این پست ، به آموزش پردازش تصویر با کتابخانه Scikit-image در پایتون خواهیم پرداخت و نحوه نصب و کار کردن با این کتابخانه ارزشمند برای پردازش تصویر را به شما خواهیم آموخت.
[lwptoc]
در ادامه مباحث آموزش پردازش تصویر در پایتون و معرفی کتابخانه های مهم پردازش تصویر در پایتون به کتابخانه Scikit-image می پردازیم.
مقدمه : آشنایی با Scikit-image
Scikit-image یک کتابخانه متن باز پردازش تصویر برای پایتون است که بر مبنای کتابخانه محاسبات علمی NumPy و SciPy توسعه یافته است.
الگوریتمهای متنوعی از مباحث قسمت بندی تصاویر، تبدیلات هندسی، کار در فضای رنگ، آنالیز تصاویر، فیلترینگ، ریخت شناسی (Morphology)، تشخیص ویژگیها و … همراه این کتابخانه در دسترس میباشد.
نصب کتابخانه Scikit-image
این کتابخانه در آدرس اینجا معرفی شده است . برای نصب کتابخانه پردازش تصویر Scikit-image کافی است کد زیر را استفاده کنید:
1 |
pip install scikit-image |
برای استفاده از کتابخانه فوق در کد خود نیز کافی است آن را ایمپورت کنید و از ماژول های مختلف آن بسته به نیاز خود استفاده کنید.
این بسته را میتوان با استفاده از skimage در زبان پایتون import کرد.
همچنین، بسیاری از توابع و الگوریتمهای پیادهسازی شده را میتوان در «زیر واحدهای» (Submodules) این بسته برنامهنویسی پیدا کرد و مورد استفاده قرار داد. در ادامه، برخی از فرایندهای پردازش تصویر با پایتون که توسط ابزار SciKit-Image قابل انجام است، نمایش داده خواهد شد.
مثال پردازش تصویر با Scikit-image
مثال های مختلفی از کارکردن با کتابخانه در لینک زیر قرار داده شده است که هم برای آموزش و هم برای استفاده و کارکردن با تصاویر در پایتون خیلی میتواند مفید واقع شود :
https://scikit-image.org/docs/dev/auto_examples/
مثال : اعمال فیلتر میانگین بر روی تصویر
بعنوان مثال در کد زیر میخواهیم که فیلتر میانگین یا Mean Filter را بر روی تصویری اعمال کنیم :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
import matplotlib.pyplot as plt from skimage import data from skimage.morphology import disk from skimage.filters import rank image = data.coins() selem = disk(20) percentile_result = rank.mean_percentile(image, selem=selem, p0=.1, p1=.9) bilateral_result = rank.mean_bilateral(image, selem=selem, s0=500, s1=500) normal_result = rank.mean(image, selem=selem) fig, axes = plt.subplots(nrows=2, ncols=2, figsize=(10, 10), sharex=True, sharey=True) ax = axes.ravel() titles = ['Original', 'Percentile mean', 'Bilateral mean', 'Local mean'] imgs = [image, percentile_result, bilateral_result, normal_result] for n in range(0, len(imgs)): ax[n].imshow(imgs[n], cmap=plt.cm.gray) ax[n].set_title(titles[n]) ax[n].axis('off') plt.tight_layout() plt.show() |
کد فوق ابتدا تصویر Coin را لود میکند و سپس سه نوع فیلتر میانگین را بر روی آن اعمال کرده و در نهایت هر 4 تصویر را نمایش میدهد.
خروجی کد فوق به صورت زیر می باشد:
مثال : فیلتر گذاری بر روی عکس
«فیلتر گذاری روی تصاویر» (Image Filtering): با استفاده از این ابزار، میتوان فیلترهای «بالاگذر» (High Pas) و «پایین گذر» (Low Pass) را جهت انجام پردازشهایی نظیر «تشخیص لبه» (Edge Detection) روی تصاویر اعمال کرد.
1 2 3 4 5 6 7 8 9 |
import matplotlib.pyplot as plt %matplotlib inline from skimage import data,filters image = data.coins() # ... or any other NumPy array! edges = filters.sobel(image) plt.imshow(edges, cmap='gray') |
خروجی کد فوق بصورت زیر می باشد:
مثال : تشخیص چهره در عکس
کد زیر نیز به راحتی و در زمان کوتاهی قادر به تشخیص چهره افراد در تصویر می باشد:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
from skimage import data from skimage.feature import Cascade import matplotlib.pyplot as plt from matplotlib import patches # Load the trained file from the module root. trained_file = data.lbp_frontal_face_cascade_filename() # Initialize the detector cascade. detector = Cascade(trained_file) img = data.astronaut() detected = detector.detect_multi_scale(img=img, scale_factor=1.2, step_ratio=1, min_size=(60, 60), max_size=(123, 123)) plt.imshow(img) img_desc = plt.gca() plt.set_cmap('gray') for patch in detected: img_desc.add_patch( patches.Rectangle( (patch['c'], patch['r']), patch['width'], patch['height'], fill=False, color='r', linewidth=2 ) ) plt.show() |
برای دانلود کد فوق ، و توضیحات بیشتر میتوانید اینجا را مطالعه کنید.
خروجی کد فوق به صورت زیر می باشد:
مثال تطبیق الگو در پایتون با SciKit-Image:
«تطبیق الگو» (Template Matching): در کاربردهای پردازش تصویر، برای تشخیص ظاهر شدن یک تصویر الگو در یک یا مجموعهای از تصاویر دیگر، از الگوریتمهای تطبیق الگو استفاده میشود.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
import numpy as np import matplotlib.pyplot as plt from skimage import data from skimage.feature import match_template image = data.coins() coin = image[170:220, 75:130] result = match_template(image, coin) ij = np.unravel_index(np.argmax(result), result.shape) x, y = ij[::-1] fig = plt.figure(figsize=(8, 3)) ax1 = plt.subplot(1, 3, 1) ax2 = plt.subplot(1, 3, 2) ax3 = plt.subplot(1, 3, 3, sharex=ax2, sharey=ax2) ax1.imshow(coin, cmap=plt.cm.gray) ax1.set_axis_off() ax1.set_title('template') ax2.imshow(image, cmap=plt.cm.gray) ax2.set_axis_off() ax2.set_title('image') # highlight matched region hcoin, wcoin = coin.shape rect = plt.Rectangle((x, y), wcoin, hcoin, edgecolor='r', facecolor='none') ax2.add_patch(rect) ax3.imshow(result) ax3.set_axis_off() ax3.set_title('`match_template`\nresult') # highlight matched region ax3.autoscale(False) ax3.plot(x, y, 'o', markeredgecolor='r', markerfacecolor='none', markersize=10) plt.show() |
نتیجه حاصل از کد فوق را در تصویر زیر میتوانید ببینید:
جمع بندی :
همانطور که از مثال های فوق متوجه شدید ، کتابخانه ، یک ابزار قدرتمند برای پردازش تصویر در پایتون می باشد که به راحتی میتوانید در آن کارهایی مثل دستکاری تصویر یا بهبود تصویر را انجام دهید. اگر تجربه کار با این کتابخانه را دارید خوشحال میشوم که نظرات خود را با بنده و دوستانی که این مطلب را میخوانند به اشتراک بگذارید.