PDA

View Full Version : سوال: پروژه Image Segmentation



mohi_ka2
یک شنبه 31 شهریور 1387, 16:08 عصر
با سلام به دوستان برنامه نویس
من پروژه ای با عنوان ذکر شده دارم که تقریبا کلیات کار رو متوجه شدم . می دونم که چند تا فیلتر هست که باید روی تصاویر اعمال بشه و در محیط گرافیکی مطلب هم این کار رو انجام می دم
چیزی که من می خوام راهنمایی و همفکری دوستان برای ارتقاء و ترکیب ظاهری این پروژه هست. یعنی پیشنهاداتی برای بهتر شدن و پربار تر شدن نرم افزار و افزودنی های ممکن و مربوط به این حیطه رو می خوام تا بتونم کارم رو بهتر کنم و در آخر یه نسخه اش رو همین جا آپ کنم (البته با اجازه مدیریت )
من رو از نظرات ارزشمندتون محروم نکنید :چشمک::لبخندساده:

whitehat
دوشنبه 01 مهر 1387, 11:07 صبح
بهتره برای اینکه این تاپیک به یک تاپیک مفید تبدیل شود و دوستان بیشتری در بحث شرکت کنند،شما مختصری در مورد Segmentation و الگوریتم های مورد استفاده و موارد کاربرد توضیح دهید.
این بحث یکی از جالبترین و کاربردی ترین بحثهای پردازش تصویر است، بهتره شما در برنامه تان انواع الگوریتم ها و فیلتر ها را پیاده سازی کنید. البته شما در مورد کاری که می خواهید دقیقا انجام دهید چیزی ننوشتید. فکر کنم ساده ترین حالت آن استفاده از دسته بندی K-Means است که بعدا می توانید با تغییر پارامترها نتایج جالبی را ببینید

mohi_ka2
دوشنبه 01 مهر 1387, 20:26 عصر
بهتره برای اینکه این تاپیک به یک تاپیک مفید تبدیل شود و دوستان بیشتری در بحث شرکت کنند،شما مختصری در مورد Segmentation و الگوریتم های مورد استفاده و موارد کاربرد توضیح دهید.



این هم توضیح پروژه ام ؛ چیزی که به عنوان توضیح پروژه برای استادم زدم :



