رفتن به مطلب

هیستوگرام و بهبود تصویر


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

سلام

من می خوام یه تصویر رو بهبود بدم اما تو پیاده سازیش کلی مشکل دارم.

 

اولین مشکلم این هست که نمی دونم چطور uniform histogram تصویر رو بدست بیارم. من فقط دستور histeq رو بلدم. اگه می شه لطفا کمکم کنید کد uniform histogram رو پیدا نکردم. در ضمن تصویرم هم خاکستری هست.

 

با تشکر

لینک به دیدگاه
سلام

من می خوام یه تصویر رو بهبود بدم اما تو پیاده سازیش کلی مشکل دارم.

 

اولین مشکلم این هست که نمی دونم چطور uniform histogram تصویر رو بدست بیارم. من فقط دستور histeq رو بلدم. اگه می شه لطفا کمکم کنید کد uniform histogram رو پیدا نکردم. در ضمن تصویرم هم خاکستری هست.

 

با تشکر

 

سلام دوست عزیز

 

خب دستور histeq هم هستوگرام تصویر رو یکنواخت می کنه، فقط تعداد binها توی حالت دیفالتش 64 هست، مثل اینکه فرض کنیم تصویرمون 64 سطح روشنایی داره، 0 تا 3 بین اول، 4 تا 7 بین دوم و همینجوری تا آخر. هیستوگرام تصویر رو توی 64 ستون حساب می کنه و همون رو هم یکنواخت می کنه.

 

قرار هست پیاده سازیش کنی؟ می خوای شروع کن،با هم جلو بریم.:a030:

لینک به دیدگاه

سلام

اگر کمکم کنید لطف بزرگی در حق من می کنید آقا ایمان.

 

من شروع کردم اما دانشم کافی نیست و همش متوقف می شه کارم.

 

تو این قسمت از کارم باید uniform histogram تصویر رو بدست بیارم. اما من اصلا تفاوتش رو با histogram equalization متوجه نمی شم.:ws52:

 

histogram equalization هم کدش رو بلد نیستم فقط با histeq می تونم انجامش بدم.

باتشکر

لینک به دیدگاه
سلام

اگر کمکم کنید لطف بزرگی در حق من می کنید آقا ایمان.

 

من شروع کردم اما دانشم کافی نیست و همش متوقف می شه کارم.

 

تو این قسمت از کارم باید uniform histogram تصویر رو بدست بیارم. اما من اصلا تفاوتش رو با histogram equalization متوجه نمی شم.:ws52:

 

histogram equalization هم کدش رو بلد نیستم فقط با histeq می تونم انجامش بدم.

باتشکر

 

سلام

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

 

در واقع با Histogram Equalization فقط هیستوگرام تصویر باز تر میشه که به حالت یکنواخت نزدیک تر بشه، نمی تونیم مثلا اینجا این پیکسل هایی که یه سطح روشنایی دارن رو 100 تا 100 تا به سطح روشنایی های جدید نگاشت کنیم که هیستوگراممون یکنواخت بشه. هم تصویر بهم می ریزه و هم اینکه اصلا چجوری تعیین کنیم کدوم 100 تا به کدوم سطح روشنایی نگاشت بشن.

 

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

 

سخت نیست، گفتم با هم جلو میریم.:w16:

لینک به دیدگاه
سلام

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

 

در واقع با Histogram Equalization فقط هیستوگرام تصویر باز تر میشه که به حالت یکنواخت نزدیک تر بشه، نمی تونیم مثلا اینجا این پیکسل هایی که یه سطح روشنایی دارن رو 100 تا 100 تا به سطح روشنایی های جدید نگاشت کنیم که هیستوگراممون یکنواخت بشه. هم تصویر بهم می ریزه و هم اینکه اصلا چجوری تعیین کنیم کدوم 100 تا به کدوم سطح روشنایی نگاشت بشن.

 

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

 

سخت نیست، گفتم با هم جلو میریم.:w16:

 

سلام

من الان قسمت آخر رو نمی تونم انجام بدم. البته اگه تا اینجاش درست باشه.:icon_pf (34):

 

f=imread('d:\pic.jpg');
hnorm=imhist(f)./ numel(f);
cdf=cumsum(hnorm);

 

متشکرم

لینک به دیدگاه
سلام

من الان قسمت آخر رو نمی تونم انجام بدم. البته اگه تا اینجاش درست باشه.:icon_pf (34):

 

f=imread('d:\pic.jpg');
hnorm=imhist(f)./ numel(f);
cdf=cumsum(hnorm);

 

متشکرم

 

ببخشید دیر جواب میدم.

 

خیلی خوب نوشتی، بدون استفاده از فانکشن های متلب هم می تونی بنویسی؟

 

