edge()function, which outputs a black and white image of the edges.
A little bit better result can be had with Python's Imaging Library. Here's the basic script to read in the image, calculate the x and y derivatives for the red, blue and green channels, and then set the gray level in the output image to the magnitude of the derivative.
# takes two arguments, input image file, output image file
img = Image.open( sys.argv )
w, h = img.size
outimg = Image.new("L",img.size)
outpix = outimg.load()
inpix = img.load()
x = 2;
y = 2;
for y in xrange(2,h-1):
for x in xrange(2,w-1):
rdx = ( inpix[x+1,y] - inpix[x-1,y] )/2
gdx = ( inpix[x+1,y] - inpix[x-1,y] )/2
bdx = ( inpix[x+1,y] - inpix[x-1,y] )/2
rdy = ( inpix[x,y+1] - inpix[x,y-1] )/2
gdy = ( inpix[x,y+1] - inpix[x,y-1] )/2
bdy = ( inpix[x,y+1] - inpix[x,y-1] )/2
outpix[x,y] = math.sqrt( rdx*rdx + gdx*gdx + bdx*bdx + rdy*rdy + gdy*gdy + bdy*bdy );
The resulting gray image looks a lot better than the black and white version generated with Octave (because we aren't throwing away so much information from the original image).