`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

import sys

import math

import Image

img = Image.open( sys.argv[1] )

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][0] - inpix[x-1,y][0] )/2

gdx = ( inpix[x+1,y][1] - inpix[x-1,y][1] )/2

bdx = ( inpix[x+1,y][2] - inpix[x-1,y][2] )/2

rdy = ( inpix[x,y+1][0] - inpix[x,y-1][0] )/2

gdy = ( inpix[x,y+1][1] - inpix[x,y-1][1] )/2

bdy = ( inpix[x,y+1][2] - inpix[x,y-1][2] )/2

outpix[x,y] = math.sqrt( rdx*rdx + gdx*gdx + bdx*bdx + rdy*rdy + gdy*gdy + bdy*bdy );

outimg.save(sys.argv[2],"JPEG")

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).

## No comments:

## Post a Comment