خب دیگه منحنی رو که حساب کردی، حالا باید با استفاده از این منحنی نگاشت رو انجام بدی. روی محور xها که مقادیر قبلی پیکسل ها رو داری، جدیدها هم روی محور yها هست دیگه، با یه حلقه می تونی انجامش بدی.:a030:

لینک به دیدگاه
ببخشید دیر جواب میدم.

 

خیلی خوب نوشتی، بدون استفاده از فانکشن های متلب هم می تونی بنویسی؟

 

خب دیگه منحنی رو که حساب کردی، حالا باید با استفاده از این منحنی نگاشت رو انجام بدی. روی محور xها که مقادیر قبلی پیکسل ها رو داری، جدیدها هم روی محور yها هست دیگه، با یه حلقه می تونی انجامش بدی.:a030:

 

نه بدون فانکشن های متلب بلد نیستم:ws37:

از تنبلیم نیست اما قسمت آخر رو نمی تونم انجام بدم .

لینک به دیدگاه
نه بدون فانکشن های متلب بلد نیستم:ws37:

از تنبلیم نیست اما قسمت آخر رو نمی تونم انجام بدم .

 

چیز سختی نیست، ببین مثلا توی این منحنی که بدست آوردی برای درایه دهم داشته باشی 0.4، یعنی پکسل هایی که مقدار 10 دارن رو به 0.4 تغییر باید داده بشه، البته اینجا مقدار بین 0 و 1 میشه، می تونه در 255 ضرب کنی و روند بشن که به همون فرمت 8 بیتی در بیان.

 

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

لینک به دیدگاه
چیز سختی نیست، ببین مثلا توی این منحنی که بدست آوردی برای درایه دهم داشته باشی 0.4، یعنی پکسل هایی که مقدار 10 دارن رو به 0.4 تغییر باید داده بشه، البته اینجا مقدار بین 0 و 1 میشه، می تونه در 255 ضرب کنی و روند بشن که به همون فرمت 8 بیتی در بیان.

 

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

 

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

لینک به دیدگاه

ببخشید

من CDF هیستوگرام نرمال شده رو محاسبه کردم ولی نمی تونم نگاشت رو انجام بدم. فکر می کنم این فرمولی که ضمیمه کردم هم به هین موضوع اشاره داره.

من روی این مسئله فکر کردم اما به نتیجه نرسیدم نمی تونم هیستوگرام جدید رو بدست بیارم(احتمالا باید هیستوگرام بدست بیاد دیگه:ws52:)

f1.PNG

لینک به دیدگاه
سلام

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

ممنون میشم اگر راهنمایی بفرمایید.:banel_smiley_4:

دوست عزیز شما می تونی با توابع متلب هم هیستوگرام نرمال شده رو بدست بیاری.


I=imread('0.jpg');
J=histeq(I);
imshow(J);
imhist(J);

یا اینکه میخوایین خودتون کد بنویسین؟

لینک به دیدگاه
سلام

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

ممنون میشم اگر راهنمایی بفرمایید.:banel_smiley_4:

 

راه دیگه ای که به نظرم رسید اینه:

اول بگم که cdf رو اشتباه حساب کردین، چون cdf برابر است با:


>> cdf=round(cumsum(hnorm)*255);

بعد برای نگاشت می تونین از این for استفاده کنین:


>> for i=1:size(f,1)

for j=1:size(f,2)

f(i,j)=cdf(f(i,j)+1);

end

end

لینک به دیدگاه
راه دیگه ای که به نظرم رسید اینه:

اول بگم که cdf رو اشتباه حساب کردین، چون cdf برابر است با:


>> cdf=round(cumsum(hnorm)*255);

بعد برای نگاشت می تونین از این for استفاده کنین:


>> for i=1:size(f,1)

for j=1:size(f,2)

f(i,j)=output(f(i,j)+1);

end

end

 

سلام

مرسی دوست عزیز با histeq رو بلد بودم ( البته باز هم مننونم ازتون )

ولی تو پیاده سازی همین قسمت آخر که حلقه for بود مشکل داشتم. که محبت کردید :icon_gol:

به نظر شما این فرمولی که ضمیمه کردم در واقع به همین حلقه for مربوط می شه؟

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

لینک به دیدگاه

من رو ببخشید که سئوالاتم خیلی ابتدایی هست . شرمنده ام:5c6ipag2mnshmsf5ju3

1) اما چطور می تونم با این حلقه for نگاشت رو انجام داد؟

2) اون 1و2 تو حلقه for چی کار می کنن. میدونم Size تصویر f هست اما 1و2؟

