Advertisement
nlw

Perona Malik diffusion in Cython

nlw
Apr 2nd, 2011
269
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.36 KB | None | 0 0
  1. # cython: profile=False
  2. # file: nld_aux.pyx
  3.  
  4. from __future__ import division
  5. import numpy as np
  6. import scipy
  7. cimport numpy as np
  8. #DTYPE = np.int
  9. DTYPE = np.float32
  10. ctypedef np.float32_t DTYPE_t
  11.  
  12. cimport cython
  13.  
  14. @cython.boundscheck(False)
  15. @cython.wraparound(False)
  16. def nldiffusion(np.ndarray[DTYPE_t, ndim=3] img not None,
  17.                 np.ndarray[DTYPE_t, ndim=3] gradx not None,
  18.                 np.ndarray[DTYPE_t, ndim=3] grady not None,
  19.                 np.ndarray[DTYPE_t, ndim=2] cgradx not None,
  20.                 np.ndarray[DTYPE_t, ndim=2] cgrady not None,
  21.                 double p1, double p2):
  22.  
  23.     cdef int l,k
  24.  
  25.     for l in range(0,img.shape[0]):
  26.         for k in range(0,img.shape[1]-1):
  27.             gradx[l,k,0] = img[l,k+1,0] - img[l,k,0]
  28.             gradx[l,k,1] = img[l,k+1,1] - img[l,k,1]
  29.             gradx[l,k,2] = img[l,k+1,2] - img[l,k,2]
  30.             cgradx[l,k] = p2*(fabs(gradx[l,k,0])+fabs(gradx[l,k,1])+fabs(gradx[l,k,2]))
  31.             cgradx[l,k] = 1. / (1.+cgradx[l,k]*cgradx[l,k])
  32.             # cgradx[l,k] = p2
  33.  
  34.     for l in range(0,img.shape[0]-1):
  35.         for k in range(0,img.shape[1]):
  36.             grady[l,k,0] = img[l+1,k,0] - img[l,k,0]
  37.             grady[l,k,1] = img[l+1,k,1] - img[l,k,1]
  38.             grady[l,k,2] = img[l+1,k,2] - img[l,k,2]
  39.             cgrady[l,k] = p2*(fabs(grady[l,k,0])+fabs(grady[l,k,1])+fabs(grady[l,k,2]))
  40.             cgrady[l,k] = 1. / (1.+cgrady[l,k]*cgrady[l,k])
  41.             # cgrady[l,k] = p2
  42.  
  43.     for l in range(1,img.shape[0]-1):
  44.         for k in range(1,img.shape[1]-1):
  45.             img[l  ,k  ,0] += p1*(\
  46.                 -cgradx[l  ,k-1]*gradx[l  ,k-1,0] +\
  47.                  cgradx[l  ,k  ]*gradx[l  ,k  ,0] +\
  48.                 -cgrady[l-1,k  ]*grady[l-1,k  ,0] +\
  49.                  cgrady[l  ,k  ]*grady[l  ,k  ,0]     )
  50.             img[l  ,k  ,1] += p1*(\
  51.                 -cgradx[l  ,k-1]*gradx[l  ,k-1,1] +\
  52.                  cgradx[l  ,k  ]*gradx[l  ,k  ,1] +\
  53.                 -cgrady[l-1,k  ]*grady[l-1,k  ,1] +\
  54.                  cgrady[l  ,k  ]*grady[l  ,k  ,1]     )
  55.             img[l  ,k  ,2] += p1*(\
  56.                 -cgradx[l  ,k-1]*gradx[l  ,k-1,2] +\
  57.                  cgradx[l  ,k  ]*gradx[l  ,k  ,2] +\
  58.                 -cgrady[l-1,k  ]*grady[l-1,k  ,2] +\
  59.                  cgrady[l  ,k  ]*grady[l  ,k  ,2]     )
  60.  
  61.  
  62. cdef extern double exp(double)
  63. cdef extern double fabs(double)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement