پردازش تصویر در پایتون
پردازش تصویر یا Image Processing یکی از پرطرفدارترین و پرکاربردترین شاخه ها در زمینه هوش مصنوعی و زندگی روزمره است. در زبان پایتون روش ها و ابزارهای مختلفی برای پردازش تصویر وجود دارد . از جمله Opencv و کتابخانه PIL که در ادامه به بررسی روشها و ابزارها و آموزش پردازش تصویر در python خواهیم پرداخت.
پردازش تصویر ( Image processing) ، پردازش تصویر دیجیتال می باشد که شاخهای از پردازش سیگنال است .
پردازش تصویر دو شاخه اصلی دارد:
- بهبود تصاویر
- بینایی ماشین
بهبود تصاویر شامل روش هایی مانند استفاده از فیلتر تاری و افزایش کنتراست برای بهبود کیفیت بصری تصاویر و اطمینان از نمایش صحیح آنها در محیط مقصد (مانند چاپگر یا مانیتور کامپیوتر) است.
بینایی ماشین با روشهایی سروکار دارد که میتوان از آنها برای درک معنا و محتوای تصاویر برای استفاده در کارهایی مانند روباتیک استفاده کرد.
تصویر دیجیتال:
یک تصویر دیجیتال از تعداد زیادی مربع کوچک تشکیل شده است که به پیکسل معروف هستند.هر پیکسل یک مقدار دیجیتال دارد که نشان دهنده روشنایی آن پیکسل است. روشنایی هر پیکسل با عددی بین 0 تا 255 تعیین می شود. به این نوع تصاویر، تصاویر رَستِری (Raster Image) هم میگویند. هر تصویر رستری از تعدادی سطر و تعدادی ستون تشکیل شدهاست.
تصاویر در قالبهای مختلفی مانند تصاویر خاکستری یا GryScale دیجیتالی میشوند که در آن هر پیکسل تنها با عددی بین 0 تا 255 نشان داده میشود. یا تصاویر رنگی RGB که از سه رنگ قرمز (R) و سبز (G) و آبی (B) استفاده می کنند و هر پیکسل با سه عدد بین 0 تا 255 نمایش داده می شود.
کتابخانه های متعددی برای کار با تصاویر و پردازش تصویر در پایتون ایجاد شده است که در ادامه به معرفی آنها می پردازیم.
۱– پردازش تصویر با پایتون با کتابخانه 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 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()
خروجی کد بالا مشابه شکل زیر است:
۳– پردازش تصاویر در پایتون با کتابخانه SciKit-Image
ابزار SciKit-Image، یک بسته برنامهنویسی «منبع باز» (Open Source) است که با ساختار آرایهای تعریف شده توسط کتابخانه NumPy کار میکند. این کتابخانه یکی از مهم ترین کتابخانه های پردازش تصویر با پایتون است که به صورت رایگان در اختیار کاربران و برنامه نویسان قرار گرفته است.
بسته SciKit-Image مجموعه ای از الگوریتم ها و ابزارهای پردازش تصویر را برای استفاده در برنامه های تحقیقاتی، آموزشی و صنعتی در اختیار کاربران قرار می دهد.
کتابخانه Scikit-image : آموزش نصب scikit-learn
۴– کتابخانههای PIL و Pillow برای پردازش تصویر در پایتون
PIL که به کتابخانه تصویر پایتون معروف است مخفف Python Imaging Library است. کتابخانه PIL یکی از کتابخانه های پردازش تصویر پایتون است. با این حال، توسعه آن از سال 2009 متوقف شده است.
اما نسخه گسترش یافته آن یعنی کتابخانه Pillow در زبان پایتون همچنان پشتبیانبی میشود .
نصب ساده، قابلیت اجرا بر روی پلتفرم ها و سیستم عامل های اصلی و پشتیبانی از پایتون نسخه 3 از نقاط قوت این کتابخانه است که برنامه نویسان از آن برای پردازش تصاویر با پایتون استفاده می کنند.
به دلیل سادگی استفاده از این کتابخانه برای پردازش تصویر، بسیاری از برنامه نویسان از آن در برنامه نویسی روزانه خود استفاده می کنند. اما اگر در پروژه های یادگیری عمیق نیاز به پردازش تصویر دارید، استفاده از OpenCV توصیه می شود.
کتابخانه PIL و Pillow برای پردازش تصویر
۵- کتابخانه OpenCV-Python
کتابخانه OpenCV که مخفف عبارت Open Source Computer Vision Library است، یکی از پرکاربردترین کتابخانه های برنامه نویسی برای برنامه های “Computer Vision” است.
OpenCV-Python Library یک رابط برنامه نویسی کاربردی (API) برای کتابخانه OpenCV در پایتون است.
این کتابخانه نه تنها از سرعت بسیار بالایی برخوردار است (زیرا کدهای پیادهسازی آن توسط زبان C و C++ نوشته شده است)، بلکه کد نویسی برنامههای کاربردی مرتبط با پردازش تصویر با پایتون و بهکاراندازی (Deploy) آنها را تسهیل میبخشد.
چنین ویژگی هایی کتابخانه OpenCV-Python را به بهترین انتخاب برای پردازش تصویر با پایتون و اجرای برنامه های بینایی کامپیوتری در این زبان تبدیل می کند (مخصوصاً اگر برنامه های بینایی کامپیوتری توسعه یافته نیاز به محاسبات پیچیده و سنگین ریاضی داشته باشند).
«ترکیب تصاویر» (Image Blending): با استفاده از قابلیتی به نام هرم تصویر در OpenCV-Python، می توانید تصاویر مربوط به یک سیب و یک پرتقال را برای ایجاد یک تصویر جدید ترکیب کنید.
لایسنس تبلو
import cv2
import numpy as np,sys
A = cv2.imread(‘apple.jpg’)
B = cv2.imread(‘orange.jpg’)
# generate Gaussian pyramid for A
G = A.copy()
gpA = [G]
for i in xrange(6):
G = cv2.pyrDown(G)
gpA.append(G)
# generate Gaussian pyramid for B
G = B.copy()
gpB = [G]
for i in xrange(6):
G = cv2.pyrDown(G)
gpB.append(G)
# generate Laplacian Pyramid for A
lpA = [gpA[5]]
for i in xrange(5,0,-1):
GE = cv2.pyrUp(gpA[i])
L = cv2.subtract(gpA[i-1],GE)
lpA.append(L)
# generate Laplacian Pyramid for B
lpB = [gpB[5]]
for i in xrange(5,0,-1):
GE = cv2.pyrUp(gpB[i])
L = cv2.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 xrange(1,6):
ls_ = cv2.pyrUp(ls_)
ls_ = cv2.add(ls_, LS[i])
# image with direct connecting each half
real = np.hstack((A[:,:cols/2],B[:,cols/2:]))
cv2.imwrite(‘Pyramid_blending2.jpg’,ls_)
cv2.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
تصویر پردازش شده به شکل زیر خواهد بود:
۷– کتابخانه 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 برای پردازش تصویر با Python
کتابخانه 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)
آموزش Python
#
# 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 و سایر موارد پشتیبانی میکند.
«مقیاسگذاری تصویر» (Image Scaling):
from pgmagick import Image, Blob
img = Image(Blob(open(‘lena_std.jpg’).read()), Geometry(200, 200))
img.scale(‘200×200’)
img.write(‘lena_scale.jpg’)
۱۰– کتابخانه Pycairo برای پردازش تصویر
ابزار Pycairo مجموعهای از “پیوندها” است که به زبان پایتون برای استفاده در کتابخانه گرافیک Cairo توسعه یافته است.
کتابخانه Cairoهمچنین یک کتابخانه گرافیکی دو بعدی برای ترسیم گرافیک های برداری است. “گرافیک برداری” به این دلیل مهم است که به دلیل فرآیندهای پردازشی مانند “تغییر اندازه” یا “تبدیل” وضوح خود را از دست نمی دهد. ابزار Pycairo برای بازیابی دستورات کتابخانه Cairo در زبان پایتون استفاده می شود.
رسم خط با استفاده از ابزار 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()
لایسنس Tableau
به دنبال این هستید که داده های خود را از طریق تجزیه و تحلیل بصری به نمایش بذارید ؟ با ما در داده کاوی ویستا ارتباط برقرار کنید.
با یکی از کارشناسان داده ما تماس بگیرید و صحبت کنید، و ما به هر سوالی که ممکن است داشته باشید پاسخ خواهیم داد.
تیم ویستا با بیش از 10 سال تجربه ترکیبی در توسعه نرم افزار سفارشی، BI، و راه حل های داده، می تواند به شما کمک کند تا از تجزیه و تحلیل داده ها برای رفع نیازهای سازمان خود استفاده کنید.
دوره آموزشی زبان برنامه نویسی پایتون »کلیک کنید» یک برنامه جامع است که بر توسعه سریع نرمافزارهای کاربردی، برنامهنویسی شیگرا و کاربری ماژول و…. با استفاده از ابزار Python تمرکز دارد.
سپاسگذاریم از وقتی که برای خواندن این مقاله گذاشتید
برای خرید لایسنس نرم افزار Power BI کلیک کنید
برای مشاهده ویدیوهای آموزشی داده کاوی و هوش تجاری ما را در شبکه های اجتماعی دنبال کنید
Youtube Chanel :VISTA Data Mining
Aparat Chanel: VISTA Data Mining
Instagram Chanel: VISTA Data Mining
Telegram Chanel: VISTA Data Mining
Linkedin Chanel: VISTA Company