[color=#00008B]out[/color][color=#000000]=[/color][color=#000000]([/color][color=#000000]L[/color][color=#000000]-[/color][color=#800000]1[/color][color=#000000])*[/color][color=#000000]cdf[/color][color=#000000]([/color][color=#00008B]double[/color][color=#000000]([/color][color=#000000]im[/color][color=#000000])+[/color][color=#800000]1[/color][color=#000000])[/color][color=#000000]
[/color][color=#00008B]out[/color][color=#000000]=[/color][color=#000000] uint8[/color][color=#000000]([/color][color=#00008B]out[/color][color=#000000])[/color]

فکر می کنم cdf باید تو یه چیزی ضرب بشه.:hanghead:

 

و در آخرهم خواهش می کنم به فرمول ضمیمه شده در پست های قبل توجه بفرمایید.

با تشکر

لینک به دیدگاه

فکر کنم جواب سئوال 2 این باشه:ws37:

[m,n] = size(X) 
for i=1:m
 for j=1:n

 

و اینکه ما می خوایم به هیستوگرام برسیم اما انگار با این حلقه به تصویر می رسیم.:banel_smiley_4:

لینک به دیدگاه
من رو ببخشید که سئوالاتم خیلی ابتدایی هست . شرمنده ام:5c6ipag2mnshmsf5ju3

1) اما چطور می تونم با این حلقه for نگاشت رو انجام داد؟

2) اون 1و2 تو حلقه for چی کار می کنن. میدونم Size تصویر f هست اما 1و2؟

[color=#00008B]out[/color][color=#000000]=[/color][color=#000000]([/color][color=#000000]L[/color][color=#000000]-[/color][color=#800000]1[/color][color=#000000])*[/color][color=#000000]cdf[/color][color=#000000]([/color][color=#00008B]double[/color][color=#000000]([/color][color=#000000]im[/color][color=#000000])+[/color][color=#800000]1[/color][color=#000000])[/color][color=#000000]
[/color][color=#00008B]out[/color][color=#000000]=[/color][color=#000000] uint8[/color][color=#000000]([/color][color=#00008B]out[/color][color=#000000])[/color]

فکر می کنم cdf باید تو یه چیزی ضرب بشه.:hanghead:

 

و در آخرهم خواهش می کنم به فرمول ضمیمه شده در پست های قبل توجه بفرمایید.

با تشکر

 

فکر کنم جواب سئوال 2 این باشه:ws37:

[m,n] = size(X) 
for i=1:m
 for j=1:n

 

و اینکه ما می خوایم به هیستوگرام برسیم اما انگار با این حلقه به تصویر می رسیم.:banel_smiley_4:

 

این چه حرفیه، انجمن برای سوال کردن دیگه.

 

خب زهرا خانوم توضیح دادن، شما سطوح روشنایی تصویر ورودیت بین 0 تا 255 هست، این منحنی cdf هم که حساب کردی توی 256 تا درایه داره که مقادیر جدید این پیکسل های داخلش قرار داره، تنها کاری که باید انجام بشه اینه که دونه دونه پیکسل ها مفدارشون بررسی بشه (دو تا حلقه اینکار رو می کنن، جهت افقی و عمودی)، بعد هر مقداری داست با یک جمع می کنیم چون آدرس ها توی متلب از یک شروع میشه دیگه، مقدار جدید رو از بردار cdf بر می داریم، مثلا اگه مقدار قبلی پیکسلمون 10 باشه، مقدار جدیدش میشه درایه 11 بردار cdfمون.

 

در مورد اون فرمول هم باید بیشتر توضیح داده بشه، هر کدوم از این متغیر هایی که استفاده شدن چی هستن، int فکر کنم برای integer باشه، L هم تعداد سطوح روشنایی.

لینک به دیدگاه

دیگه کلا از پیاده سازیش نا امید شدم.

تو این پست یه عکس هستش از 3 فرمول که من سعی داشتم پیاده سازیش کنم قرار دادم. و هیچ چیز اضافه ای جز مواردی که تو پست های قبل خودم نوشتم بلد نیستم.

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

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

متشکرم

:icon_pf (34):

n1.jpg

لینک به دیدگاه

به گفتگو بپیوندید

هم اکنون می توانید مطلب خود را ارسال نمایید و بعداً ثبت نام کنید. اگر حساب کاربری دارید، برای ارسال با حساب کاربری خود اکنون وارد شوید .

مهمان
ارسال پاسخ به این موضوع ...

×   شما در حال چسباندن محتوایی با قالب بندی هستید.   حذف قالب بندی

  تنها استفاده از 75 اموجی مجاز می باشد.

×   لینک شما به صورت اتوماتیک جای گذاری شد.   نمایش به صورت لینک

×   محتوای قبلی شما بازگردانی شد.   پاک کردن محتوای ویرایشگر

×   شما مستقیما نمی توانید تصویر خود را قرار دهید. یا آن را اینجا بارگذاری کنید یا از یک URL قرار دهید.

×
×
  • اضافه کردن...