شما اینجا هستید
۱-۵ مثال های پیشرفته: کاهش اختلال و نویز تصویر
ما این فصل را با یک مثال خیلی مفید پایان می دهیم، کاهش نویز تصاویر. کاهش اختلال تصویر به فرایند حذف نویز از تصویر همراه با نگاه داشتن جزییات و ساختار تصویر است. ما از مدل کاهش نویز Rudin-Osher-Fatemi که با نام(ROF) نیز شناخته می شود، استفاده می کنیم.حذف نویز از تصاویر برای برنامه های بسیاری مهم است، از اینکه تصاویر گرفته در تعطیلات را کمی بهتر کنیم تا بهبود کیفیت تصاویر ماهواره ای.ویژگی جالبی که مدل ROF دارد این است که به کمک آن می توان تصاویر با کیفیت تر داشت و در عین حال لبه ها و ساختار ها نیز دست نخورده باقی بمانند.
ریاضیاتی و تکنیک هایی که در پشت مدل ROF قرار دارد بسیار پیشرفته است و در حوزه این کتاب نمی گنجد. ما در ابتدا یک معرفی اولیه و خلاصه ای از آن ارائه می دهیم و سپس به پیاده سازی ROF بر اساس الگورتیم Chambolle خواهیم پرداخت.
مجموع تغییرات (TV) از تصویر I (در طیف سیاه و سفید) با جمع شیب نرمال تعریف شده است. شکل پیوسته آن به صورت زیر است:
به صورت گسسته مجموع تغییرات به شکل زیر در می آید
جایی که مجموع از روی تمام موقعیت های تصویر گرفته شده است:
x=[x,y]
در نسخه Chambolle از ROF، هدف ایجاد یک نسخه بدون نویز از تصویر با نام U که کیمنه کند:
کجا نرمال ||I − U || اختلاف بین U و تصویر اصلی I را اندازه گیری می کند. این به چه معناست، این به معنای آن است که به دنبال تصاویری اس که یکنواخت هستند، اما اجازه جهش در لبه های بین مناطق را می دهد.
from numpy import *
def denoise(im,U_init,tolerance=0.1,tau=0.125,tv_weight=100):
""" An implementation of the Rudin-Osher-Fatemi (ROF) denoising model
using the numerical procedure presented in eq (11) A. Chambolle (2005).
Input: noisy input image (grayscale), initial guess for U, weight of
the TV-regularizing term, steplength, tolerance for stop criterion.
Output: denoised and detextured image, texture residual. """
m,n = im.shape # size of noisy image
# initialize
U = U_init
Px = im # x-component to the dual field
Py = im # y-component of the dual field
error = 1
while (error > tolerance):
Uold = U
# gradient of primal variable
GradUx = roll(U,-1,axis=1)-U # x-component of U's gradient
GradUy = roll(U,-1,axis=0)-U # y-component of U's gradient
# update the dual varible
PxNew = Px + (tau/tv_weight)*GradUx
PyNew = Py + (tau/tv_weight)*GradUy
NormNew = maximum(1,sqrt(PxNew**2+PyNew**2))
Px = PxNew/NormNew # update of x-component (dual)
Py = PyNew/NormNew # update of y-component (dual)
# update the primal variable
RxPx = roll(Px,1,axis=1) # right x-translation of x-component
RyPy = roll(Py,1,axis=0) # right y-translation of y-component
DivP = (Px-RxPx)+(Py-RyPy) # divergence of the dual field.
U = im + tv_weight*DivP # update of the primal variable
# update of error
error = linalg.norm(U-Uold)/sqrt(n*m);
return U,im-U # denoised image and texture residual
در این مثال، ما از تابع roll استفاده کرده ایم. همانطور که از نام آن میتوان حدس زد، rolls مقادیر یک آرایه است که به صورت گردشی دور یک محور قرار گرفته اند. در این مورد برای مشتقات، محاسبه اختلاف همسایه ها خیلی راحت است. ما همچنین از linalg.norm استفاده کرده ایم، که اختلافات بین دو آرایه محاسبه می کند. تابع denoise را در فایل rof.py ذخیره کنید.
اجازه بدهید با یک مثال ساختگی برای تصویر متخلخل شروع کنیم:
from numpy import *
from numpy import random
from scipy.ndimage import filters
import rof
# create synthetic image with noise
im = zeros((500,500))
im[100:400,100:400] = 128
im[200:300,200:300] = 255
im = im + 30*random.standard_normal((500,500))
U,T = rof.denoise(im,im)
G = filters.gaussian_filter(im,10)
# save the result
from scipy.misc import imsave
imsave('synth_rof.pdf',U)
imsave('synth_gaussian.pdf',G)
تصاویر نتیجه همراه با نسخه اصلی در تصویر ۱-۱۳ نمایش داده شده اند. همانطور که می توانید ببینید، نسخه ROF لبه ها را کاملا حفظ کرده است.
تصویر ۱-۱۳ یک مثال از حذف نویز به روش ROF روی یک مثال ساختگی: (الف) تصویر متخلخل اصلی. (ب) تصویر بعد از مات کردن گوسی با( σ = 10). (ج) تصویر بعد از حذف نویز به روش ROF.
تصویر ۱-۱۴. یک مثال از حذف نویز ROF بر روی تصویر طیف سیاه و سفید: (الف) تصویر اصلی. (ب) تصویر بعد از مات کردن گوسی با (σ = 5). (ج) تصویر بعد از حذف نویز ROF.
حالا ، بیایید ببینیم چه اتفاقاتی رو تصویر اصلی اتفاق می افتد:
from PIL import Image
from pylab import *
import rof
im = array(Image.open('empire.jpg').convert('L'))
U,T = rof.denoise(im,im)
figure()
gray()
imshow(U)
axis('equal')
axis('off')
show()
نتیجه باید چیزی شبیه تصویر ۱-۱۴ ج باشد، که همچنین نسخه مات شده در مقایسه با تصویر یکسان نمایش داده شده است. همانطور که می بینید،حذف نویز ROF ساختار لبه های تصویر را حفظ می کند و همزمان نویز ها را رفع و مات می کند.
دیدگاه جدیدی بگذارید