[SciPy-user] Some more useful image filters: anisotropic diffusion and Canny edge-finding

Zachary Pincus zachary.pincus@yale....
Fri Feb 27 15:51:38 CST 2009


Err... I missed a variable name-change in a few places! The canny  
function should be:


def canny(image, high_threshold, low_threshold):
   grad_x = ndimage.sobel(image, 0)
   grad_y = ndimage.sobel(image, 1)
   grad_mag = numpy.sqrt(grad_x**2+grad_y**2)
   grad_angle = numpy.arctan2(grad_y, grad_x)
   # next, scale the angles in the range [0, 3] and then round to  
quantize
   quantized_angle = numpy.around(3 * (grad_angle + numpy.pi) /  
(numpy.pi * 2))
   # Non-maximal suppression: an edge pixel is only good if its  
magnitude is
   # greater than its neighbors normal to the edge direction. We  
quantize
   # edge direction into four angles, so we only need to look at four
   # sets of neighbors
   NE = ndimage.maximum_filter(grad_mag, footprint=_NE)
   W  = ndimage.maximum_filter(grad_mag, footprint=_W)
   NW = ndimage.maximum_filter(grad_mag, footprint=_NW)
   N  = ndimage.maximum_filter(grad_mag, footprint=_N)
   thinned = (((grad_mag > W)  & (quantized_angle == _N_d )) |
              ((grad_mag > N)  & (quantized_angle == _W_d )) |
              ((grad_mag > NW) & (quantized_angle == _NE_d)) |
              ((grad_mag > NE) & (quantized_angle == _NW_d)) )
   thinned_grad = thinned * grad_mag
   # Now, hysteresis thresholding: find seeds above a high threshold,  
then
   # expand out until we go below the low threshold
   high = thinned_grad > high_threshold
   low = thinned_grad > low_threshold
   canny_edges = ndimage.binary_dilation(high, iterations=-1, mask=low)
   return grad_mag, thinned_grad, canny_edges


More information about the SciPy-user mailing list