پردازش تصویر با پایتون — راهنمای کاربردی

در این مطلب، با مبحث پردازش تصویر با پایتون آشنا خواهید شد. «پردازش تصویر» (Image Processing) یکی از حوزههای تأثیرگذار و مهم در «هوش مصنوعی» (Artificial Intelligence) محسوب میشود و در حوزههای دیگر نظیر «بینایی کامپیوتر» (Computer Vision) و استخراج اطلاعات بامعنی از دادههای تصویری، نقش بسیار مهمی ایفا میکند.
اگرچه بسیاری از کاربران، برنامهنویسان و یا توسعهدهندگان برنامههای کاربردی، از محیط و زبان برنامهنویسی «متلب» (MATLAB) جهت توسعه برنامههای کاربردی مرتبط با حوزه پردازش تصویر استفاده میکنند، با این حال «زبان برنامهنویسی پایتون» (Python Programming Language) ابزارهای بسیار مفید و کاربردی جهت پردازش و «دستکاری» (Manipulation) تصاویر دیجیتالی در اختیار این دسته از افراد قرار میدهد. در این مطلب، برخی از مهمترین ابزارهای پردازش تصویر با پایتون و دستکاری تصاویر دیجیتالی در این زبان برنامهنویسی محبوب مورد بررسی قرار میگیرند.
در «علوم کامپیوتر» (Computer Science)، به استفاده از الگوریتمهای کامپیوتری برای انجام عملیات پردازش تصویر روی تصاویر دیجیتالی، «پردازش تصاویر دیجیتال» (Digital Image Processing) گفته میشود. معمولا از الگوریتمهای پردازش تصاویر دیجیتال جهت «تحلیل تصاویر» (Image Analysis)، دستکاری تصاویر، «بهبود تصاویر» (Image Enhancement)، استخراج اطلاعات مفید از تصاویر و یا بهینهسازی «ویژگیهای مشخصه» (Characteristics) تصاویر دیجیتال استفاده میشود. در این مطلب، قرار است مهمترین ابزارهای پردازش تصویر با پایتون معرفی میشوند.
پردازش تصویر با پایتون
تاکنون ابزارهای متنوعی برای پردازش تصویر با پایتون معرفی شدهاند. این دسته از ابزارها، «کتابخانهها» (Libraries) و «بستههای» (Packages) برنامهنویسی، امکانات بسیار متنوع و مفیدی برای «تبدیل تصاویر» (Image Transformation)، فهمیدن اطلاعات موجود در این دادهها و به طور کلی، دستکاری و پردازش تصاویر در اختیار کاربران و برنامهنویسان قرار میدهند. به عبارت دیگر، ابزارهای پردازش تصویر با پایتون به کاربران این امکان را میدهند تا به شکل بسیار ساده و «شهودی» (Intuitive) دادههای تصویری را تحلیل و اطلاعات بامعنی از آنها استخراج کنند.
جهان امروز و زندگی انسانها، توسط دادهها احاطه شدهاند و تصاویر بخش عمدهای از این دادهها را تشکیل میدهند. با این حال، پیش از اینکه تصاویر دیجیتالی قابل استفاده شوند نیاز است تا پردازش، تحلیل و دستکاری شوند؛ پردازش، تحلیل و دستکاری تصاویر، با هدف بهبود کیفیت آنها یا استخراج اطلاعات مفید از تصاویر انجام میشود.
زبان پایتون میتواند به عنوان ابزاری برای انجام عملیات پردازشی روی تصاویر دیجیتالی مورد استفاده قرار بگیرد. از جمله متداولترین فرایندهای پردازش تصویر با پایتون که توسط ابزارها و کتابخانههای این زبان برنامهنویسی قابل اجرا هستند، میتوان به مواردی نظیر «برش» (Cropping)، «برعکس کردن» (Flipping)، «چرخاندن» (Rotating)، «قطعهبندی تصویر» (Image Segmentation)، «دستهبندی تصویر» (Image Classification)، «استخراج ویژگی» (Feature Extraction)، «ترمیم تصاویر» (Image Restoration) و «بازشناسی تصویر» (Image Recognition) اشاره کرد.
زبان برنامهنویسی پایتون ابزار بسیار مناسبی برای عملکردهای ذکر شده در حوزه پردازش تصویر محسوب میشود. شاید تا چند سال پیش و با توجه به وجود ابزاری نظیر متلب و یکهتازی آن در این حوزه، ایده پردازش تصویر با پایتون و استفاده از آن برای دستکاری تصاویر، ایده بسیار ابتدایی و ناکارآمدی محسوب میشد. ولی در چند سال اخیر، محبوبیت زبان پایتون به عنوان یک «زبان برنامهنویسی علمی» (Scientific Programming Language)، در میان جامعه برنامهنویسان به شدت افزایش یافته است. همچنین، محبوبیت روز افزون این زبان برنامهنویسی سبب شده است تا ابزارهای بسیار پیشرفته پردازش تصویر، به طور رایگان، به عنوان بخشی از اکوسیستم این زبان برنامهنویسی در دسترس کاربران و برنامهنویسان قرار بگیرد.
در این مطلب، با 10 ابزار و کتابخانه مهم و پرکاربرد جهت دستکاری و پردازش تصویر با پایتون آشنا خواهید شد. این دسته از ابزارها و کتابخانههای برنامهنویسی، فرایند تحلیل تصاویر دیجیتال، استخراج اطلاعات با معنی از آنها و در نتیجه، پردازش تصویر با پایتون را برای کاربران و برنامهنویسان آسان میکنند.
پردازش تصاویر با پایتون با ابزار SciKit-Image
ابزار SciKit-Image، یک بسته برنامهنویسی «منبع باز» (Open Source) است که با ساختار آرایهای تعریف شده توسط کتابخانه NumPy کار میکند. این ابزار، یکی از مهمترین کتابخانههای پردازش تصویر با پایتون محسوب میشود که به طور رایگان در دسترس کاربران و برنامهنویسان قرار گرفته شده است. در بسته SciKit-Image، مجموعهای از الگوریتمها و ابزارهای پردازش تصویر، جهت استفاده در کاربردهای تحقیقاتی، آموزشی و صنعتی در اختیار کاربران قرار داده شده است.
کار کردن با توابع و الگوریتمهای SciKit-Image (که جهت پردازش تصویر با پایتون استفاده میشوند)، حتی برای کسانی که برنامهنویس مبتدی هستند و آشنایی ابتدایی از اکوسیستم پایتون دارند، بسیار ساده و سر راست است. کدهای پیادهسازی شده در ابزار SciKit-Image از کیفیت بسیار بالایی برخوردارند و توسط جامعه برنامهنویسی بسیار فعال و متشکل از برنامهنویسان داوطلب پشتیبانی و بهروزرسانی میشوند.
این بسته را میتوان با استفاده از skimage در زبان پایتون import کرد. همچنین، بسیاری از توابع و الگوریتمهای پیادهسازی شده را میتوان در «زیر واحدهای» (Submodules) این بسته برنامهنویسی پیدا کرد و مورد استفاده قرار داد. در ادامه، برخی از فرایندهای پردازش تصویر با پایتون که توسط ابزار SciKit-Image قابل انجام است، نمایش داده خواهد شد.
«فیلتر گذاری روی تصاویر» (Image Filtering): با استفاده از این ابزار، میتوان فیلترهای «بالاگذر» (High Pas) و «پایین گذر» (Low Pass) را جهت انجام پردازشهایی نظیر «تشخیص لبه» (Edge Detection) روی تصاویر اعمال کرد.
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')
«تطبیق الگو» (Template Matching): یکی از سادهترین فرایندهای پردازش تصویر با پایتون و ابزار SciKit-Image، تطبیق الگو است. در کاربردهای پردازش تصویر، برای تشخیص ظاهر شدن یک تصویر الگو در یک یا مجموعهای از تصاویر دیگر، از الگوریتمهای تطبیق الگو استفاده میشود.
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()
کتابخانه Numpy و پردازش تصویر با پایتون
کتابخانه Numpy یکی از کتابخانههای برنامهنویسی کلیدی در زبان برنامهنویسی پایتون محسوب میشود که پشتیبانی از «نوع دادهای آرایه» (Array Datatype) را در پایتون فراهم میکند. این کتابخانه، یکی از مهمترین کتابخانههای توسعه داده شده برای کاربردهای پردازش تصویر با پایتون نیز محسوب میشود که به طور رایگان در دسترس کاربران و برنامهنویسان قرار گرفته شده است.
به طور کلی، یک «تصویر» (Image) یک آرایه استاندارد قابل تعریف توسط کتابخانه Numpy محسوب میشود که شامل پیکسلهای متناظر با نقاط دادهای خواهد بود. بنابراین، با استفاده از عملیات پایهای تعریف شده در Numpy نظیر «بخشبندی» (Slicing)، «پوشش گذاری» (Masking)، «شاخص گذاری چندگانه» (Fancy Indexing) و سایر موارد، کاربر قادر خواهد بود تا مقادیر پیکسلهای یک تصویر را تغییر دهد. در کاربردهای پردازش تصویر با پایتون و کتابخانه Numpy، میتوان از کتابخانه skimage برای بارگذاری تصاویر و از کتابخانه Matplotlib جهت نمایش آنها استفاده کرد. در ادامه، برخی از فرایندهای پردازش تصویر با پایتون که توسط کتابخانه Numpy قابل انجام است، نمایش داده خواهد شد.
«پوشش گذاری تصاویر» (Image Masking): یکی از فرایندهای پایهای در پردازش تصویر محسوب میشود که به وسیله آن، بخشهایی از یک تصویر پنهان و بخشهای دیگر موجود در تصویر نمایان میشوند.
import numpy as np from skimage import data import matplotlib.pyplot as plt %matplotlib inline image = data.camera() type(image) numpy.ndarray #Image is a NumPy array: mask = image < 87 image[mask]=255 plt.imshow(image, cmap='gray')
کتابخانه SciPy
کتابخانه SciPy یکی دیگر از کتابخانههای کلیدی برای برنامهنویسی علمی در زبان برنامهنویسی پایتون محسوب میشود (همانند Numpy). از این کتابخانه مهم نیز میتوان برای پیادهسازی برخی از کاربردهای پردازش تصویر با پایتون استفاده کرد. کتابخانه SciPy حاوی توابع و الگوریتمهایی است که به راحتی میتوان از آنها برای انجام عملیات (ساده) دستکاری و پردازش تصویر با پایتون استفاده کرد.
به طور ویژه، زیر واحد scipy.ndimage توابع عملیاتی لازم جهت انجام عملیات روی آرایههای چندبُعدی NumPy (آرایههایی که برای نمایش تصاویر، در قالب آرایه، مورد استفاده قرار میگیرند) را فراهم میآورد. هماکنون کتابخانه SciPy، توابع لازم برای «فیلتر گذاری خطی و غیرخطی» (Linear and Non-Linear Filtering)، «مورفولوژی باینری» (Binary Morphology)، «درونیابی تصویر» (Image Interpolation) و «اندازهگیری اشیاء» (Object Measurement) را در اختیار کاربران و برنامهنویسان قرار میدهد. در ادامه، برخی از فرایندهای پردازش تصویر با پایتون که توسط کتابخانه SciPy قابل انجام است، نمایش داده خواهد شد.
استفاده از کتابخانه SciPy جهت «تار کردن تصویر» (Image Blurring) با استفاده از «فیلتر گاوسی» (Gaussian Filter): یکی از فرایندهای ساده پردازش تصویر با پایتون و کتابخانه SciPy، امکان اعمال فیلتر گاوسی روی تصاویر است که معمولا برای تار کردن (Blurring) تصاویر مورد استفاده قرار میگیرد.
from scipy import misc,ndimage face = misc.face() blurred_face = ndimage.gaussian_filter(face, sigma=3) very_blurred = ndimage.gaussian_filter(face, sigma=5) #Results plt.imshow(<image to be displayed>)
from scipy.ndimage import gaussian_filter from scipy import misc import matplotlib.pyplot as plt a = np.arange(50, step=2).reshape((5,5)) gaussian_filter(a, sigma=1) fig = plt.figure() plt.gray() # show the filtered result in grayscale ax1 = fig.add_subplot(121) # left side ax2 = fig.add_subplot(122) # right side ascent = misc.ascent() result = gaussian_filter(ascent, sigma=5) ax1.imshow(ascent) ax2.imshow(result) plt.show()
فیلتر prewitt:
from scipy import ndimage, misc import matplotlib.pyplot as plt fig = plt.figure() plt.gray() # show the filtered result in grayscale ax1 = fig.add_subplot(121) # left side ax2 = fig.add_subplot(122) # right side ascent = misc.ascent() result = ndimage.prewitt(ascent) ax1.imshow(ascent) ax2.imshow(result) plt.show()
فیلتر sobel:
from scipy import ndimage, misc import matplotlib.pyplot as plt fig = plt.figure() plt.gray() # show the filtered result in grayscale ax1 = fig.add_subplot(121) # left side ax2 = fig.add_subplot(122) # right side ascent = misc.ascent() result = ndimage.sobel(ascent) ax1.imshow(ascent) ax2.imshow(result) plt.show()
کتابخانههای PIL و Pillow
کتابخانه PIL که مخفف عبارت Python Imaging Library یا کتابخانه تصویر پایتون است، یکی از کتابخانههای پردازش تصویر با پایتون محسوب میشود. این کتابخانه، پشتیبانی از عملیات مرتبط با پردازش تصویر نظیر باز کردن، دستکاری و ذخیرهسازی تصاویر در فرمتهای مختلف را به زبان پایتون اضافه میکند. با این حال، توسعه آن از سال 2009 دچار وقفه شده است.
خوشبختانه، کتابخانه دیگری به نام Pillow در زبان پایتون وجود دارد که نسخه گسترشیافتهای از کتابخانه PIL محسوب و به طور فعال توسط جامعه برنامهنویسی پایتون پشتیبانی میشود. نصب ساده، قابلیت اجرا در پلتفرمها و سیستمهای عامل اصلی و پشتیبانی از نسخه 3 زبان پایتون، از جمله نقاط قوت این کتابخانه محسوب میشود که توسط برنامهنویسان جهت پردازش تصویر با پایتون مورد استفاده قرار میگیرد.
کتابخانه Pillow مجموعهای از قابلیتهای پردازش تصویر پایه نظیر «عملیات نقطهای» (Point Operations)، فیلتر گذاری با مجموعهای از «کرنلهای پیچشی» (Convolutional Kernels) تعبیه شده و «تبدیلات فضای رنگی» (Color Space Conversion) را در اختیار کاربر و برنامهنویس قرار میدهد. در ادامه، برخی از فرایندهای پردازش تصویر با پایتون که توسط کتابخانههای PIL و Pillow قابل انجام هستند، نمایش داده خواهد شد.
«بهبود تصاویر» (Image Enhancement): با استفاده از ماژول ImageFilter در کتابخانه Pillow، میتوان تصاویر دیجیتالی را از طریق دستکاری مقادیر «کنتراست» (Contrast)، بهبود بخشید.
from PIL import Image,ImageFilter #Read image im = Image.open('image.jpg') #Display image im.show() from PIL import ImageEnhance enh = ImageEnhance.Contrast(im) enh.enhance(1.8).show("30% more contrast") 5-pillow.png
کتابخانه OpenCV-Python
کتابخانه OpenCV که مخفف Open Source Computer Vision Library یا کتابخانه منبع باز بینایی کامپیوتر است، یکی از پراستفادهترین کتابخانههای برنامهنویسی برای کاربردهای «بینایی کامپیوتر» (Computer Vision) محسوب میشود. کتابخانه OpenCV-Python، واسط برنامهنویسی کاربردی (API) برای کتابخانه OpenCV در زبان پایتون محسوب میشود.
این کتابخانه نه تنها از سرعت بسیار بالایی برخوردار است (زیرا کدهای پیادهسازی آن توسط زبان C و C++ نوشته شده است)، بلکه کد نویسی برنامههای کاربردی مرتبط با پردازش تصویر با پایتون و بهکاراندازی (Deploy) آنها را تسهیل میبخشد. چنین ویژگیهایی، کتابخانه OpenCV-Python را به بهترین انتخاب جهت پردازش تصویر با پایتون و پیادهسازی برنامههای بینایی کامپیوتر در این زبان بدل کرده است (به ویژه اگر برنامههای بینایی کامپیوتر توسعه داده شده، به انجام محاسبات ریاضی پیچیده و سنگین نیاز داشته باشند) . در ادامه، برخی از فرایندهای پردازش تصویر با پایتون که توسط کتابخانه OpenCV-Python قابل انجام است، نمایش داده خواهد شد.
«ترکیب تصاویر» (Image Blending): با استفاده از قابلیتی به نام «هرم تصاویر» (Image Pyramid) در OpenCV-Python، میتوان تصاویر متناظر با یک سیب و یک پرتقال را با یکدیگر ترکیب و یک تصویر جدید درست کرد.
کدهایی که در ادامه آوردهایم، به ۲ تصویر «سیب» و «پرتقال» بهعنوان ورودی نیاز دارند و خروجی نیز با تصاویری بهنامهای Direct_blending.jpg و Pyramid_blending2.jpg ذخیره میشود.
برای دانلود تصاویر مورد نیاز در پروژه «ترکیب تصاویر» اینجا کلیک کنید. لازم به ذکر است که پس از دانلود میبایست فایل را از حالت زیپ خارج و تصاویر را در کنار کدها قرار دهید.
import cv2 as cv
import numpy as np,sys
import os
A = cv.imread('apple.jpg')
B = cv.imread('orange.jpg')
assert A is not None, "file could not be read, check with os.path.exists()"
assert B is not None, "file could not be read, check with os.path.exists()"
# generate Gaussian pyramid for A
G = A.copy()
gpA = [G]
for i in range(6):
G = cv.pyrDown(G)
gpA.append(G)
# generate Gaussian pyramid for B
G = B.copy()
gpB = [G]
for i in range(6):
G = cv.pyrDown(G)
gpB.append(G)
# generate Laplacian Pyramid for A
lpA = [gpA[5]]
for i in range(5,0,-1):
GE = cv.pyrUp(gpA[i])
L = cv.subtract(gpA[i-1],GE)
lpA.append(L)
# generate Laplacian Pyramid for B
lpB = [gpB[5]]
for i in range(5,0,-1):
GE = cv.pyrUp(gpB[i])
L = cv.subtract(gpB[i-1],GE)
lpB.append(L)
# Now add left and right halves of images in each level
LS = []
for la,lb in zip(lpA,lpB):
rows,cols,dpt = la.shape
ls = np.hstack((la[:,0:cols//2], lb[:,cols//2:]))
LS.append(ls)
# now reconstruct
ls_ = LS[0]
for i in range(1,6):
ls_ = cv.pyrUp(ls_)
ls_ = cv.add(ls_, LS[i])
# image with direct connecting each half
real = np.hstack((A[:,:cols//2],B[:,cols//2:]))
cv.imwrite('Pyramid_blending2.jpg',ls_)
cv.imwrite('Direct_blending.jpg',real)
خروجی کدهای فوق، شبیه به تصاویری که در ادامه آورده شده، خواهد بود.
کتابخانه SimpleCV
کتابخانه SimpleCV یکی دیگر از چارچوبهای منبع باز جهت پردازش تصویر با پایتون و پیادهسازی برنامههای کاربردی مرتبط با حوزه بینایی کامپیوتر محسوب میشود. با استفاده از این کتابخانه، کاربران قادر خواهند بود به برخی از کتابخانههای سطح بالای بینایی کامپیوتر نظیر OpenCV دسترسی داشته باشند.
ویژگی مهم این کتابخانه این است که کاربران مبتدی، بدون این که لازم باشد تا اطلاعات و دانش کافی در مورد مفاهیمی نظیر «عمقهای بیتی» (Bit Depths)، فرمتهای فایلی (File Format)، «فضاهای رنگی» (Color Spaces) و سایر موارد داشته باشند، به راحتی قادر به کار کردن با این کتابخانه و انجام عملیات پردازش تصویر با پایتون خواهند بود. بازه یادگیری کتابخانه SimpleCV به مراتب کوتاهتر از OpenCV است. برخی از مزایای این کتابخانه عبارتند از:
- برنامهنویسان مبتدی، به راحتی قادر به نوشتن برنامههای مرتبط با بینایی کامپیوتر توسط این کتابخانه هستند.
- این کتابخانه، توانایی کار کردن با جریانهای ویدئویی (Video Streams)، تصاویر، فایلهای ویدئویی و سایر موارد را دارد (به عبارت دیگر، با انواع فایلها و فرمتهای ویدئویی و تصویری سازگار است).
در ادامه، برخی از فرایندهای پردازش تصویر با پایتون که توسط کتابخانه SimpleCV قابل انجام است، نمایش داده خواهد شد.
تابع «آستانهگذاری» (Thresholding): تصویر زیر، نحوه عملکرد تابع Thresholding در کتابخانه SimpleCV را نشان میدهد. این تابع، هر کدام از پیکسلهای یک تصویر را بسته به میزان «روشنایی» (Brightness) آنها، سفید یا سیاه میکند.
from SimpleCV import Image, Color, Display # Make a function that does a half and half image. def halfsies(left,right): result = left # crop the right image to be just the right side. crop = right.crop(right.width/2.0,0,right.width/2.0,right.height) # now paste the crop on the left image. result = result.blit(crop,(left.width/2,0)) # return the results. return result # Load an image from imgur. img = Image('http://i.imgur.com/lfAeZ4n.png') # binarize the image using a threshold of 90 # and invert the results. output = img.binarize(90).invert() # create the side by side image. result = halfsies(img,output) # show the resulting image. result.show() # save the results to a file. result.save('juniperbinary.png') @Olhcim
«تشخیص لبه» (Edge Detection): در تصویر زیر، نحوه عملکرد تابع تشخیص لبه در کتابخانه SimpleCV نشان داده شده است. این تابع، مقادیر پیکسلی متناظر با لبههای تصویر را با رنگ سفید نشان میدهد.
# Make a function that does a half and half image. def halfsies(left,right): result = left # crop the right image to be just the right side. crop = right.crop(right.width/2.0,0,right.width/2.0,right.height) # now paste the crop on the left image. result = result.blit(crop,(left.width/2,0)) # return the results. return result # Load an image from imgur. img = Image('http://i.imgur.com/lfAeZ4n.png') # create an edge image using the Canny edge detector # set the first threshold to 160 output = img.edges(t1=160) # generate the side by side image. result = halfsies(img,output) # show the results. result.show() # save the output images. result.save('juniperedges.png')
مشخص کردن «نقاط کلیدی» (Keypoints) در تصویر: نقاط کلیدی، معمولا مناطق خاص بصری در تصویر هستند که برای انواع مختلفی از کاربردهای بینایی کامپیوتر نظیر «بازسازی سهبُعدی» (3D Reconstruction) و «تطبیق تصویر» (Image Matching) مورد استفاده قرار میگیرند. پیدا کردن نقاط کلیدی در کتابخانه SimpleCV بسیار ساده است (تابع Image.findKeypoints).
from SimpleCV import Image, Color, Display # load an image from imgur img = Image('http://i.imgur.com/lfAeZ4n.png') # use a keypoint detector to find areas of interest feats = img.findKeypoints() # draw the list of keypoints feats.draw(color=Color.RED) # show the resulting image. img.show() # apply the stuff we found to the image. output = img.applyLayers() # save the results. output.save('juniperfeats.png')
کتابخانه Mahotas
کتابخانه Mahotas یکی دیگر از کتابخانههای موجود جهت پردازش تصویر با پایتون و پیادهسازی برنامههای کاربردی مرتبط با حوزه بینایی کامپیوتر است. در این کتابخانه، علاوه بر اینکه توابع پردازش تصویر مرسوم نظیر «فیلتر گذاری» (Filtering) و «عملیات مورفولوژیکی» (Morphological Operations) تعریف شده است، تعدادی توابع بینایی کامپیوتر مدرن جهت «محاسبه ویژگی» (Feature Computation) نظیر «تشخیص نقاط مهم» (Interest Point Detection) و «توصیف کنندههای محلی» (Local Descriptors) نیز گنجانده شده است.
واسط برنامهنویسی این کتابخانه توسط زبان پایتون نوشته شده است (که برای توسعه سریع برنامههای کاربردی مرتبط با پردازش تصویر با پایتون و یا برنامههای بینایی کامپیوتر بسیار مناسب است)، ولی الگوریتمها در زبان C++ پیادهسازی شدهاند (که سبب افزایش سرعت اجرای کدهای این کتابخانه میشود). همچنین، کتابخانه Mahotas علاوه بر اینکه سرعت بالایی دارد، «وابستگیهای» (Dependencies) برنامهنویسی بسیار کمی دارد.
در ادامه، برخی از فرایندهای پردازش تصویر با پایتون که توسط کتابخانه Mahotas قابل انجام است، نمایش داده خواهد شد.
حل مسأله «پیدا کردن والی» (Finding Wally) توسط کتابخانه Mahotas: هدف از این مسأله پیدا کردن شخصیت والی (Wally) در تصویر زیر است.
from pylab import imshow, show import mahotas import mahotas.demos wally = mahotas.demos.load('Wally') imshow(wally) show()
wfloat = wally.astype(float) r,g,b = wfloat.transpose((2,0,1)) w = wfloat.mean(2) pattern = np.ones((24,16), float) for i in xrange(2): pattern[i::4] = -1 v = mahotas.convolve(r-w, pattern) mask = (v == v.max()) mask = mahotas.dilate(mask, np.ones((48,24))) np.subtract(wally, .8*wally * ~mask[:,:,None], out=wally, casting='unsafe') imshow(wally) show()
کتابخانه SimpleITK
کتابخانه SimpleITK، یک سیستم منبع باز و «چند سکویی» (Cross-Platform) است که مجموعهای کامل از ابزارهای نرمافزاری جهت تحلیل تصاویر دیجیتال را در اختیار برنامهنویسان و توسعهدهندگان قرار میدهد. ویژگی مهم کتابخانه SimpleITK، پشتیبانی از تعداد زیادی مؤلفه نرمافزاری است که برای انجام عملیات پردازشی نظیر فیلتر گذاری، «قطعهبندی تصاویر» (Image Segmentation) و «ثبت تصویر» (Image Registration) روی تصاویر دیجیتالی مورد استفاده قرار میگیرند. این کتابخانه به زبان C++ نوشته شده است ولی برای دامنه وسیعی از زبانهای برنامهنویسی، از جمله پایتون منتشر شده است.
در ادامه، برخی از فرایندهای پردازش تصویر با پایتون که توسط کتابخانه SimpleITK قابل انجام است، نمایش داده خواهد شد.
کاربرد کتابخانه SimpleITK: مصورسازی فرایند از نوع سخت ثبت تصاویر CT/MR (فرایند Rigid CT/MR Registration)، که توسط کتابخانه SimpleITK و زبان پایتون (پردازش تصویر با پایتون) توسعه داده شده است.
# # Script for generating images illustrating the movement of images and change in # similarity metric during registration. # import SimpleITK as sitk import matplotlib matplotlib.use('agg') import matplotlib.pyplot as plt import numpy as np # Paste the two given images together. On the left will be image1 and on the right image2. # image2 is also centered vertically in the combined image. def write_combined_image(image1, image2, horizontal_space, file_name): combined_image = sitk.Image((image1.GetWidth() + image2.GetWidth() + horizontal_space, max(image1.GetHeight(), image2.GetHeight())), image1.GetPixelID(), image1.GetNumberOfComponentsPerPixel()) combined_image = sitk.Paste(combined_image, image1, image1.GetSize(), (0, 0), (0, 0)) combined_image = sitk.Paste(combined_image, image2, image2.GetSize(), (0, 0), (image1.GetWidth()+horizontal_space, round((combined_image.GetHeight()-image2.GetHeight())/2))) sitk.WriteImage(combined_image, file_name) # Callback invoked when the StartEvent happens, sets up our new data. def start_plot(): global metric_values, multires_iterations metric_values = [] multires_iterations = [] # Callback invoked when the EndEvent happens, do cleanup of data and figure. def end_plot(): global metric_values, multires_iterations del metric_values del multires_iterations # Close figure, we don't want to get a duplicate of the plot latter on. plt.close() # Callback invoked when the IterationEvent happens, update our data and # save an image that includes a visualization of the registered images and # the metric value plot. def save_plot(registration_method, fixed, moving, transform, file_name_prefix): # # Plotting the similarity metric values, resolution changes are marked with # a blue star. # global metric_values, multires_iterations metric_values.append(registration_method.GetMetricValue()) # Plot the similarity metric values plt.plot(metric_values, 'r') plt.plot(multires_iterations, [metric_values[index] for index in multires_iterations], 'b*') plt.xlabel('Iteration Number',fontsize=12) plt.ylabel('Metric Value',fontsize=12) # Convert the plot to a SimpleITK image (works with the agg matplotlib backend, doesn't work # with the default - the relevant method is canvas_tostring_rgb()) plt.gcf().canvas.draw() plot_data = np.fromstring(plt.gcf().canvas.tostring_rgb(), dtype=np.uint8, sep='') plot_data = plot_data.reshape(plt.gcf().canvas.get_width_height()[::-1] + (3,)) plot_image = sitk.GetImageFromArray(plot_data, isVector=True) # # Extract the central axial slice from the two volumes, compose it using the transformation # and alpha blend it. # alpha = 0.7 central_index = round((fixed.GetSize())[2]/2) moving_transformed = sitk.Resample(moving, fixed, transform, sitk.sitkLinear, 0.0, moving_image.GetPixelIDValue()) # Extract the central slice in xy and alpha blend them combined = (1.0 - alpha)*fixed[:,:,central_index] + \ alpha*moving_transformed[:,:,central_index] # Assume the alpha blended images are isotropic and rescale intensity # Values so that they are in [0,255], convert the grayscale image to # color (r,g,b). combined_slices_image = sitk.Cast(sitk.RescaleIntensity(combined), sitk.sitkUInt8) combined_slices_image = sitk.Compose(combined_slices_image, combined_slices_image, combined_slices_image) write_combined_image(combined_slices_image, plot_image, 0, file_name_prefix + format(len(metric_values), '03d') + '.png') # Callback invoked when the sitkMultiResolutionIterationEvent happens, update the index into the # metric_values list. def update_multires_iterations(): global metric_values, multires_iterations multires_iterations.append(len(metric_values)) if __name__ == '__main__': # Read the images fixed_image = sitk.ReadImage("training_001_ct.mha", sitk.sitkFloat32) moving_image = sitk.ReadImage("training_001_mr_T1.mha", sitk.sitkFloat32) # Initial alignment of the two volumes transform = sitk.CenteredTransformInitializer(fixed_image, moving_image, sitk.Euler3DTransform(), sitk.CenteredTransformInitializerFilter.GEOMETRY) # Multi-resolution rigid registration using Mutual Information registration_method = sitk.ImageRegistrationMethod() registration_method.SetMetricAsMattesMutualInformation(numberOfHistogramBins=50) registration_method.SetMetricSamplingStrategy(registration_method.RANDOM) registration_method.SetMetricSamplingPercentage(0.01) registration_method.SetInterpolator(sitk.sitkLinear) registration_method.SetOptimizerAsGradientDescent(learningRate=1.0, numberOfIterations=100, convergenceMinimumValue=1e-6, convergenceWindowSize=10) registration_method.SetOptimizerScalesFromPhysicalShift() registration_method.SetShrinkFactorsPerLevel(shrinkFactors = [4,2,1]) registration_method.SetSmoothingSigmasPerLevel(smoothingSigmas=[2,1,0]) registration_method.SmoothingSigmasAreSpecifiedInPhysicalUnitsOn() registration_method.SetInitialTransform(transform) # Add all the callbacks responsible for ploting registration_method.AddCommand(sitk.sitkStartEvent, start_plot) registration_method.AddCommand(sitk.sitkEndEvent, end_plot) registration_method.AddCommand(sitk.sitkMultiResolutionIterationEvent, update_multires_iterations) registration_method.AddCommand(sitk.sitkIterationEvent, lambda: save_plot(registration_method, fixed_image, moving_image, transform, 'output/iteration_plot')) registration_method.Execute(fixed_image, moving_image) © 2019 GitHub, Inc.
کتابخانه pgmagick
کتابخانه pgmagick، یک Wrapper توسعه داده شده جهت استفاده از کتابخانه GraphicsMagick در زبان پایتون محسوب میشود. کتابخانه GraphicsMagick، یک سیستم پردازش تصویر است که به دلیل امکانات فوقالعاده و گسترده، به آن «چاقوی سوئیسی» (Swiss Knife) پردازش تصویر نیز گفته میشود.
در این کتابخانه، مجموعهای گسترده و قدرتمند از ابزارها و کتابخانههای برنامهنویسی (جهت پردازش تصویر) تعبیه شده است که از امکاناتی نظیر خواندن، نوشتن و دستکاری تصاویر دیجیتالی در بیش از 88 فرمت تصویری عمده نظیر GIF ،JPEG ،JPEG-2000 ،PNG ،TIFF و سایر موارد پشتیبانی میکند.
در ادامه، برخی از فرایندهای پردازش تصویر با پایتون که توسط کتابخانه pgmagick قابل انجام است، نمایش داده خواهد شد.
«مقیاسگذاری تصویر» (Image Scaling):
from pgmagick import Image, Blob img = Image(Blob(open('lena_std.jpg').read()), Geometry(200, 200)) img.scale('200x200') img.write('lena_scale.jpg')
«استخراج لبه» (Edge Extraction):
from pgmagick.api import Image img = Image('lena.jpg') img.edge(2) img.write('lena_edge.jpg')
ابزار Pycairo
ابزار Pycairo، مجموعهای از «مقیدسازیهای» (Bindings) توسعه داده شده در زبان پایتون، جهت استفاده از کتابخانه گرافیکی Cairo است. کتابخانه Cairo نیز یک کتابخانه گرافیکی دوبُعدی جهت رسم گرافیکهای برداری محسوب میشود. «گرافیکهای برداری» (Vector Graphics) از آن جهت حائز اهمیت هستند که در اثر فرایندهای پردازشی نظیر «تغییر اندازه» (Resize) یا «تبدیل» (Transformation)، وضوح خود را از دست نمیدهند. ابزار Pycairo برای فراخوانی دستورات کتابخانه Cairo در زبان پایتون به کار میرود.
در ادامه، برخی از فرایندهای پردازش تصویر با پایتون که توسط کتابخانه Pycairo قابل انجام است، نمایش داده خواهد شد.
رسم خط با استفاده از ابزار Pycairo: خط، یکی از سادهترین گرافیکهای برداری محسوب میشود. برای رسم یک خط، دو تابع از ابزار Pycairo باید فراخوانی شوند. نقطه آغازین خط، توسط فراخوانی تابع move_to() مشخص میشود. نقطه پایانی یک خط نیز توسط فراخوانی به تابع line_to() مشخص میشود.
ZetCode PyCairo tutorial In this program, we connect all mouse clicks with a line. Author: Jan Bodnar Website: zetcode.com Last edited: April 2016 ''' from gi.repository import Gtk, Gdk import cairo class MouseButtons: LEFT_BUTTON = 1 RIGHT_BUTTON = 3 class Example(Gtk.Window): def __init__(self): super(Example, self).__init__() self.init_ui() def init_ui(self): self.darea = Gtk.DrawingArea() self.darea.connect("draw", self.on_draw) self.darea.set_events(Gdk.EventMask.BUTTON_PRESS_MASK) self.add(self.darea) self.coords = [] self.darea.connect("button-press-event", self.on_button_press) self.set_title("Lines") self.resize(300, 200) self.set_position(Gtk.WindowPosition.CENTER) self.connect("delete-event", Gtk.main_quit) self.show_all() def on_draw(self, wid, cr): cr.set_source_rgb(0, 0, 0) cr.set_line_width(0.5) for i in self.coords: for j in self.coords: cr.move_to(i[0], i[1]) cr.line_to(j[0], j[1]) cr.stroke() del self.coords[:] def on_button_press(self, w, e): if e.type == Gdk.EventType.BUTTON_PRESS \ and e.button == MouseButtons.LEFT_BUTTON: self.coords.append([e.x, e.y]) if e.type == Gdk.EventType.BUTTON_PRESS \ and e.button == MouseButtons.RIGHT_BUTTON: self.darea.queue_draw() def main(): app = Example() Gtk.main() if __name__ == "__main__": main()
عملیات Fill و Stroke با استفاده از ابزار Pycairo: در این نمونه کاربرد ابزار Pycairo (نمایش داده شده در شکل زیر)، از عملیات Stroke برای رسم حاشیههای شکل و از عملیات Fill برای پر کردن داخل شکل استفاده میشود.
ZetCode PyCairo tutorial This code example draws a circle using the PyCairo library. Author: Jan Bodnar Website: zetcode.com Last edited: April 2016 ''' from gi.repository import Gtk import cairo import math class Example(Gtk.Window): def __init__(self): super(Example, self).__init__() self.init_ui() def init_ui(self): darea = Gtk.DrawingArea() darea.connect("draw", self.on_draw) self.add(darea) self.set_title("Fill & stroke") self.resize(230, 150) self.set_position(Gtk.WindowPosition.CENTER) self.connect("delete-event", Gtk.main_quit) self.show_all() def on_draw(self, wid, cr): cr.set_line_width(9) cr.set_source_rgb(0.7, 0.2, 0.0) w, h = self.get_size() cr.translate(w/2, h/2) cr.arc(0, 0, 50, 0, 2*math.pi) cr.stroke_preserve() cr.set_source_rgb(0.3, 0.4, 0.6) cr.fill() def main(): app = Example() Gtk.main() if __name__ == "__main__": main()
جمعبندی
در این مطلب، برخی از مهمترین، قدرتمندترین و پرکاربردترین کتابخانههای پردازش تصویر در پایتون معرفی شدهاند. تمامی ابزارها، کتابخانهها و بستههای معرفی شده در این مطلب، به طور رایگان و برای استفاده عموم منتشر شدهاند.
خوانندگان و مخاطبان این مطلب ممکن است با برخی از ابزارها و کتابخانههای معرفی شده آشنایی داشته باشند و بعضی از آنها ممکن است برای کاربران تازگی داشته باشند. با این حال، جهت آشنایی بهتر با امکانات ارائه شده در هر یک از این ابزارها، نیاز است تا هریک از این کتابخانهها توسط کاربر مورد استفاده قرار بگیرند. چنین کاری به کاربران اجازه میدهد تا بتوانند بهترین کتابخانه پردازش تصویر را جهت کد نویسی برنامههای کاربردی مد نظر خود انتخاب کنند.
اگر نوشته بالا برای شما مفید بوده است، آموزشهای زیر نیز به شما پیشنهاد میشوند:
- مجموعه آموزشهای دادهکاوی و یادگیری ماشین
- آموزش اصول و روشهای دادهکاوی (Data Mining)
- مجموعه آموزشهای هوش مصنوعی
- تشخیص اشیا در پایتون — راهنمای کاربردی
- پردازش تصویر در متلب — راهنمای جامع
- نقشه دانش فناوریهای هوش مصنوعی و دسته بندی آنها — راهنمای جامع
- پیاده سازی مدل دسته بندی تصاویر در پایتون — راهنمای کاربردی
- بینایی کامپیوتر چیست؟ — به زبان ساده
^^
کد کتابخانه OpenCV-Python با خطا مواجه میشود. لطفا اصلاح بفرمایید
با سلام و احترام؛
ضمن تشکر از ارائه بازخوردتون، کدهای مربوطه، برای پایتون ۳ بهروزرسانی و تست شد.
از همراهی شما با مجله فرادرس بسیار خوشنودیم.
سلام وقتتون بخیر باشه
سوالی داشتم در زمینه الگویابی پایتون
برنامه ای نوشتم که یک الگو رو به صورت عکس بهش میدین و در عکس دیگه ای اون الگو هارو پیدا میکنه و یک کادر دور الگو رسم میکنه
حالا میخواستم تعداد الگوهای شناسای شده رو حساب کنه و نمایش بده چطوری میتونم انجامش بدم ممنون میشم راهنمایی کنید .
سلام وقت بخیر. برای تبدیل عکس به sketch در پایتون باید از چه تابعی استفاده کرد
با سلام خدمت شما…از آموزش شما استفاده کردیم…یک سوال دارم خدمتتون..آیا میشه با پایتون ماکزیمم یا مینیمم نموداری که از تصاویر اینترنتی گرفتم را بدست آورد؟
import numpy as np
import cv2
from PIL import image
کد من اینها رو هم خطا میگیره! چه کنم؟