شما اینجا هستید

۱-۴ -- SciPy

پیغام خطا

Deprecated function: The each() function is deprecated. This message will be suppressed on further calls در book_prev() (خط 775 در /home/molavy/public_html/modules/book/book.module).

بسته SciPy که از آدرس

http://scipy.org

در دسترس است، یک بسته متن باز برای ریاضیات است که بر پایه NumPy و روال های کارآمد و بهینه ای را برای تعدادی عملیات فراهم می کند، این عملیات ها شامل، انتگرال گیری عددی، بهینه سازی، آمار و پردازش سیگنال و از همه مهمتر برای ما پردازش تصویر است. همانطور که در ادامه خواهید دید بسته های زیادی در SciPy وجود دارد که بصورت رایگان از آدرس:

http://scipy.org/Download

در دسترس است.

محو کردن تصاویر(Blurring Images)

یک مثال سنتی و خیلی سودمند از اعمال ادغام تصویر ایجاد ماتی به شیوه گاوسی روی تصویر است. در اصل تصویر (تصویر در طیف سیاه و سفید است) I با هسته(کرنل) گاوسی ادغام می شود تا یک نسخه مات ایجاد کند.

 

هسته یک بعدی

هسته دو بعدی

هسته N بعدی

کرنل گاوسی کرنل مثلثی


در اینجا علامت * نشان دهنده کانولوشن(در ریاضیات و به خصوص درتحلیل تابع،کانولوشن (همگشت) یک عملگر ریاضی است که بر روی دو تابعf و g عمل کرده، و تابع سومی را تولید می کند که می توان به عنوان نسخه تصحیح شده یکی از دو تابع اصلی نگریسته شود.) است و Gσ یک کرنل دو بعدی گاوسی است که انحراف معیار σ آن به شکل زیر تعریف می شود:

مات کردن گاوسی برای تعریف مقیاس تصویری که روی آن کار می کنیم تعریف می شود، و برای درون یابی، یافتن نقاط سودمند و بسیاری برنامه های دیگر استفاده می شود.

بسته SciPy همراه با ماژولی برای فیلترها با نام scipy.ndimage.filters ارائه می شود که می تواند این ترکیب را با استفاده از جداسازی یک طرفه با سرعت انجام شود. تنها کاری باید انجام دهید این کار است:

from PIL import Image

from numpy import *

from scipy.ndimage import filters

im = array(Image.open('empire.jpg').convert('L'))

im2 = filters.gaussian_filter(im,5)

 

در اینجا آخرین ورودی برای gaussioan_filter انحراف معیار است.

تصویر ۹-۱ مثال هایی از تصاویر که ماتی را با افزایش σ نشان می دهد. مقادیر بزرگتر جزییات کمتری به ما می دهد. برای مات کردن تصاویر رنگی، کافیست برای هر کانال رنگی، مات کردن گاوسی را اعمال کنید.

im = array(Image.open('empire.jpg'))

im2 = zeros(im.shape)

for i in range(3):

im2[:,:,i] = filters.gaussian_filter(im[:,:,i],5)

im2 = uint8(im2)

در اینجا آخرین تبدیل به uint8 همیشه مورد نیاز نیست، اما مقادیر پیکسل ها اجبارا 8 بیت هستند. همچنین می توانستیم از این خط برای تبدیل استفاده کنیم

im2 = array(im2,'uint8')

تصویر ۹-۱. یک مثال از مات کردن گاوسی با استفاده از ماژول scipy.ndimage.filters

a) تصویر اصلی در طیف سیاه و سفید.b) فیلتر گاوسی با انحراف معیار برابر ۲ c) با انحراف معیار ۵ d) با انحراف معیار برابر ۱۰.

برای اطلاعات بیشتر از این ماژول و امکانات دیگر پارامتر ها مستندات SciPy.ndimage را در این آدرس ببینید:

http://docs.scipy.org/doc/scipy/reference/ndimage.html

 

مشتقات تصویر(Image Derivatives)

اینکه چگونه تراکم تصویر در یک تصویر تغییر می کند اطلاعات مهمی است. این اطلاعات همانطور که در طی کتاب خواهیم دید توسط برنامه های زیادی مورد استفاده قرار می گیرد. تغییر تراکم که با x و y توصیف شده است با مشتقات Ix و Iy در تصویر طیف سیاه و سفید I محاسبه می شود(برای تصاویر رنگی، مشتقات معمولا برای هر کانال رنگ انجام می شوند).

شیب تصویر یک بردار به صورت زیر است:

شیب دو ویژگی مهم دارد، اندازه شیب

که شرح دهنده بزرگی تغییرات تراکم تصویر است، و زاویه شیب

که نشان دهنده مسیر بزرگترین تغییرات تراکم در هر نقطه(پیکسل) از تصویر است. تابع arctan2 بسته NumPy یک زاویه علامت دار(مثبت و منفی) با مقیاس رادیان برمی گراند که در محدوده( −π . . . π) است.

محاسبه مشتقات تصویر می تواند با استفاده از تقریب گسسته انجام شود. این کار با کانولوشن به سادگی میسر است

