یکی از سادهترین و آسان ترین روشها برای کار با تصویر در Python استفاده از پکیج Skimage است. این پکیج قابلیتهای زیادی از جمله: خواندن و نوشتن تصویر در فایل، انواع روشهای رفع نویز، تنظیم روشنایی تصویر، تبدیلهای مختلف بین فرمتهای مختلف تصویر و … را دارد. تقریبا تمام تکنیکها و عملگرهای معروف در پردازش تصویر در این کتابخانه موجود است که برای کسب اطلاعات بیشتر میتوانید به آدرس https://scikit-image.org مراجعه کنید.
در این مطلب چند کاربرد ساده از این پکیج نشان داده میشود و به کارهای پیچیدهتری همچون رفع نویز پرداخته نمیشود و آن مطالب در پستهای بعد برای کتابخانه OpenCV بیان خواهد شد.
در این مطلب از تصویر یک پرنده ایرانی به اسم هما استفاده می کنیم که در زیر نمایش داده شده است.
برای نصب این پکیج میتوانید از دستور زیر استفاده کنید:
pip install scikit-image
ابتدا قسمتهایی از پکیج skimage را که نیاز داریم و میخواهیم استفاده کنیم را مشخص میکنیم.
# import sklearn package from skimage import io, draw, exposure, transform, img_as_float, color import matplotlib.pyplot as plt
برای خواندن تصویر هما از دستور imread به شکل زیر استفاده میکنیم:
# read image file img = io.imread(fname='homa.jpg')
برای به دستاوردن اندازه تصویر از خصوصیت shape استفاده میشود:
# image width, height and depth width, height, depth = img.shape print('image shape: ', width, height, depth)
خروجی این دستور مقدار زیر است که ۳ نشان دهنده تعداد کانالها در نمایش RGB است.
293 442 3
برای نمایش تصویر از دستور imshow و show به صورت زیر استفاده میشود.
# display image io.imshow(img) io.show()
خروجی کد بالا در زیر نمایش داده شده است:
برای رسم خط در تصویر از دستور line به شکل زیر استفاده میشود که بهعنوان ورودی مختصات دو نقطه سر خط را میگیرد و بهعنوان خروجی مختصات نقاط روی خط را میدهد.سپس برای دیدن این خط، نقاط روی خط را با رنگ سیاه در تصویر مشخص کردهایم.
# draw line img_line = img.copy() x, y = draw.line(r0=10, c0=20, r1=250, c1=400) img_line[x, y, :] = [0, 0, 0] # display image io.imshow(img_line) io.show()
خروجی این قسمت کد به شکل زیر است:
برای نوشتن تصویر در فایل از دستور imsave استفاده میشود.
# save an image io.imsave(fname='homa_line.jpg', arr=img_line)
برای رسم یک چند وجهی از دستور polygon استفاده میشود که به عنوان ورودی مختصات x و y نقاط چند وجهی را در به صورت ترتیب ساعتگرد میگیرد. در زیر یک مستطیل با استفاده از آن رسم شدهاست.
# draw polygon img_polygon = img.copy() x, y = draw.polygon(r=[10, 50, 50, 10],c=[20, 20, 180, 180]) img_polygon[x, y] = (0, 0, 0) # display image io.imshow(img_polygon) io.show() # save an image io.imsave(fname='homa_polygon.jpg', arr=img_polygon)
در زیر خروجی کد بالا را مشاهده میکنید:
برای رسم دایره از دستور circle استفاده میشود که مختصات مرکز دایره و شعاع دایره را میگیرد.
# draw circle img_circle = img.copy() x, y = draw.circle(r=150, c = 220, radius=50) img_circle[x, y] = (0, 0, 0) # display image io.imshow(img_circle) io.show() # save an image io.imsave(fname='homa_circle.jpg', arr=img_circle)
در زیر خروجی این کد را میبینید:
برای رسم یک منحنی بزیه از دستور bezier_curve استفاده میشود. که سه نقطه که منحنی از آن باید عبور کند را میگیرد و همینطور میزان تنش را نیز میگیرد. هر چه میزان تنش بیشتر باشد تیزی منحنی در نقطه وسط بیشتر است:
# draw bezier curve img_bezier = img.copy() x, y = draw.bezier_curve(r0=50, c0=10, r1=240, c1=100, r2=280, c2=400, weight=1) img_bezier[x, y] = (0, 0, 0) # display image io.imshow(img_bezier) io.show() # save an image io.imsave(fname='homa_bezier.jpg', arr=img_bezier)
خروجی کد بالا
برای رسم بیضی از دستور ellipse استفاده میشود که بهعنوان ورودی مختصات مرکز بیضی و دو شعاع آن را میگیرد.
# draw ellipse img_ellipse = img.copy() x, y = draw.ellipse(r=145, c=221, r_radius=50, c_radius=100) img_ellipse[x, y] = (0, 0, 0) # display image io.imshow(img_ellipse) io.show() # save an image io.imsave(fname='homa_ellipse.jpg', arr=img_ellipse)
خروجی کد بالا
برای روشن و تیرهتر کردن تصویر میتوان از تبدیل گاما استفاده کرد. برای روشنتر کردن از مقدارهای گامای کمتر از یک استفاده میکنیم و برای تیره کردن از مقدارهای گامای بیش از یک استفاده میشود. در زیر کد این کار آورده شدهاست:
# Gamma Transform img_darker = exposure.adjust_gamma(image=img, gamma=2.5) img_brighter = exposure.adjust_gamma(image=img, gamma=0.5) io.imshow(img_darker) io.show() io.imshow(img_brighter) io.show() # save an image io.imsave(fname='homa_darker.jpg', arr=img_darker) io.imsave(fname='homa_brighter.jpg', arr=img_brighter)
خروجیهای کد بالا:
برای چرخش تصویر از دستور Rotate استفاده میشود که زاویه چرخش را بهعنوان ورودی میگیرد.
# rotate image img_rotate = transform.rotate(image=img, angle=30) io.imshow(img_rotate) io.show() io.imsave(fname='homa_rotate.jpg', arr=img_rotate)
برای تغییر اندازه تصویر از دستور resize استفاده میشود که اندازه جدید تصویر بهعنوان ورودی را دریافت میکند.
# resize image img_resize = transform.resize(image=img, output_shape=(200, 200, 3)) io.imshow(img_resize) io.show() io.imsave(fname='homa_resize.jpg', arr=img_resize)
هیستوگرام یک تصویر مشخص میکند از هر سطح روشنایی چه تعداد پیکسل در تصویر موجود است. برای این کار ابتدا تصویر را به صورت نمایش خاکستری در میآوریم و سپس هیستوگرام آن را با دستور histogram محاسبه میکنیم.
# convert color image to grey scale img_grey = color.rgb2grey(img) io.imshow(img_grey) io.show() io.imsave(fname='homa_grey.jpg', arr=img_grey) # convert image integer pixels representation to float representation img_float = img_as_float(image=img_grey) # calculate histogram value, bin_center = exposure.histogram(image=img_float, nbins=256) # plt histogram plt.plot(bin_center, value) plt.show()
تصویر در نمایش سطح خاکستری
هیستوگرام برای تصویر بالا:
این پکیج تعداد زیادی تابع برای کارهای پردازش تصویر دارد که با مراجعه به آدرس https://scikit-image.org میتوانید آنها را ببینید.
در زیر کد کلی برنامه نوشته شده را مشاهده میکنید:
# import sklearn package from skimage import io, draw, exposure, transform, img_as_float, color import matplotlib.pyplot as plt # =========================================================== # read image file img = io.imread(fname='homa.jpg') # image width, height and depth width, height, depth = img.shape print('image shape: ', width, height, depth) # display image io.imshow(img) io.show() # =========================================================== # draw line img_line = img.copy() x, y = draw.line(r0=10, c0=20, r1=250, c1=400) img_line[x, y, :] = [0, 0, 0] # display image io.imshow(img_line) io.show() # save an image io.imsave(fname='homa_line.jpg', arr=img_line) # =========================================================== # draw polygon img_polygon = img.copy() x, y = draw.polygon(r=[10, 50, 50, 10],c=[20, 20, 180, 180]) img_polygon[x, y] = (0, 0, 0) # display image io.imshow(img_polygon) io.show() # save an image io.imsave(fname='homa_polygon.jpg', arr=img_polygon) # =========================================================== # draw circle img_circle = img.copy() x, y = draw.circle(r=150, c = 220, radius=50) img_circle[x, y] = (0, 0, 0) # display image io.imshow(img_circle) io.show() # save an image io.imsave(fname='homa_circle.jpg', arr=img_circle) # =========================================================== # draw bezier curve img_bezier = img.copy() x, y = draw.bezier_curve(r0=50, c0=10, r1=240, c1=100, r2=280, c2=400, weight=1) img_bezier[x, y] = (0, 0, 0) # display image io.imshow(img_bezier) io.show() # save an image io.imsave(fname='homa_bezier.jpg', arr=img_bezier) # =========================================================== # draw ellipse img_ellipse = img.copy() x, y = draw.ellipse(r=145, c=221, r_radius=50, c_radius=100) img_ellipse[x, y] = (0, 0, 0) # display image io.imshow(img_ellipse) io.show() # save an image io.imsave(fname='homa_ellipse.jpg', arr=img_ellipse) # =========================================================== # Gamma Transform img_darker = exposure.adjust_gamma(image=img, gamma=2.5) img_brighter = exposure.adjust_gamma(image=img, gamma=0.5) io.imshow(img_darker) io.show() io.imshow(img_brighter) io.show() # save an image io.imsave(fname='homa_darker.jpg', arr=img_darker) io.imsave(fname='homa_brighter.jpg', arr=img_brighter) # =========================================================== # rotate image img_rotate = transform.rotate(image=img, angle=30) io.imshow(img_rotate) io.show() io.imsave(fname='homa_rotate.jpg', arr=img_rotate) # =========================================================== # resize image img_resize = transform.resize(image=img, output_shape=(200, 200, 3)) io.imshow(img_resize) io.show() io.imsave(fname='homa_resize.jpg', arr=img_resize) # =========================================================== # convert color image to grey scale img_grey = color.rgb2grey(img) io.imshow(img_grey) io.show() io.imsave(fname='homa_grey.jpg', arr=img_grey) # convert image integer pixels representation to float representation img_float = img_as_float(image=img_grey) # calculate histogram value, bin_center = exposure.histogram(image=img_float, nbins=256) # plt histogram plt.plot(bin_center, value) plt.show()
نوشته کار با تصویر در پایتون با استفاده از skimage اولین بار در اوپن مایند. پدیدار شد.