StevanovicMilan

9.1

Sep 18th, 2021
690
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. '''
  2. Napisati funkciju adaptiveMeanFilt koja implementira adaptivni aritmetički usrednjivač definisan sledećim izrazom:
  3.  
  4. gde je  g  slika koja se filtrira,  z¯  srednju vrednost okoline  Sxy  a  α  predstavlja odnos varijanse šuma i lokalne varijanse u okolini  Sxy .
  5.  
  6. Funkciju isprobati nad slikom lena.png kojoj je dodat AWGN varijanse 100. Koristiti parametre za region dimenzije 3x3. Prikazati dodatno kako izgleda slika  α .
  7. --------------------------------------------------------------------------------------------------------------------------------------------------------------
  8. Parametar lokalne srednje vrednosti  z¯  možemo unapred izračunati za svaku poziciju u okviru slike koristeći box filtar odgovarajuće veličine definisan okolinom  Sxy .
  9.  
  10. Lokalna varijansa je ovde određena korišćenjem scipy.ndimage.generic_filter funkcije.
  11. Funkcija implementira pokretni region oblika footprint parametra nad kojim se računa function funkcija i postavlja rezultat na odgovarajuću poziciju izlaza.
  12. Kao i ostale funkcije iz ndimage modula postoji mogućnost definisanja načina automatskog proširenja slike sa parametrom mode.
  13. Alternativno, lokalna varijansa se može odrediti i kao razlika između lokalne srednje vrednosti kvadrata slike i kvadrata lokalne srednje vrednosti:
  14.  
  15. Tačna varijansa šuma na slici nam je vrlo retko poznata, ali možemo da pretpostavimo da ona predstavlja neki deo globalne varijanse, određen parametrom  β  u formi:
  16.  
  17. U okviru zadatka koristiti parametar  β  od 10.
  18. '''
  19. import numpy as np
  20. import math
  21. from scipy import ndimage
  22. import plotly.express as px
  23. from skimage import io
  24. import numpy as np
  25.  
  26. def adaptiveMeanFilt(g, S_shape, beta):
  27.  
  28.   N = np.prod(S_shape)
  29.   z = ndimage.convolve(g.astype('float'), np.ones(S_shape)/N, mode='mirror')
  30.  
  31.   sigma_n2 = g.var()/beta
  32.  
  33.   sigma_S2 = ndimage.generic_filter(g.astype('float'), function=np.var, footprint=np.ones(S_shape), mode='mirror')
  34.  
  35.   alpha = np.minimum(sigma_n2/sigma_S2, 1)
  36.  
  37.   f = g - alpha*(g-z)
  38.   return f, alpha
  39.  
  40. img = io.imread('lena.png')
  41. fig = px.imshow(img, color_continuous_scale='gray')
  42. fig.show()
  43.  
  44. rng = np.random.default_rng()
  45. img_noisy = img + rng.standard_normal(size=img.shape)*np.sqrt(100) + 0
  46.  
  47. fig = px.imshow(img_noisy, color_continuous_scale='gray')
  48. fig.show()
  49.  
  50. beta = 10
  51. S_shape = (3,3)
  52.  
  53. img_filt, alpha = adaptiveMeanFilt(img_noisy, S_shape, beta)
  54.  
  55. fig = px.imshow(img_filt, color_continuous_scale='gray')
  56. fig.show()
  57. fig = px.imshow(alpha, color_continuous_scale='gray')
  58. fig.show()
RAW Paste Data