Ix = I ∗ Dx and Iy = I ∗ Dy

دو انتخاب معمول برای Dx و Dy فیلتر prewitt

و فیلتر Sobel 

می باشد.

پیاده سازی این فیلتر های مشتق گیری با استفاده از کانولوشن استاندارد که در ماژول scipy.ndimage.filters عرضه شده، ساده می باشد. برای مثال:

from PIL import Image

from numpy import *

from scipy.ndimage import filters

im = array(Image.open('empire.jpg').convert('L'))

# Sobel derivative filters

imx = zeros(im.shape)

filters.sobel(im,1,imx)

imy = zeros(im.shape)

filters.sobel(im,0,imy)

magnitude = sqrt(imx**2+imy**2)

 

این کد مشتقات و اندازه شیب x و y را با استفاده از فیلتر soble انجام می دهد.

آرگومان دوم مشتق x یا y را انتخاب می کند، و و سومی خروجی را ذخیره می کند. تصویر ‍۱-۱۰ نمایشی از یک تصویر با مشتقات آن که با فیلتر sobel محاسبه شده است را نمایش می دهد. مشتق های مثبت با پیکسل های روشن و مشتق های منفی با پیکسل های منفی نمایش داده می شوند. ناحیه های خاکستری مناطق نزدیک به صفر هستند.

استفاده از این شیوه این اشکال را دارد که مشتقات ابعاد، بر اساس تفکیک پذیری تصویر تعیین شده اند. برای اینکه کار محکم تر شود و محاسبات مشتقات در هر اندازه ای امکان پذیر شود فیلتر گوسی مشتقات می تواند به شکل زیر استفاده شود:

 

Ix = I ∗ Gσx و Iy = I ∗ Gσy

 

در اینجا Gσx و Gσy مشتقات x و y از Gσ هستند. این یک تابع گوسی با انحراف معیار σ است.

تابع filters.gaussian_filter که بیشتر برای مات کردن از آن استفاده کردیم یک آرگومان دیگر نیز می گیرد. این باعث می شود به جای این کار مشتقات گاوسی را محاسبه کند. برای اینکه این را روی تصویر امتحان کنید تنها کافیست این کد را بنویسید:

sigma = 5 # standard deviation

imx = zeros(im.shape)

filters.gaussian_filter(im, (sigma,sigma), (0,1), imx)

imy = zeros(im.shape)

filters.gaussian_filter(im, (sigma,sigma), (1,0), imy)

آرگومان سوم مشخص کننده ترتیب مشتقات برای استفاده در هر جهت با استفاده از انحراف معیار مشخص شده در آرگومان دوم است. برای جزییات بیشتر مستندات را ببینید.

 

تصویر ۱-۱۰. یک مثال از محاسبه مشتقات تصویر با استفاده از فیلتر های مشتقات Sobel: تصویر (a) تصویر اصلی به صورت طیف سیاه و سفید. تصویر (b) مشتق x. تصویر (c) مشتق y. تصویر (d) اندازه شیب.

تصویر ۱-۱۱. یک مثال از محاسبه مشتق های تصویر با استفاده از مشتقات گاوسی:

مشتق x (بالا)، مشتق y (وسط)، و اندازه شیب (پایین). (a) تصویر اصلی در طیف سیاه و سفید، (b) فیلتر گاوسی با انحراف معیار σ = 2 شماره (c) با انحراف معیار σ = 5 و (d) با σ = ۱۰.

تصویر ۱-۱۱ نمایشهایی از مشتقات با اندازه شیب برای اندازه های مختلف را نشان می دهد. این ها را با ماتی ها در اندازه های یکسان در تصویر ۱-۹ مقایسه کنید.

ریخت شناسی(Morphology) --- شمارش اشیاء(Counting Objects)

ریخت شناسی (یا ریاضیات ریخت شناسی) یک چهارچوب و مجموعه ای از شیوه های پردازش تصویر است. این شیوه ها برای اندازه گیری و تحلیل اشیاء ساده طراحی شده اند. ریخت شناسی معمولا به روی عکس های دو دویی (مثلا فقط حاوی دو رنگ سیاه و سفید) اعمال می شوند، اما می توانند با تصاویر طیف سیاه و سفید نیز کار کنند. یک تصویر دودویی یک تصویر است که هر پیکسل فقط می تواند دو مقدار بگیرد، معمولا صفر یا یک. تصاویر دودویی اغلب نتیجه آستانه یابی یک تصویر است، برای مثال به منظور شمارش اشیاء یا محاسبه اندازه آن. یک خلاصه خوب برای ریخت شناسی و اینکه چطور کار می کند در این آدرس میتوان یافت:

http://en.wikipedia.org/wiki/Mathematical_morphology

عملیات های ریخت شناسی در ماژول scipy.ndimage با نام morphology قرار دارند.

تابع های شمارش و اندازه گیری برای تصاویر دو دویی در scipy.ndimage با نام measurements قرار دارند. اجازه بدهید با مثال ساده ای نحوه استفاده از آن را ببینیم.