معمولا بخش بندی تصویر اولین مرحله در تحلیل تصویر است . با عمل بخش بندی تصویر به قسمتهای تشکیل دهنده اش تقسیم می شود . میزان بخش بندی به موضوع مورد نظر بستگی دارد. یعنی وقتی اشیای مورد علاقه ی کاربر مورد نظر از هم جدا شدند ، باید بخش بندی متوقف شود
به طور کلی بخش بندی یکی از مشکل ترین کارها در پردازش تصویر استکه موفقیت یا شکست احتمالی تحلیل تصویر را مشخص می کند . بنابراین باید توجه زیادی معطوف به افزایش احتمال دستیابی به بخش بندی قابل اعتماد بشود
الگوریتمهای بخش بندی در دسته های متفاوت قرار می گیرند که مبنای این دسته بندی ها صفات تصاویر می باشد
در این پروژه سعی خواهد شد الگوریتمهای موجود در این دسته بندی ها مورد مطالعه و تحقیق و پیاده سازی قرار گیرند
دسته بندی های ذکر شده به شرح زیر می باشند :
1- آشکار سازی ناپیوستگی ها ( آشکار سازی نقطه ، خط ، لبه، ترکیبی)
2- پیوند لبه و آشکار سازی مرز (پردازش محلی ، سراسری با تبدیل هاف ، سراسری با روشهای نظریه گراف ،
3- آستانه گیری (آستانه گیری سراسری ساده ، بهینه ، انتخاب آستانه بر اساس مشخصات مرز ، آستانه های مبتنی بر چند متغیر )
4- بخش بندی ناحیه گرا (رشد ناحیه با پیوستن پیکسل ، تقسیم و ادغام ناحیه )
5- استفاده از حرکت در بخش بندی. (روشهای مکانی ، روشهای حوزه فرکانس )

ممنون می شم ادامه بدیم :لبخندساده:

mohi_ka2
دوشنبه 01 مهر 1387, 20:28 عصر
فکر کنم ساده ترین حالت آن استفاده از دسته بندی K-Means است که بعدا می توانید با تغییر پارامترها نتایج جالبی را ببینید

منظورتونو از K-Means نفهمیدم !! :ناراحت::متفکر: می شه لطف کنید و یه کم توضیح بدید؟؟
ممنون :لبخندساده:

whitehat
سه شنبه 02 مهر 1387, 11:32 صبح
به نظر من بهتره مرحله به مرحله جلو برویم، و در مورد هر مرحله و الگوریتم مربوط به آن بحث کنیم، در انتها پستهای اضافی پاک می شود و مرجع خوبی از این بحث پردازش تصویر خواهیدم داشت.
در هر الگوریتم بهتره نام لاتین آنرا برای جستجوی بهتر بگذارید، بهتره فعلا وارد بحث تصاویر رنگی نشوید (K-Means را بعدا به آن می رسیم) و فرض کنید تصاویر شما Gray Scale است.
اول یک پروژه آماده کنید که یک تصویر را از ورودی گرفته و بر اساس یک انتخاب گر (مانند یک کامبو باکس) نوع الگوریتم را مشخص کند و یک تصویر خروجی را نمایش دهد. قسمتی از کد مورد نیاز را می توانید از تاپیک استفاده کنید.
قسمت اول مربوط آشکار سازی ناپیوستگی است ، برای این کار روشهایی وجود دارد مثلا استفاده از ماسکهای خاص و ...
بهتره بحث را برای قسمت اول شروع کنیم تا به قسمتهای بعدی برسیم
با تشکر

mohi_ka2
سه شنبه 02 مهر 1387, 20:16 عصر
با تشکر از پیگیریتون ، جناب مدیر، چشم . من از فردا شروع می کنم و کد هر بخش و سوالات خودمو تو اون مورد می زنم
با تشکر

mohi_ka2
چهارشنبه 03 مهر 1387, 21:00 عصر
با عرض پوزش از وقفه ای که افتاد ، مطمئن بدونید بد قولی نبوده :چشمک::لبخند:


به ترتیبی که ذکر شد ، فیلتر ها ، منطق وجود نوع خاص ماسک(در صورتیکه در کتاب کنبع ذکر شده باشد ) و تمام اطلاعات مفیدی را که داشته باشم ذکر می کنم .در ضمن منبع من ، کتاب گونزالس ، ترجمه «مرتضی خادمی وداوود جعفری» می باشد .و کدهای پیاده سازی با مطلب رو هم از پی دی اف انگلیسی همین کتاب که با مطلب پیاده سازی شده می آورم.


1- آشکار سازی ناپیوستگی ها :
در عمل عمومی ترین راه برای جستجوی ناپیوستگی ها ، پیمایش کامل تصاویر با یک نقاب است
نقاب:






W3

W2
W1
W6
W5
W4
W9
W8
W7












R= W1 Z1 +W2 Z2+W3 Z3+W4 Z4+W5 Z5+W6 Z6+W7 Z7+W8 Z8+W9 Z9
= ∑ Wi Zi


Zi ها سطح خاکستری پیکسل زیر نقاب Wi می باشند .
1-1 ) آشکار سازی نقطه (Point Detection):
برای آشکار سازی نقاط منفرد متفاوت با یک زمینه ی ثابت از نقاب زیر استفاده می کنیم :




-1

-1
-1
-1
8
-1
-1
-1
-1









1-1 ) آشکار سازی نقطه : نقاب بالا یک نقاب مناسب برای این نوع آشکار سازی می باشد .
ایده پشتیبان : سطح خاکسترزی یک نقطه منفرد کاملا متفاوت از سطح خاکستری همسایه اش است .در اینجا تنها تفاضل های به اندازه کافی بزرگ که با T تعیین می شوند مورد علاقه اند .



