[Image-SIG] Feature request: Median filter

Josh Levenberg joshjunk@pacbell.net
Thu, 22 Aug 2002 01:23:12 -0700


I've tried several python implementations of a median filter.  So far my 
fastest (included below) is still quite slow (it takes minutes rather 
than seconds).  Is there a way of speeding this up?  Is there going to 
be a median filter included in future versions of PIL?

Thanks!

def MedianOnString(imstr, imsize, kernelsize):
     (width,height) = imsize
     rows=[imstr[row*width:(row+1)*width] for row in range(height)]
     retrows=['']*height
     for x in range(width):
         sys.stdout.write('.')
         mnx = max(x-kernelsize, 0)
         mxx = min(x+kernelsize+1, width)
         window=[]
         for y in range(min(kernelsize+1, height)):
             window.append(rows[y][mnx:mxx])
         for y in range(height):
             if y>kernelsize:
                 # remove first row from window
                 del window[0]
             if y+kernelsize<height:
                 # add last row to window
                 window.append(rows[y+kernelsize][mnx:mxx])
             lst=list(''.join(window))
             lst.sort()
             retrows[y]= retrows[y]+lst[len(lst)/2]
     sys.stdout.write('\n')
     return ''.join(retrows)

def MedianFilter(im, kernelsize):
     imagedata=[MedianOnString(impart.tostring(), im.size, kernelsize) 
for impart in im.split()]
     return Image.merge('RGB', [Image.fromstring('L', im.size, imstring) 
for imstring in imagedata])

-- 
Josh Levenberg