تصویر ۱-۱۲ الف را در نظر بگیرید. شمارش اشیاء در تصویر می تواند به شکل زیر انجام گیرد:

from scipy.ndimage import measurements,morphology

# load image and threshold to make sure it is binary

im = array(Image.open('houses.png').convert('L'))

im = 1*(im<128)

labels, nbr_objects = measurements.label(im)

print "Number of objects:", nbr_objects

این کد تصویر را بارگذاری می کند و با آستانه یابی مطمئن می شود که تصویر دودویی است. ضرب کردن در یک آرایه بولی را به نسخه دودویی تبدیل می کند. سپس تابع label اشیاء معمول را پیدا می کند و برچسب های عددی را به پیکسل های مرتبط به شی اختصاص می دهد. تصویر ۱-۱۲ ب نمایش آرایه برچسب هاست. مقادیر سطح خاکستری نشان دهنده شناسه شی هستند. همانطور که می بینید، چند اتصال بین اشیاء وجود دارد. با استفاده از یک عملیات به نام شکافت دودویی می توانیم اتصال ها را حذف کنیم.

# morphology - opening to separate objects better

im_open = morphology.binary_opening(im,ones((9,5)),iterations=2)

labels_open, nbr_objects_open = measurements.label(im_open)

print "Number of objects:", nbr_objects_open

آرگومان دوم از تابع binary_opening مشخص کننده ساختاردهی جزء است. یک آرایه که مشخص کننده این است که وقتی روی اطراف یک پیکسل متمرکز می شویم چه همسایه هایی را استفاده کنیم. در این مثال، ما از ۹ پیکسل استفاده کرده ایم(چهار تا بالا،خود پیکسل و چهار تا پایین) در جهت y و ۵ تا در مسیر x. شما می توانید هر آرایه ای را به عنوان ساختار عنصر اختصاص دهید. عنصر های غیر صفر نشان دهنده همسایه ها هستند. پارامتر تکرار مشخص کننده این است که عملیات چند با اعمال شود. این را امتحان کنید و ببینید که چطور تعداد اشیاء تغییر می کند. تصویر بعد از بازکردن و اختصاص برچسب ها در تصویر ۱-۱۲ ج و د نمایش داده شده است. همانطور که انتظار دارید، یک تابع با نام binary_closing کار برعکس را انجام می دهد. ما این تابع و بقیه توابع را در ماژول های morphology و measurements برای تمرین می گذاریم. شما می توانید با استفاده از مستندات scipy.ndimage به آدرس:

http://docs.scipy.org/doc/scipy/reference/ndimage.html

درباره آنها بیشتر بدانید.

 

تصویر ۱-۱۲. یک مثال برای ریخت شناسی. شکافت دودویی برای جدا کردن اشیاء و بعد از آن شماره تعداد. (الف) تصویر دودویی اصلی (ب) تصویر برچسب مربوط به اصل (ج) تصویر دودویی بعد از جدا کردن (ب) برچسب تصویر مربوط به تصویر باز شده.

 

ماژول های مفید SciPy

بسته SciPy همراه با ماژول های مفیدی ارائه شده است که برای گرفتن ورودی و ایجاد خروجی مناسب است. دو مورد از آنها ماژول های io و misc است.

خواندن و نوشتن فایل های .mat

اگر شما داده هایی دارید، یا اینکه داده جالبی را به صورت آنلاین پیدا کردید که در یک فایل برنامه مطلب(matlab) با فرمت .mat ذخیره شده بودند، می توانید که با ماژول scipy.io آنها را بخوانید:

data = scipy.io.loadmat('test.mat')

شی data اکنون در بردارنده یک دیکشنری با شناسه(key) های مرتبط با مقادیر که در فایل .mat ذخیره شده، است. مقادیر در فرمت آٰرایه هستند. ذخیره کردن در فایل های .mat معمولا ساده است. فقط یک دیکشنری به همراه تمام متغیر های که شما می خواهید ذخیره کنید بسازید و از تابع savenat استفاده کنید.

data = {}

data['x'] = x

scipy.io.savemat('test.mat',data)

این کد ها آرایه x را ذخیره می کند، بنابراین نام آن هنگام خواندن در مطلب x خواهد بود. اطلاعات بیشتر درباره scipy.io را می توانید در آدرس زیر بیابید:

http://docs.scipy.org/doc/scipy/reference/io.html

ذخیره تصاویر به عنوان آرایه

از وقتی شروع به دستکاری تصاویر می کنید ما این کارها را روی شی های آرایه انجام می دادیم، بنابراین خیلی مفید خواهد بود اگر بتوانیم آنها را مستقیما روی فایل های تصاویر ذخیره کنیم. تصاویر زیادی در این کتاب به این روش ایجاد شده اند.

تابع imsave در ماژول scipy.misc در دسترس است. برای ذخیره آرایه im در فایل تنها از کد زیر استفاده کنید:

from scipy.misc import imsave

imsave('test.jpg',im)

 

دیدگاه جدیدی بگذارید