#!/usr/bin/python<br></br># segment an image using a point and a threshold,<br></br># intended to be used for mri dicom images<br></br># $Id: srg.py,v 1.1 2004/01/30 00:08:13 len Exp $<br></br><br></br>import Image<br></br>import math, sys<br></br><br></br>cb = 0 #not initialized <br></br>cw = 1 #initialized false<br></br>cp = 2 #processing<br></br>cr = 255 #initialized true<br></br>th = 30 #threshold<br></br><br></br><br></br>def comp_pix(x, y):<br></br> return x[1] - y[1]<br></br><br></br>def check_pix_th(im, mask, pix, avg):<br></br> if mask.getpixel(pix) == cb:<br></br> delta = im.getpixel(pix) - avg<br></br> if math.fabs(delta) < th:<br></br> return 1<br></br> return 0<br></br><br></br>def add_pix(im, mask, pix, avg, ssl):<br></br> if mask.getpixel(pix) == cb:<br></br> delta = im.getpixel(pix) - avg<br></br> if math.fabs(delta) < th:<br></br> ssl.append((pix, delta))<br></br> mask.putpixel(pix, cp)<br></br><br></br><br></br>def nei_pix(im, pix):<br></br> l = []<br></br> l.append((pix[0]-1, pix[1]-1))<br></br> l.append((pix[0]-1, pix[1]))<br></br> l.append((pix[0]-1, pix[1]+1))<br></br> l.append((pix[0], pix[1]+1))<br></br> l.append((pix[0]+1, pix[1]+1))<br></br> l.append((pix[0]+1, pix[1]))<br></br> l.append((pix[0]+1, pix[1]-1))<br></br> l.append((pix[0], pix[1]-1))<br></br> return l<br></br><br></br>def check_pix_reg(mask, pix):<br></br> for p in nei_pix(mask, pix):<br></br> if mask.getpixel(p) == cw:<br></br> return 0<br></br> return 1<br></br><br></br>def srg():<br></br><br></br> if len(sys.argv) != 5:<br></br> print "Usage:",sys.argv[0], "imageFile seedx seedy maskImage"<br></br> sys.exit()<br></br> <br></br> imageFile = sys.argv[1]<br></br> try:<br></br> seed = (int(sys.argv[2]),int(sys.argv[3]))<br></br> except ValueError:<br></br> print "Not an Integer value for argument 2 or 3"<br></br> <br></br> try:<br></br> im = Image.open(imageFile) #.convert("RGB")<br></br> except IOError:<br></br> print "Could not open input file"<br></br> sys.exit()<br></br> <br></br> if im.getbands() != ('L',):<br></br> print "Image must be grayscale"<br></br><br></br> #create image mask<br></br> maskImage = sys.argv[4]<br></br> try:<br></br> mask = Image.open(maskImage) <br></br> except:<br></br> mask = Image.new("L",im.size,cb)<br></br><br></br> ssl = []<br></br><br></br> #avg intensity of region pixels<br></br> avg = im.getpixel(seed)<br></br> ssl.append((seed,0))<br></br><br></br> for i in nei_pix(im, seed):<br></br> add_pix(im, mask, i, avg, ssl)<br></br><br></br> mask.putpixel(seed, cr)<br></br><br></br> while len(ssl) != 0:<br></br> ssl.sort(comp_pix)<br></br> c = ssl.pop(0)<br></br> pix = c[0]<br></br> if check_pix_reg(mask, pix):<br></br> mask.putpixel(pix, cr)<br></br> avg = (im.getpixel(pix) - avg)/2<br></br> for p in nei_pix(im, pix):<br></br> add_pix(im, mask, p, avg, ssl)<br></br> else:<br></br> if check_pix_th(im, mask, pix, avg):<br></br> mask.putpixel(pix, cr)<br></br> else:<br></br> mask.putpixel(pix, cw)<br></br> #print pix<br></br><br></br> mask.show()<br></br> mask.save(maskImage,"JPEG")<br></br><br></br><br></br>if __name__ == '__main__':<br></br> srg()<br></br>