|R| < T






کد پیاده سازی با مطلب :




>> f=imread('g:/c.png');
>> w=[-1 -1 -1 ; -1 8 -1 ; -1 -1 -1];
>> g=abs(imfilter(double(f),w));
>> T=max(g(:));
>> g=g>=T;
>> imshow(g)


والبته این اررو رو هم می ده که من دلیلش رو نمی دونم !!

??? Error using ==> imuitools\private\imageDisplayParseInputs>validateCData
If input is logical (binary), it must be two-dimensional.
Error in ==> imuitools\private\imageDisplayParseInputs at 205
cdata = validateCData(cdata,image_type);
Error in ==> imshow at 151
[cdata, cdatamapping, clim, map, xdata, ydata, ...


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


ممنون از توجهتون :لبخندساده::چشمک:

mohi_ka2
چهارشنبه 03 مهر 1387, 21:37 عصر
نمی دونم چرا جدولها رو نمی زنه !!

Nova19
پنج شنبه 04 مهر 1387, 01:57 صبح
در مورد کدتون تنها خطا فکر می کنم استفاده از "/" یه جای "\" می باشد. اما در مورد Error مربوطه فکر می کنم که یا عکسی که استفاده می کنی Gray Scale نیست و یا اینکه به هنگام نصب مطلب تمام toolbox ها رو کامل نصب نکردی البته مطمئن نیستم در هر حال کد به غیر از همون مورد ایراد دیگری ندارد.


می خوام بدونم این عملیات برای فرمتها یا اندازه های خاصی از تصاویر هست ؟؟و یا اگر همونطور که در توضیح توابع ذکر شده ، در toolbox مطلب اومده ، بشه تصاویر دیگه ای رو هم با این توابع پشتیبانی کردتا اونجایی که من می دونم خیر به نوع ذخیره سازی تصویر بستگی ندارد. فرمت های ذخیره نمودن تصاویر فقط روی حجم و کیفیت تصاویر تاثیر می گذارند.
الگوریتم و منطق این توابع رو از کجا می تونم گیر بیارم که ببینم چطور کار می کنندمنطق پشت این توابع در حقیقت همان Convolution دو تابع است که در مباحث مربوط به آنالیز سیگنال مطرح می شود که مبحث نسبتا مفصلی است. اما اگر بخواهیم مسئله را با ساده ترین حالت ممکن بیان کنیم در حقیقت در اینجا ما با استفاده از یک ماسک (یا Kernel) سه در سه تمام سطح عکس را جاروب می کنیم یعنی پیکسل میانی kernel در هر مرحله روی یک پیکسل از عکس قرار می گیرد و مقادیر پیکسل های متناظر از عکس و kernel در هم ضرب و با هم جمع شده و نتیجه در ماتریس Result در همان موقعیت پیکسل میانی قرار می گیرد و این روند پیکسل به پیکسل ادامه می یابد. البته این روند کند می باشد و برای سریع تر انجام شدن کار مطلب از یک سری الگوریتم های مکمل بهره می گیرد اما اساس کار همان است که گفته شد.

kernel ی که در اینجا استفاده می کنیم به Laplacian مشهور است و در حقیقت هر پیکسل را با پیکسل های همجوار مقایسه و شیب رنگ را در آن پیکسل بدست می آورد. و در نهایت می گوییم اگر شیب رنگ در هر پیکسل از یک مقدار بزرگتر بود آن نقطه نقطه مورد نظر ماست.

امیدوارم توضیحاتم کافی بوده باشه

mohi_ka2
پنج شنبه 04 مهر 1387, 14:19 عصر
با سلام به دوستان
اینم بخش بعدی : :چشمک:




1-2) آشکارسازی خط (Line Detection):
نقابهای زیر هرکدام برای کاربردهای متفاوت هستند :
-45◦ :


