شما اینجا هستید

۱-۵ مثال های پیشرفته: کاهش اختلال و نویز تصویر

پیغام خطا

Deprecated function: The each() function is deprecated. This message will be suppressed on further calls در book_prev() (خط 775 در /home/molavy/public_html/modules/book/book.module).

ما این فصل را با یک مثال خیلی مفید پایان می دهیم، کاهش نویز تصاویر. کاهش اختلال تصویر به فرایند حذف نویز از تصویر همراه با نگاه داشتن جزییات و ساختار تصویر است. ما از مدل کاهش نویز 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 ساختار لبه های تصویر را حفظ می کند و همزمان نویز ها را رفع و مات می کند.

 

دیدگاه جدیدی بگذارید