رفتن به مطلب

الگوریتم ایزودیتا


ارسال های توصیه شده

سلام

دوستان من این برنامه ی ایزودیتا رو از رو نت برداشتم، الگوریتم کلی رو میدونم چیکار می کنه، ولی برنامه رو نه! ممنون میشم کمک کنید.

 

Threshold = 0;

[counts,N]=hist(V_3);

i=1;

mu=cumsum(counts);

T(i)=(sum(N.*counts))/mu(end);

T(i)=round(T(i));

idx = (N

mu2=cumsum(counts(idx));

MBT=sum(N(idx).*counts(idx))/mu2(end);

idx2 = logical(1-idx);

mu3=cumsum(counts(idx2));

MAT=sum(N(idx2).*counts(idx2))/mu3(end);

i=i+1;

% new T = (MAT+MBT)/2

T(i)=round((MAT+MBT)/2);

 

% repeat step 2 if T(i)~=T(i-1)

while abs(T(i)-T(i-1))>1

idx = (N

mu2=cumsum(counts(idx));

MBT=sum(N(idx).*counts(idx))/mu2(end);

idx2 = logical(1-idx);

mu3=cumsum(counts(idx2));

MAT=sum(N(idx2).*counts(idx2))/mu3(end);

 

i=i+1;

T(i)=round((MAT+MBT)/2);

Threshold=T(i);

end

 

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

  • Like 3
لینک به دیدگاه
سلام

دوستان من این برنامه ی ایزودیتا رو از رو نت برداشتم، الگوریتم کلی رو میدونم چیکار می کنه، ولی برنامه رو نه! ممنون میشم کمک کنید.

 

threshold = 0;

[counts,n]=hist(v_3);

i=1;

mu=cumsum(counts);

t(i)=(sum(n.*counts))/mu(end);

t(i)=round(t(i));

idx = (n

mu2=cumsum(counts(idx));

mbt=sum(n(idx).*counts(idx))/mu2(end);

idx2 = logical(1-idx);

mu3=cumsum(counts(idx2));

mat=sum(n(idx2).*counts(idx2))/mu3(end);

i=i+1;

% new t = (mat+mbt)/2

t(i)=round((mat+mbt)/2);

 

% repeat step 2 if t(i)~=t(i-1)

while abs(t(i)-t(i-1))>1

idx = (n

mu2=cumsum(counts(idx));

mbt=sum(n(idx).*counts(idx))/mu2(end);

idx2 = logical(1-idx);

mu3=cumsum(counts(idx2));

mat=sum(n(idx2).*counts(idx2))/mu3(end);

 

i=i+1;

t(i)=round((mat+mbt)/2);

threshold=t(i);

end

 

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

 

سلام

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

مقادیرش بین چه اعدادی هست، از چه نوع و با چه ابعادی داره؟

  • Like 3
لینک به دیدگاه
ورودیم تصویر هست، تصویر سه بعدی با 25 تا slice. مقادیرش هم بین 0 تا 255 و ابعادش 512*512*25

 

الگوریتم رو نمیشناسم، کد رو توضیح میدم. V_3 هم اینجوری بهش دادم، اعداد صحیح بین 0 تا 255 با همون ابعاد:

 

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

 

خب اول بیایم دستور hist رو ببینیم رو یه ماتریس چجوری عمل می کنه،

 

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

 

اینجا اومده یه ماتریس 10 در 3 بهمون توی خروجی داده، یعنی اومده هیستوگرام هر ستون رو توی ستون ماتریس خروجی گذاشته. هیستوگرام روی بعد اول حساب میشه.

 

بعد میاد همین رو به cumsum میده، بازم رو بعد اول این ماتریس Cumulative sum حساب میشه:

 

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

 

یعنی روی هر ستون تصویر هستوگرام رو حساب می کنه، تو یه ماتریس 10 در 12800 قرار میده، بعد هم این هیستوگرام رو به cumsum میده.

 

خط بعد N.*counts که درست نیست، ابعاد این دو متغیر با هم برابر نیست که بتونیم در هم ضرب کنیم، جایی رو اشتباه کردم؟

  • Like 3
لینک به دیدگاه
ممنون، بسیار عالی :icon_gol:

رو تصویر من که ابعادشون یکی هست هر دو 10*1 هستن.

فقط من متوجه نشدم centers چیکار میکنه؟

 

خواهش می کنم.

 

مگه تصویر شما 512 در 512 در 25 نیست، V_3 هم گفتین همین ابعاد رو داره دیگه، چطور پس هر دوشون 10 در 1 میشن؟

 

دستور hist بازه مقادیر ورودی [255 0]رو به 10 قسمت تقسیم می کنه، centers در واقع مراکز این ده بازه هست.

  • Like 3
لینک به دیدگاه
اِ ببخشید من یادم رفت بگم که تصویرم رو تبدیل به یه بردار کردم!:ws52:

 

خواهش می کنم، خوبه ساده تر هم میشه.

 

پس V_3 رو این شکلی در نظر می گیریم:

 

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

 

رنج مقادیر تصویر به 10 بازه تبدیل میشه، تعداد پیکسل هایی که توی هر بازه در متغیر counts قرار می گیره، مرکز 10 تا بازه هم توی متغیر N.

cumsum هم که به صورت تجمعی جمع می کنه، درایه آخرش تعداد پیکسل های تصویرتون میشه. یعنی توی این خط میاد مرکز هر بازه و در تعداد پیکس های اون بازه ضرب می کنه، با هم جمع می کنه، تقسیم برتعداد پیکسل ها می کنه.

 

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

 

بعد میاد عددی که بدست آورد رو به عدد صحیح تبدیل می کنه، ایندکس بازه هایی که کوچکتر از این عدد قرار دارن رو داخل idx میذاره. به همون روشی که T رو حساب کرد، MBT رو برای همین بازه ها حساب می کنه. برای دسته دومی که بزرگتر از T هستن هم MAT رو حساب می کنه. بعد این دو تا رو میانگین می گیره و به عدد صحیح تبدیل می کنه، برابر درایه دوم بردار T قرار میده:

 

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

 

بعد داخل یه حلقه این روند رو انقدر ادامه میده تا T همگرا بشه، عددی که از این روش بدست آورده مقدار Threshold رو تعیین می کنه:

 

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

 

 

به جای cumsumها از sum هم می تونست استفاده کنه، فقط با اینکار کدش پیچیده تر شده، کار خاصی انجام نمیدن.

  • Like 2
لینک به دیدگاه

ممنون:icon_gol:

یه سوال دیگه؛ البته ببخشید من انقدر سوال میکنم!

چرا به 10 بازه تقسیم می کنه؟ و اینکه نقش end تو تقسیم چیه؟

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

  • Like 1
لینک به دیدگاه
ممنون:icon_gol:

یه سوال دیگه؛ البته ببخشید من انقدر سوال میکنم!

چرا به 10 بازه تقسیم می کنه؟ و اینکه نقش end تو تقسیم چیه؟

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

 

خواهش می کنم.

چرا 10 بازه می گیره رو نمی دونم، ولی خود hist حالت عادی برای 10 تا بازه رو حساب می کنه، که میشه تعداد بازه های کمتر یا بیشتر رو هم باهاش حساب کرد.

 

end آدرس درایه آخر بردار mu هستش، چون به صورت Cumulative جمع میشه، برابر تعداد هستش، گفتم sum می تونست استفاده کنه که کد هم خیلی ساده تر میشد:

 

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

  • Like 2
لینک به دیدگاه

Automatic T value selection:

(1) Select an initial value for T (e.g. greater than the min and less than the max intensity value).

(2) Segment the image using the value of T and produce two groups of pixels.

(3) Compute the mean intensity of the two groups; m1 and m2.

(4) The new value for T is:T=1/2(m1+m2)

(5) Repeat the above steps until convergence.

الگوریتم ایزودیتا

 

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

کد نویسی اینم سخت نیست، راحت می تونین بنویسینش.

  • Like 2
لینک به دیدگاه
  • 6 سال بعد...
در در 31 خرداد 1393 در 22:55، zahra jalili گفته است :

سلام

دوستان من این برنامه ی ایزودیتا رو از رو نت برداشتم، الگوریتم کلی رو میدونم چیکار می کنه، ولی برنامه رو نه! ممنون میشم کمک کنید.

 

 

Threshold = 0;

[counts,N]=hist(V_3);

i=1;

mu=cumsum(counts);

T(i)=(sum(N.*counts))/mu(end);

T(i)=round(T(i));

idx = (N

mu2=cumsum(counts(idx));

MBT=sum(N(idx).*counts(idx))/mu2(end);

idx2 = logical(1-idx);

mu3=cumsum(counts(idx2));

MAT=sum(N(idx2).*counts(idx2))/mu3(end);

i=i+1;

% new T = (MAT+MBT)/2

T(i)=round((MAT+MBT)/2);

 

% repeat step 2 if T(i)~=T(i-1)

while abs(T(i)-T(i-1))>1

idx = (N

mu2=cumsum(counts(idx));

MBT=sum(N(idx).*counts(idx))/mu2(end);

idx2 = logical(1-idx);

mu3=cumsum(counts(idx2));

MAT=sum(N(idx2).*counts(idx2))/mu3(end);

 

i=i+1;

T(i)=round((MAT+MBT)/2);

Threshold=T(i);

end

 

 

 

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

ممنون از این کد که گذاشتید ، موید سلامت باشید

 

لینک به دیدگاه
×
×
  • اضافه کردن...