-1 -1 2



-1 2 -1



2 -1 -1


عمودی :
-1 2 -1
-1 2 -1
-1 2 -1


+45◦:
2 -1 -1
-1 2 -1
-1 -1 2


افقی :


-1 -1 -1
2 2 2
-1 -1 -1


اگر نقاب افقی ، در تصویر حرکت نماید ، به خطوط افقی با ضخامت یک پیکسل پاسخ مناسبی خواهد داد (بسیار بزرگتر) در یک زمینه ی ثابت وقتی این نتیجه را می گیریم که خط افقی از سطح وسط نقاب عبور کند
*اگر در یک نقطه معین برای تمام J هایی که j<>i ، |Ri|>|Rj| گفته می شود که به احتمال بیشتر ، آن نقطه مربوط به خطی در جهت نقاب i است .


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

mohi_ka2
پنج شنبه 04 مهر 1387, 14:45 عصر
منطق پشت این توابع در حقیقت همان Convolution دو تابع است که در مباحث مربوط به آنالیز سیگنال مطرح می شود که مبحث نسبتا مفصلی است.


ممنون از توضیحاتتون
اما من دقیقا همین کانولوشن توابع رو می خوام بدونم ! اگه می شه بیشتر توضیح بدید . چون اون توضیح ساده رو که ... :چشمک:

اما در مورد Error ، تصویر GrayScale نیست اما مورد دیگه ای که گفتید خطا نداره . toolbox رو هم کامل نصب کردم

Nova19
جمعه 05 مهر 1387, 14:13 عصر
اما من دقیقا همین کانولوشن توابع رو می خوام بدونم ! اگه می شه بیشتر توضیح بدید . چون اون توضیح ساده رو که ...
شما باید سوالتون رو صریح تر مطرح کنید چون من از میزان اطلاعات شما هیچ پیش زمینه ای ندارم.

اما بیان ریاضی Convolution در محیط های پیوسته (مثلا در بحث سیگنال) به صورت یک انتگرال و در محیط های گسسته (مثل درجه خاکستری در عکس های رقومی) به صورت سیگما است که من نمی دونستم فرمول هاشو چه جوری باید می نوشتم برای همین یه لینک با مثال پیدا کردم امیدوارم مفید باشه.
http://cnx.org/content/m11541/latest/

mohi_ka2
جمعه 05 مهر 1387, 20:39 عصر
شما باید سوالتون رو صریح تر مطرح کنید چون من از میزان اطلاعات شما هیچ پیش زمینه ای ندارم.

اما بیان ریاضی Convolution در محیط های پیوسته (مثلا در بحث سیگنال) به صورت یک انتگرال و در محیط های گسسته (مثل درجه خاکستری در عکس های رقومی) به صورت سیگما است که من نمی دونستم فرمول هاشو چه جوری باید می نوشتم برای همین یه لینک با مثال پیدا کردم امیدوارم مفید باشه.
http://cnx.org/content/m11541/latest/

اولا از لینکتون ممنون
هنوز کامل نخوندمش اما اگه اشکالی داشتم می تونم ازتون بپرسم ؟
من می خوام ریز کار تابع رو بدونم و اگه بلدنباشم می تونم یاد بگیرم :لبخند::چشمک:. اطلاعاتم هم اطلاعات پایه ای در پردازش تصویر هست و زیاد عمق و وسعت نداره (متأسفانه !!:ناراحت:)... و به کمک دوستان احتیاج دارم :چشمک:
بازم ممنون

mohi_ka2
شنبه 06 مهر 1387, 20:31 عصر
سلام به همه دوستان
من تو کد آخرین فیلتری که گذاشتم دچار اشکال شدم !!!
تابع Pixeldup چی هستش؟؟ من تو خود توضیحات پی دی اف پیداش نمی کنم ! و تو این ورژن از مطلب هم که من دارم چیزی درموردش پیدا نمی کنم !!
کسی هست بدونه این تابع چیه و چیکار می کنه ؟؟

