X
تبلیغات
رایتل

CUDA Programming Applications

SIFT

 SIFT

الگوریتم SIFT خلاصه عبارت Scale Invariant Feature Transform است که برای بیان ویژگی های محلی در تصویر کاربرد دارد که در سال 1999 توسط David Lowe پیشنهاد و در سال 2002 توسعه داده شد. بطور کلی ویژگی هایی که از تصویر استخراج می شود به دو دسته محلی و سراسری تقسیم می شود. ویژگیهای Global شامل ویژگیهای کلی هستند که با هم مقایسه می شوند که اگرتفاوتی مشاهده شد ، به سراغ ویژگی های Local که همان ویژگیهای جزئی هستند رفته می شود و باهم مقایسه می شوند که برای استخراج این ویژگیها بایستی یک سری نقاط کلیدی تعیین شود که برای هر نقطه یک شناسنامه و یا یک توصیف براساس پیکسلهای همجوار تشکیل می شود تا این نقاط از سایر نقاط دیگر مجزا شود که به آن اثر انگشت هم گفته می شود و منحصر بفرد است خاصیت این کار این است که اگر تصویراز زوایای مختلف و یا از ZOOM های مختلف گرفته شود آن نقطه تغییری نمی کند ولی بایستی این نکته را نیز مد نظر داشت که الگوریتم SIFT تطابق نقاط را شامل نمی شود و این عمل با یک الگوریتم دیگر انجام می شود




همانطور که در تصویر بالا مشاهده می کنید دو رادیو طوسی در ویژگی کلیشان تفاوتی دیده نمی شود سپس به مقایسه ویژگی های محلی پرداخته می شود که در قسمت وسط تفاوت مشاهده می شود






در دو عکس فوق به بررسی ویژگیهای شکل پرداخته می شود و نقاطی که تطابق بیشتری دارند بعنوان شی مورد نظر مشخص می شود


یکی از راههای استخراج ویژگی تفاضل گرادیان در مراتب مختلف است که در شکل زیر اورده شده است




و اما چالشها:

1-الگوریتم استخراج ویژگی قوی بایستی نسبت به چرخش یا Rotation مقاوم باشد 2- الگوریتم استخراج ویژگی قوی بایستی نسبت به تغییرات روشنایی مقاوم باشد 3- الگوریتم استخراج ویژگی قوی بایستی نسبت به تغییر مقیاس مقاوم باشد 4- مقاومت در برابر زاویه عکسبرداری نیز یکی دیگر از ویژگی های این الگوریتم است 5- الگوریتم تشخیص ویژگی باید نسبت به نویز هم مقاوم باشد

 

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

 

کاربردها:

1-      تطبیق یک مجموعه تصویر (مانند تصاویر پانوراما)

2-      شناسایی اشیا (جستجوی یک شی در میان تصویری از اشیا مختلف و یافتن مکان آن شی)

3-      ساخت مدل سه بعدی از روی مجموع تصویر (جمع نمودن تصاویر از زوایای مختلف با استفاده از SIFT)

4-      ردیابی اشیاء در ویدئو(فریم به فریم)






Histogram of Oriented Gradients

روند کار در این الگوریتم بدین صورت‌ است که ابتدا در جهت محور xها وyها از تصویر مشتق گرفته می‌شود (که همان تفاضل دو پیکسل مجاور می باشد) و دو ماتریس از تصویر بدست می آید (شکل1)



همانطور که در شکل1 مشاهده می شود بافتهایی از تصویر در جهات محور x و y بدست می‌آید،سپس برای تمامی عکسهای پوشه این کار انجام می‌شود، بعد از آن ماتریس اندازه از رابطه


 بدست می‌آید(شکل2)




و همچنین ماتریس زوایای موجود در تصویر با فرمول angle=arctan(gy/gx) قابل محاسبه می باشد (شکل 3)



برای کم کردن حجم هیستوگرام زوایا، باقیمانده زوایای بیشتر از 180 درجه را بر 180 محاسبه و جایگزین زاویه اصلی می‌شود، بدین ترتیب برای تمامی تصاویر این کار انجام می شود، سپس با استفاده از رابطه فاصله اقلیدسی فاصله بین هیستوگرام‌های تصاویر محاسبه شده و آن فاصله ای که تا هیستوگرام زاویه تصویر اصلی صفر شد تصویر منطبق می‌باشد.(شکل 4)


نحوه تنظیمات کتابخانه opencv در visual studio

برای استفاده از توابع کتابخانه opencv در محیط visual studio پس از دانلود آخرین ورژن opencv از سایت opencv.org (با فیلتر شکن) و نصب آن یک پوشه به همین نام در درایو C ایجاد می شود

سپس بعد از ایجاد پروژه جدید سی پلاس پلاس مراحل زیر را به ترتیب انجام می دهیم
1-Include




2-Add liberary






در نهایت به این دو اسم lib. اضافه کرده و دکمه ok  را میزنیم و هم اکنون پروژه آماده استفاده از توابع کتابخانه opencv می باشد

پردازش تصویر در کودا

در این قسمت در نظر دارم نمونه تست پردازش تصویر که در کودا انجام دادم را برای شما عزیزان به اشتراک بگذارم.

در ابتدا با استفاده از توابع کتابخانه opencv تصویر را می خوانیم

سپس در کرنل کودا شمارنده ای از جنس thread تعریف نموده و دستور اصلی برنامه که می خواهیم هر پیکسل تصویر را در0.6 ضرب کند می نویسیم

سپس در قسمت main برنامه تصویر را خوانده و دو آرایه تعریف نموده و تصویر را به آرایه انتقال می دهیم سپس همانند جمع و ضرب آرایه ها که در قسمتهای قبلی گفته شد آن آرایه را به حافظه جی پی یو انتقال می دهیم و سپس تابع هسته اصلی کودا را فراخوانی می کنیم و دوباره آرایه را به حافظه سی پی یو منتقل می نماییم و سپس با دستور Mat Out = Mat(im.rows, im.cols, CV_8UC1, array1);آرایه را به Mat  تبدیل می نماییم تا بتوانیم با دستور imshow کتابخانه opencv نمایش دهیم.



,  و نتیجه کار:


که همانطور که مشاهده نمودید تصویر تیره تر شد.

نحوه تنظیم پشته و افزایش حجم ان

تنظیم پشته و افزایش حجم آن

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



1-از نوار ابزار بالا گزینه project و سپس گزینه آخر properties را انتخاب می نماییم



2- در تب linker گزینه system را انتخاب می نماییم



3- سپس آیتمهای stack commit size و stack reserve size را با مقادیر بزرگ مثلا 100000 تنظیم می نماییم


1 2 >>