فهرست بستن

معرفی کتابخانه پردازش تصویر Scikit-Image

با پیشرفت تکنولوژی، پردازش تصویر تبدیل به جز لاینفک اتوماسیون شده است، چه اتوماسیون اداری و چه اتوماسیون صنعتی. کتابخانه‌های متنوعی برای آماده سازی توابع استاندارد، فیلترهای متداول و الگوریتمهای توسعه داده شده پر کاربرد در پردازش تصویر ارائه شده اند. در این میان شاید بتوان گفت معروف ترین آنها کتابخانه OpenCV باشد. ولی در این نوشته کتابخانه دیگری که مبتنی بر کتابخانه محاسبات علمی NumPy و SciPy می‌باشد یعنی Scikit-Image معرفی می‌گردد.

بسم الله الرحمن الرحیم

Scikit-image یک کتابخانه متن باز پردازش تصویر برای پایتون است که بر مبنای کتابخانه محاسبات علمی NumPy و SciPy توسعه یافته است. الگوریتم‌های متنوعی از مباحث قسمت بندی تصاویر، تبدیلات هندسی، کار در فضای رنگ، آنالیز تصاویر، فیلترینگ، ریخت شناسی (Morphology)، تشخیص ویژگی‌ها و … همراه این کتابخانه در دسترس می‌باشد.

آدرس گیت هاب کتابخانه Scikit-Image

الگوریتم‌های پایه ای این کتابخانه پردازش تصویر برای داشتن عملکرد بالا از جهت سرعت اجرا با استفاده از Cython نوشته شده اند. این کتابخانه در کنار کتابخانه یادگیری ماشین Scikit-Learn می‌تواند گزینه مناسبی برای انجام پروژه‌های بینایی ماشین باشد. نحوه نصب این کتابخانه با استفاده از ابزار pip به شکل زیر می‌باشد:

pip install scikit-image

مثال‌های متعدد و کاربردی برای شروع استفاده از کتابخانه توسط سایت آن ارائه شده است که از آدرس زیر قابل دسترسی است:

مثال‌های عمومی با استفاده از Scikit-Image

مثالهای موجود در شاخه های مختلفی از قبیل بهبود رنگ، پیدا کردن و کار با لبه ها خطوط در تصویر، تشخیص ویژگی‌ها و اشیاء، فیلترینگ و ترمیم تصویر، تقسیم بندی تصاویر، تبدیل‌های هندسی و … می‌باشد.

برای آشنایی بیشتر از بین مثالها کد زیر را می‌توان دید که در آن با استفاده از الگوریتم دوگلاس-پیوکر اقدام به تقریب اشکال با چند ضلعی شده است:

from __future__ import print_function

import numpy as np
import matplotlib.pyplot as plt

from skimage.draw import ellipse
from skimage.measure import find_contours, approximate_polygon, \
    subdivide_polygon


hand = np.array([[1.64516129, 1.16145833],
                 [۱٫۶۴۵۱۶۱۲۹, ۱٫۵۹۳۷۵],
                 [۱٫۳۵۰۸۰۶۴۵, ۱٫۹۲۱۸۷۵],
                 [۱٫۳۷۵, ۲٫۱۸۲۲۹۱۶۷],
                 [۱٫۶۸۵۴۸۳۸۷, ۱٫۹۳۷۵],
                 [۱٫۶۰۸۸۷۰۹۷, ۲٫۵۵۲۰۸۳۳۳],
                 [۱٫۶۸۵۴۸۳۸۷, ۲٫۶۹۷۹۱۶۶۷],
                 [۱٫۷۶۲۰۹۶۷۷, ۲٫۵۶۷۷۰۸۳۳],
                 [۱٫۸۳۰۶۴۵۱۶, ۱٫۹۷۳۹۵۸۳۳],
                 [۱٫۸۹۵۱۶۱۲۹, ۲٫۷۵],
                 [۱٫۹۵۱۶۱۲۹, ۲٫۸۴۸۹۵۸۳۳],
                 [۲٫۰۱۲۰۹۶۷۷, ۲٫۷۶۰۴۱۶۶۷],
                 [۱٫۹۹۱۹۳۵۴۸, ۱٫۹۹۴۷۹۱۶۷],
                 [۲٫۱۱۲۹۰۳۲۳, ۲٫۶۳۰۲۰۸۳۳],
                 [۲٫۲۰۱۶۱۲۹, ۲٫۷۳۴۳۷۵],
                 [۲٫۲۵۴۰۳۲۲۶, ۲٫۶۰۴۱۶۶۶۷],
                 [۲٫۱۴۹۱۹۳۵۵, ۱٫۹۵۳۱۲۵],
                 [۲٫۳۰۶۴۵۱۶۱, ۲٫۳۶۹۷۹۱۶۷],
                 [۲٫۳۹۱۱۲۹۰۳, ۲٫۳۶۹۷۹۱۶۷],
                 [۲٫۴۱۵۳۲۲۵۸, ۲٫۱۸۷۵],
                 [۲٫۱۷۳۳۸۷۱, ۱٫۷۰۳۱۲۵],
                 [۲٫۰۷۷۸۲۲۵۸, ۱٫۱۶۶۶۶۶۶۷]])

# subdivide polygon using 2nd degree B-Splines
new_hand = hand.copy()
for _ in range(5):
    new_hand = subdivide_polygon(new_hand, degree=2, preserve_ends=True)

# approximate subdivided polygon with Douglas-Peucker algorithm
appr_hand = approximate_polygon(new_hand, tolerance=0.02)

print("Number of coordinates:", len(hand), len(new_hand), len(appr_hand))

fig, (ax1, ax2) = plt.subplots(ncols=2, figsize=(9, 4))

ax1.plot(hand[:, 0], hand[:, 1])
ax1.plot(new_hand[:, 0], new_hand[:, 1])
ax1.plot(appr_hand[:, 0], appr_hand[:, 1])


# create two ellipses in image
img = np.zeros((800, 800), 'int32')
rr, cc = ellipse(250, 250, 180, 230, img.shape)
img[rr, cc] = 1
rr, cc = ellipse(600, 600, 150, 90, img.shape)
img[rr, cc] = 1

plt.gray()
ax2.imshow(img)

# approximate / simplify coordinates of the two ellipses
for contour in find_contours(img, 0):
    coords = approximate_polygon(contour, tolerance=2.5)
    ax2.plot(coords[:, 1], coords[:, 0], '-r', linewidth=2)
    coords2 = approximate_polygon(contour, tolerance=39.5)
    ax2.plot(coords2[:, 1], coords2[:, 0], '-g', linewidth=2)
    print("Number of coordinates:", len(contour), len(coords), len(coords2))

ax2.axis((0, 800, 0, 800))

plt.show()

خروجی نیز به شکل زیر می‌باشد: