#!/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>