mohi_ka2
یک شنبه 07 مهر 1387, 21:38 عصر
کسی جواب سوال رو نمی دونه ؟؟؟
کسی نیست یه کمکی یا راهنمایی ای بکنه ؟؟؟ :(

mohi_ka2
دوشنبه 08 مهر 1387, 11:20 صبح
سلام
یه پاورپوینت پیدا کردم که حاوی یکی دومبحث آخریه که الان ما سر اون مباحثیم ،اون فایل رو براتون می ذارم ؛ تو این فایل کدهایی که من در موردشون کاشکال دارم هم هست ، اگه یه لطفی بکنید و یه نگاهی بندازید و راهنمایی کنید ممنون می شم :چشمک::لبخندساده:
خصوصا در رابطه با تابع : pixeldup

whitehat
دوشنبه 08 مهر 1387, 11:48 صبح
من در مورد یکی از توابع یک راهنمایی می کنم ،امیدوار بقیه را بتوانید خودتان بنویسید
شما باید جدولی رو که در پست قبلی خودتون نوشتید بر روی تصویر حرکت بدید تا بتونید لبه ها را مشخص کنید(معمولا برای راحتتر شدن کد نویسی بهتره از پیکسلهای کناری تصویر صرفه نظر کنید)


%Edge Detection For Single Point With Mask 8*8
function [MO]=my_edge_mask(MI,T,FLAG)
N=size(MI,1);
M=size(MI,2);
for i=2:N-1
for j=2:M-1
R=(8*MI(i,j) )-(MI(i-1,j-1)+MI(i,j-1)+MI(i+1,j-1)+MI(i-1,j)+...
MI(i+1,j)+MI(i-1,j+1)+MI(i,j+1)+MI(i+1,j+1));
if FLAG==1
if abs(R)>T
MO(i,j)=255;
else
MO(i,j)=0;
end;
else
MO(i,j)=R;
end
end;
end;

mohi_ka2
پنج شنبه 11 مهر 1387, 18:26 عصر
سلام به دوستان
برای پیاده سازی edge detection دچار مشکل شدم
می خوام از تابع edge در مطلب ، استفاده کنم ، اما پیغام خطایی نمایش می ده که می گه تصویر ورودی باید دوبعدی باشه !
حالا سوال من اینجاست که تصاویر دوبعدی چه خصوصیتی خاصی دارند ؟؟ و از ظاهر یک عکس چطور می شه فهمید که دوبعدی هست یا نه و اینکه آیا به فرمت های خاصی بستگی داره ؟؟:متفکر:
ممنون :چشمک:

Nova19
جمعه 12 مهر 1387, 17:46 عصر
احتمالا منظورش همون Gray Scale است یعنی به ازای هر مختصات x و y یک عدد بین 0 تا 255 ذخیره می شه در حالی که مثلا در تصاویر رنگی RGB به ازای هر x و y سه مقدار ذخیره می شه که می شه یه ماتریس سه بعدی!

اگه کمکی از من بربیاد دریغ نمی کنم:لبخندساده:

mohi_ka2
جمعه 12 مهر 1387, 18:49 عصر
احتمالا منظورش همون Gray Scale است یعنی به ازای هر مختصات x و y یک عدد بین 0 تا 255 ذخیره می شه در حالی که مثلا در تصاویر رنگی RGB به ازای هر x و y سه مقدار ذخیره می شه که می شه یه ماتریس سه بعدی!

اگه کمکی از من بربیاد دریغ نمی کنم:لبخندساده:
سلام
فکر می کنم فقط شما و آقای مدیر این تاپیک رو می خونید و پیگیری می کنید و صاحب نظرید :لبخندساده: پس لطفا منو از نظرهاتون محروم نکنید
من کد رو اینجا می ذارم اما فکر نمی کنم منظورش اون باشه . به نظرم تصویر تبدیل به باینری می شه و برای نمایش باید به دوبعدی تبدیل بشه !! :متفکر: البته می گم که مطمئن نیستم :چشمک:

اینم کد بدون تابع edge :



>> f=imread('g:/N1.jpg');
>> w45=[-2 -1 0;-1 0 1 ; 0 1 2];
>> g45=imfilter(double(f),w45,'replicate');
>> imshow(g45);
>> T=3.0*max(abs(g45(:)));
>> g45=g45>=T;
>> figure , imtool(g45);


Error :


?? Error using ==> imuitools\private\imageDisplayParseInputs>validateCData
If input is logical (binary), it must be two-dimensional.
Error in ==> imtool at 238
addImageToImtool(varargin{:});


با تابع edge :



>> f=imread('g:/N1.jpg');
>> g2=edge(f,'sobel',[],'horizontal');


Error :



??? Function EDGE expected its first input, I, to be two-dimensional.
Error in ==> edge>parse_inputs at 564
iptcheckinput(I,{'numeric'},{'nonsparse','2d'},mfi lename,'I',1);
Error in ==> edge at 197
[a,method,thresh,sigma,thinning,H,kx,ky] = parse_inputs(varargin{:});



:متفکر::متفکر::متفکر:

Nova19
شنبه 13 مهر 1387, 01:59 صبح
>> g45=g45>=T;
قبل از این سطر نوع g45 از نوع double است که پس از استفاده از این دستور به صورت logical در می آید توابع imshow یا imtool الگوریتم داخلی شان به گونه ای نوشته شده است که برای ماتریس های باینری بیش از دو بعد Exception تولید می کنند و اجراشون متوقف می شه منطقی هم است.:لبخند:
پیشنهاد من اینه که اگر عکس تون Gray Scale نیست پس از این سطر کد زیر را وارد کنید

>> g45=double(g45)
البته روش بالا حجم کارو افزایش می دهد و یک روش استاندارد نیست پیشنهاد من اینه که شما ابتدا برای یادگیری از عکس های Gray Scale استفاده کنید می توانید از عکس های آماده مطلب نظیر 'moon.tif' یا 'cameraman.tif' استفاده کنید چون بعضی توابع پردازش تصاویر مطلب (نه همشون) مثل edge برای عکس های تک لایه یا به عبارت دقیقتر ماتریس های دو بعدی نوشته شدند.
در تصاویر رنگی یک لایه تصویر مثلا لایه سبز رو به تابع بدین که این کار مثلا در تابع edge در 95 درصد مواقع به شما پاسخ قابل قبول می ده



>> g2=edge(f(:,:,1),'sobel',[],'horizontal');

mohi_ka2
شنبه 13 مهر 1387, 16:43 عصر
سلام
ممنون از لطفتون اما من باید در نهایت بتونم کل یک تصویر رنگی رو بدم به برنامه و اجزاش رو جدا کنه !! اونوقت چی ؟؟؟:افسرده::متفکر:

mohi_ka2
سه شنبه 23 مهر 1387, 21:05 عصر
سلام به دوستان
خیلی وقته می خوام اینجا رو ادامه بدم ، اما تو مسائل ریاضی مربوط به فیلتر های بعدی مشکل دارم !!
جدا از مسائل ریاضی ، با درک و پیاده سازی تبدیل هاف خیلی مشکل دارم ... کسی می دونه این تبدیل چیه و می تونه کمکم کنه ؟؟؟
ممنون می شم

mohi_ka2
چهارشنبه 01 آبان 1387, 19:03 عصر
اینجا کسی نیست جواب بده؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟ ؟؟ من واقعا مشکل پیدا کردم :((

alimooghashang
چهارشنبه 08 آبان 1387, 16:51 عصر
از همه بچه ها ممنونم
لطفا میشه یکی بگه توی تصویر چطوری میشه فهمید که چند تا شئی وجود داره؟
یا کدوم پیکسل ها مال یه شئی هست