منبع اصلی نوشتار زیر در این لینک قرار دارد

کار با تصویر در پایتون با استفاده از skimage

 

یکی از ساده‌ترین و آسان ترین روش‌ها برای کار با تصویر در 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 اولین بار در اوپن مایند. پدیدار شد.