تمیز کردن تصویر حاوی نویز

کاهش نویز (noise reduction) یک فرآیند حذف نویز از سینگال است‌.این سیگنال می‌تواند مربوط به یک تصویر، ویدئو یا یک فایل صوتی باشد.
تمام دستگاه‌های ضبط کردن (recording devices) ویژگی هایی دارند که آن‌ها را در معرض نویز قرار می‌دهد.نویز میتواند بصورت رندوم یا نویز سفید (به سیگنالی گفته می‌شود که در تابع چگالی توان آن ، توان به‌طور یکنواخت در همهٔ فرکانس‌ها توزیع شده ‌باشد) باشد.

حذف نویز

۱. مقدمه

هدف از از بین‌بردن نویز‌ها از سیگنال ،بازسازی تصویرِ تحریف شده و برگرداندن آن به حالت اصلیَش بر اساس مدل‌های ایده‌آل است که در این پژوهش چگونگی‌ این فرآیند را مورد بررسی قرار می‌دهیم.

تحریف تصویر میتواند ناشی از موارد زیر باشد :

  1. تضعیف تصویر (image degradation) در سنجش محیط :(مثال: آشفتگی تصادفی جوی)

  2. تضعیف ناهموار از نویز حسگر

  3. تضعیف ناشی از حسگرها : (مثال: حرکت دوربین یا خارج از فوکوس)

  4. اِعوِجاج(تحریف) هندسی(geometric distortion) :(مثال: عکس های زمین که توسط یک دوربین در یک ماهواره گرفته شده است.)


روی تصاویر دو عملیات میتوان انجام داد :

عملیات روی تصاویر

توضیح : این جدول در برنامه ی pages تهیه شده و تصویر آن در سایت http://uupload.ir آپلود شده تا بتوان در این قسمت آن را اضافه کرد و نمایش داد.این فایل در گیت هاب با عنوان attachments قرار داده شده است.


منشاء نویزها میتواند از موارد زیر باشد:

  1. نویز از حسگرها :
    .مدارهای الکترونیکی (Electronic circuits)
    .سطح نور (Light level)
    .دمای سنسور(Sensor temperature)

  2. نویز از محیط :
    .روشنایی (Lightening)
    .اختلال جوی (Atmospheric disturbance)
    .سایر سیگنال های الکتریکی / مغناطیسی قوی (Other strong electric/magnetic signals)

انواع نویز :[1]

  1. نویز گاوسی (gaussian noise)

  2. نویز رایلی (Rayleigh noise)

  3. نویز گاما (Gamma noise)

  4. نویز نمایی (Exponential noise)

  5. نویز یکنواخت (Uniform noise)

  6. نویز ضربه ای (salt & pepper = Impulse noise)

ما در این پروژه می خواهیم از الگوریتم‌های موجود برای حذف نویز استفاده کنیم.برای انتخاب یک الگوریتم مناسب ، نیاز است نکاتی باید مورد توجه قرار‌ بگیرد‌.

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

در قسمت کارهای مرتبط به روش‌های موجودی اشاره می‌کنیم که در پردازش تصاویر برای کاهش نویز از آنها استفاده شده است.

