با پیشرفت تکنولوژی، پردازش تصویر تبدیل به جز لاینفک اتوماسیون شده است، چه اتوماسیون اداری و چه اتوماسیون صنعتی. کتابخانههای متنوعی برای آماده سازی توابع استاندارد، فیلترهای متداول و الگوریتمهای توسعه داده شده پر کاربرد در پردازش تصویر ارائه شده اند. در این میان شاید بتوان گفت معروف ترین آنها کتابخانه 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()
خروجی نیز به شکل زیر میباشد: