View.py 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. # -*- coding: utf-8 -*-
  2. """
  3. Created on Tue Sep 18 10:46:39 2018
  4. @author: Giovanni Galizia
  5. file to collect the routines that were in the folder "View" in IDL
  6. """
  7. import numpy as np
  8. import scipy.ndimage as sci
  9. import scipy as sc
  10. def SpaceFilter(frame, filtersize):
  11. '''
  12. ;this funtion filters a picture array in space with any desired kernel
  13. ; used for spacial smoothing of pictures
  14. ; Author Jasdan Joerges 12/95
  15. ; parameters:
  16. ; frame input frame
  17. ; filtersize size of spacial filter
  18. ; p parameterset
  19. ; results: FilteredFrame
  20. '''
  21. def DiagonalKernel(kernel,i,kernelSize):
  22. # i and kernelSize are separate because of the recursive nature
  23. # for a square kernel size 100, call DiagonalKernel(kernel,100,100)
  24. if kernelSize % 2 == 0: #number is even
  25. print('IncreaseCenterByOne not for even numbers')
  26. i = 1 # prevent eternal loops
  27. if i > (kernelSize+1)/2:
  28. print('View/SpaceFilter: working on kernel with i = ',i)
  29. #increase central region by one
  30. i -= 1
  31. kernel[kernelSize-i:i,kernelSize-i:i] += 1
  32. DiagonalKernel(kernel,i,kernelSize)
  33. else: i = 1
  34. return kernel
  35. if filtersize > 0: #triangular filter; in Jasdans version, they were done by hand. Here I use a recursive function
  36. kernelSize = filtersize
  37. #kernel = IDL.fltarr(kernelsize, kernelsize)
  38. kernel = np.ones([kernelSize, kernelSize])
  39. DiagonalKernel(kernel,kernelSize, kernelSize)
  40. frame = sc.signal.convolve(frame, kernel, mode='same')
  41. # if filtersize == 5: ###example for Jasdan's solution
  42. # kernel(*,*) = [1,1,1,1,1, $ ; triangular 5x5
  43. # 1,2,2,2,1, $
  44. # 1,2,3,2,1, $
  45. # 1,2,2,2,1, $
  46. # 1,1,1,1,1]
  47. # END
  48. ## default: all values are 1
  49. #;better than boxcar: triangular window average
  50. else: #negative filter: gaussian. In Jasdans version, it was a filter + convolve
  51. print('View/SpaceFilter: Gaussian filter size ',filtersize)
  52. frame = sci.gaussian_filter(frame, -filtersize, mode='nearest')
  53. # -7: BEGIN
  54. # kernel(*,*) = [-0.00580155,-0.00580155, -0.00580155, -0.00580155, -0.00580155, -0.00580155, -0.00580155, $ ; triangular 7x7
  55. # -0.00580155,-5.12869e-09,-5.12869e-09,-5.12869e-09,-5.12869e-09,-5.12869e-09,-0.00580155, $
  56. # -0.00580155,-5.12869e-09, 0.253284 , 0.253284 , 0.253284 ,-5.12869e-09,-0.00580155, $
  57. # -0.00580155,-5.12869e-09, 0.253284, 0.500000, 0.253284, -5.12869e-09,-0.00580155, $
  58. # -0.00580155,-5.12869e-09, 0.253284 , 0.253284 , 0.253284 ,-5.12869e-09,-0.00580155, $
  59. # -0.00580155,-5.12869e-09,-5.12869e-09,-5.12869e-09,-5.12869e-09,-5.12869e-09,-0.00580155, $
  60. # -0.00580155,-0.00580155, -0.00580155, -0.00580155, -0.00580155, -0.00580155, -0.00580155]
  61. # END
  62. #FilteredFrame = convol(Frame, kernel, /edge_truncate) / total(kernel)
  63. #;FilteredFrame = median(frame,filtersize)
  64. #return, FilteredFrame
  65. #end ; of program
  66. return frame