۲. کارهای مرتبط

  • حذف نویز از تصاویر توسط فیلتر کردن : فیلترینگ
    نویز تصویر یک اثر جانبی اجتناب ناپذیر است که در اثر ضبط تصویر اتفاق می افتد "نوسانات اجتناب ناپذیر" . در یک دوربین دیجیتال، اگر نور که به لنز وارد می شود با سنسور ناسازگار باشد، نویز تصویر ایجاد می کند.حتی اگر نویز در یک تصویر قابل مشاهده نباشد، نوعی نویز تصویری وجود دارد. هر نوع دستگاه الکترونیکی یک سری نویز دریافت و ارسال میکند و به آن چیزی که در حال ایجاد شدن است انتقال میدهد.بنابراین، برای حذف نویز، فیلترها مورد نیاز هستند.آنها (فیلترها) انواع مختلفی دارند مثل فیلتر هموارساز خطی ،فیلتر میانه ، فیلتر وینر و فیلتر فازی . در این روش فیلتر کردن سه مورد (R G B) به صورت جداگانه انجام می شود.

    فیلتر کردن بصورت جداگانه (R G B)

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

    2. فیلتر میانه (median filter): الگوریتم فیلتر میانه به شرح زیر است:
      قدم اول : یک پنجره دو بعدی W به اندازه 3 * 3 را انتخاب کنید.(میتوان هر اندازه ی مربعی را انتخاب کرد اما در نتیجه تاثیر دارد.) فرض کنید که پیکسل در حال پردازش (C(x، y است. قدم دوم : محاسبه ی میانه ی(Wmed) (در تصویر زیر میانه عدد ۱۱ است) پیکسل ها در پنجره W . قدم سوم : جایگزینی (C(x، y توسط Wmed . قدم چهارم : مراحل یک تا سه را تکرار کنید تا تمام پیکسل ها در کل تصویر پردازش شوند.

      الگوریتم فیلتر میانه

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

۳. آزمایش ها

۳.۱. مرحله ی اول :

۳.۱.۱. توضیحات اولیه :

در مرحله ی اول ، روی چند تصویر آزمایش را انجام میدهیم . آزمایش به این صورت است که چند نوع نویز در تصاویر ایجاد میکنیم ، سپس با روش های موجود برای حذف نویز ، سعی میکنیم آنها ( نویزها ) را حذف کنیم . این روش ها مبتنی بر فیلترهای مکانی (spatial filters) هستند مثل mean filter و median filter .
نکته ای که باید به آن توجه کرد ، این است که فیلترهای مکانی برای همه ی نویز ها کاربرد ندارند و برای حذف یک سری از نویزها باید روش های دیگری اتخاذ کرد که در مرحله ی دوم آزمایشات (بهبود سازی) به آنها میپردازیم.
در پیاده سازی از کتابخانه ی openCV که برای بینایی کامپیوتر می باشد استفاده شده است.

۳.۱.۲. تصاویر استفاده شده :

در پوشه ای با عنوان Images در گیت هاب قرار داده شده است.

۳.۱.۳. توضیح در مورد پیاده سازی و کُد :

ایجاد کردن نویز روی تصاویر ، توسط یک تابع تعریف شده در کُد به نامِ noisy است که آرگومان های ورودی آن ، تصویر و نوع نویز می باشد.نویز های تعریف شده از نوع gaussian ، salt and pepper ، speckle هستند.
کد استفاده شده برای gaussian نویز :

row,col= image.shape
mean = 0
var = 100
sigma = var**0.5
gauss = np.random.normal(mean,sigma,(row,col))
gauss = gauss.reshape(row,col)
noisy = (image + gauss)
for i in range(len(noisy)):
     for j in range(len(noisy[i])):
             noisy[i,j] = np.uint8(noisy[i,j])
             if( noisy[i,j]<0):
                        noisy[i,j] = 0 
             elif  noisy[i,j]>255: 
                        noisy[i,j]=255

کد استفاده شده برای salt and pepper نویز :
در این مرحله بصورت رندوم خانه هایی از عکس انتخاب شده و رنگ آنها سیاه یا سفید میشود.

s_vs_p = 0.5
amount = 0.04
out = np.copy(image)
num_salt = np.ceil(amount * image.size * s_vs_p)
coords = [np.random.randint(0, i - 1, int(num_salt)) for i in image.shape]
out[coords] = 255
num_pepper = np.ceil(amount* image.size * (1. - s_vs_p))
coords = [np.random.randint(0, i - 1, int(num_pepper))for i in image.shape]
out[coords] = 0

کد استفاده شده برای speckle نویز :

row,col = image.shape
gauss = np.random.randn(row,col)
gauss = gauss.reshape(row,col)
noisy = image + image * gauss

کد استفاده شده برای [2] mean filter :
با افزایش مقدار اعداد ، نویز بیشتری حذف میشود اما تصویر تار تری خواهیم داشت.

kernel = np.ones((3,3),np.float32)/9
denoised_mean = cv2.filter2D(noisyImage,-1,kernel)

کد استفاده شده برای [3] median filter :
با استفاده از openCV در یک دستور میتوانیم از این الگوریتم استفاده کنیم.عدد ۳ به معنای مربعی با ضلع به اندازه ی ۳ پیکسل است.

denoised_median = cv2.medianBlur(image,3)

۳.۱.۴. نتایج :

طبق آزمایشات به عمل آمده از بین ۲ روش پیاده سازی شده برای حذف نویز ، median filter نتیجه ی دلخواه را می دهد ولی mean filter تصویر واضحی نمیدهد و آن را تار میکند.

نتایج کامل این مرحله که در گیت هابِ مربوطه در پوشه ی Results قرار داده شده ، قابل مشاهده است.

از سمت چپ : اولی تصویری از یک ماشین دارای نویز از نوع speckle است ،دومی با median filter و سومی با mean filter پردازش شده اند.

۳.۲. مرحله ی دوم :

۳.۲.۱. توضیحات اولیه:

آزمایش روی نمونه های بیشتر و استفاده از روش های رفع نویز در دامنه ی فرکانس است. در این مرحله ما از تصویر حاوی نویز پریودیک استفاده میکنیم.(توضیح این نویز در قسمت پیوندهای مفید آورده شده است.)در تصاویر از تبدیل فوریه ی گسسته (DFT) برای بدست آوردن دامنه ی فرکانسی استفاده میشود.محاسبه ی DFT به کمک تبدیل فوریه ی سریع (FFT) بدست می آید.با توجه به این محاسبات مؤلفه ی فرکانس صفر (DC) که سمت چپ بالای تصویر است را خواهیم داشت.نیاز است این مولفه را تا وسط تصویر شیفت بدهیم ،در این مرحله تبدیل فرکانسی بدست آمده است.(توضیحات بیشتر در قسمت پایینی)

۳.۲.۲. توضیح در مورد پیاده سازی و کُد :

پس از خواندن عکس

img = cv2.imread('test1.jpg',0)

استفده از FFT برای بدست آوردن تبدیل فوریه ی گسسته که منجر به محاسبه ی DC میشود.
خط سوم مربوط به انتقال مؤلفه ی DC به مرکز تصویر است.

dft = cv2.dft(np.float32(img),flags = cv2.DFT_COMPLEX_OUTPUT)
dft_shift = np.fft.fftshift(dft)
magnitude_spectrum = 20*np.log(cv2.magnitude(dft_shift[:,:,0],dft_shift[:,:,1]))

پیدا کردن فرکانس پایین و ایجاد یک پنجره ی ۶۰ در ۶۰ برای پوشاندن آن.

mask = np.zeros((rows,cols,2),np.uint8)
mask[crow-30:crow+30, ccol-30:ccol+30] = 1

حال مراحل را برعکس انجام میدهیم.انتقال به عقب و تبدیل فوریه ی معکوس.

fshift = dft_shift*mask
f_ishift = np.fft.ifftshift(fshift)
img_back = cv2.idft(f_ishift)
img_back = cv2.magnitude(img_back[:,:,0],img_back[:,:,1])

۳.۲.۳. نتایج :

همانطور که مشاهده می شود تصویر کاملا واضح نخواهیم داشت اما خطوط افقی که بصورت پریودیک در تصویر بودند ، تا حد خوبی از بین رفته اند.

نتیجه

فایل main.py در گیت هاب کد مربوط به هر دو مرحله را داراست.

۴. مقایسه :

در این جدول ، فیلتر مناسب برای رفعِ نویز های بررسی شده مشخص شده است.

جدول

۵. مراجع

[1]Signal & Image Processing : An International Journal (SIPIJ) Vol.6, No.2, April 2015 , Ajay Kumar Boyat1 and Brijendra Kumar Joshi
[2]Computer Vision: A First Course, Blackwell Scientific Publications, 1988, pp 32 - 34.
Machine Vision: Theory, Algorithms and Practicalities, Academic Press, 1990, Chap. 3.
[3]An Introduction to Image Processing, Chapman and Hall, 1991, p 274.

۶. پیوندهای مفید

در این پژوهش از یک سری اسلایدها مورد مطالعه قرار گرفته که لینک‌‌های مربوطه را در قسمتِ پیوندهای مفید آورده‌ایم.

Slides 1
Slides 2
Periodic Noise

محمد حسن سوهان آجینی

سلام
در بخش مقدمه، توضیحات نسبتا خوبی ارایه شد. اما با در نظر گرفتن موارد زیر، می‌توان کار را بهبود داد:
۱- برای کلمه‌ی distortion، به جای واژه‌ی «تحریف» از عبارت «اعوجاج» استفاده کنید.
۲- در قمستی که با عبارت «روی تصاویر دو عملیات میتوان انجام داد» شروع می‌شود، شما نیاز به یک جدول دارید. در حال حاضر نحوه‌ی نمایش این قسمت صحیح نیست.
۳- برای معرفی توزیع نویزهای مختلف از عکس مناسب‌تری استفاده کنید. حداقل به جای کل اسلاید، تنها از بخش مربوط به نمودارها عکس می‌گرفتید.
اما در بخش کارهای مرتبط موارد زیر را اصلاح کنید:
۱- جمله‌ی اول این بخش مشکل دستوری دارد و مفهوم نیست! با توجه به جمله‌ی انتهایی این بخش، به نظر نمی‌رسد ترجمه‌ی این بخش کار انسان باشد.
۲- در توضیحات فیلتر میانه، Wmed را به اشتباه میانگین ترجمه کرده‌اید.
در بخش مراجع اشتباهات بسیار فاحشی وجود دارد!
۱- اسلایدهای مورد استفاده را در بخش «پیوندهای مفید» ذکر کنید.
۲- پیوند هیچ یک از مراجع با عنوان آن همخوانی ندارد و در همه‌ی موارد به wikipedia ارجاع داده‌اید. در هیچ یک از متون علمی، نمی‌توان از ویکی پدیا به عنوان مرجع استفاده کرد.
۳- مرجع اولی که آورده‌اید مرجع طراحی برای مدارهای op-amp است و به هیچ عنوان ارتباطی با مساله‌ی شما ندارد. در فازهای بعدی از آوردن این دست مراجع ربط به شدت خود داری کنید.

محمد حسن سوهان آجینی

سلام
هنوز برخی از ایرادات وارد شده در مرحله‌ی قبل در متن موجود هستند و اصلاح نشده‌اند.
موارد زیر به بهتر شدن کار شما کمک می‌کند (هر چند آوردن بعضی موارد در گزارش نهایی شما لازم هستند):
۱- توضیحات ارایه‌شده در قسمت ۳.۱.۳ بسیار مختصر هستند. انتظار می‌رفت توضیح بیشتری در مورد پارامترهای مهم هر نویز ارایه می‌دادید.
۲- برای سنجش کار، از عکس‌های رنگی نیز استفاده کنید. اعمال فیلتر‌ها روی کانال‌های RGB کار سختی نیست!
۳- در گزارش نهایی کار، مقایسه‌ی انواع فیلترها و اینکه هر کدام در چه نویز‌هایی بهتر عمل می‌کنند لازم است.

تایید شده

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

رد شده

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

محمد حسن سوهان آجینی

سلام
ضمن تشکر از زحماتی که در طی انجام این پروژه کشیدید، در توضیحات اولیه آورده‌اید: «توضیح این نویز در قسمت پیوندهای مفید آورده شده است». شما می‌بایست توضیحات کافی، برای تمام دانش و الگوریتم‌هایی که در کار خود استفاده کرده‌اید را بیاورید. در غیر این صورت برای تمام روش‌ها و الگوریتم‌هایی که استفاده کرده‌اید، توضیحات مناسبی در اینترنت یافت می‌شود!
توضیحاتی که در مورد الگوریتم حذف نویز پریودیک آورده‌اید بسیار ناقص و گنگ است. حتی در کدهایی که آورده‌اید نیز مشخص نیست که اعداد crow و ccol از کجا آورده شده‌است! در واقع برای نحوه‌ی پیدا کردن فرکانس پایین هیچ توضیحی آورده نشده‌است.
آوردن جدول مقایسه بسیار خوب و بجا بود، اما جای خالی مقایسه‌ی انواع فیلترها روی نویز پریودیک احساس می‌شود. انتظار می‌رفت شکلی مشابه شکلی که در بخش ۳.۱.۴ آوردید را به منظور نشان دادن کیفیت فیلترها روی نویز پریودیک تکرار می‌کردید.
در مجموع پروژه در حد قابل قبولی انجام گرفته‌است.

تایید شده

با سلام
بخش مقدمه بسیار کوتاه بود. به راحتی میتوانستید توضیح جامع تری بر مسئله داشته باشید. به ویژه اینکه انواع نویز های مختلف را نام بردید اما توضیح ندادید که هرکدام به چه معناست. و این مسئله فهم بخش های دیگر را سخت می کرد.
بخش کارهای مرتبط بهتر از بخش مقدمه بود . اما باز هم جای خالی توضیحات دقیق و مناسب و ذکر مثال و تصاویر احساس می شد.
بخش آزمایش ها نسبت به دو بخش قبلی بهتر و تا حد خوبی قابل قبول بود
بخش بهبود نتایج (3.2) . در این بخش متوجه بهبودی که حاصل کردید نشدم. نویز متفاوتی از بخش آزمایش هارا با الگوریتم متفاوتی رفع کردید و انگار بخش آزمایش هارا ادامه داده اید . در نگاه گذرا حتی به نظر میرسد فیلتر میانه در بخش آزمایش های اولیه بهتر عمل کرده است.

رد شده

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

تایید شده

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

تایید شده

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