Example #1
0
def returnCenterline(fname = None, nurbs = 0, div = 0):


	if fname == None:
		fname = 't250_half_sup_straight_seg.nii.gz'
	

	file = nibabel.load(fname)
	data = file.get_data()
	hdr_seg = file.get_header()


	nx, ny, nz = spline_app.getDim(fname)
	x = [0 for iz in range(0, nz, 1)]
	y = [0 for iz in range(0, nz, 1)]
	z = [iz for iz in range(0, nz, 1)]
	for iz in range(0, nz, 1):
	        x[iz], y[iz] = ndimage.measurements.center_of_mass(numpy.array(data[:,:,iz]))
	points = [[x[n],y[n],z[n]] for n in range(len(x))]
	
	p1, p2, p3 = spline_app.getPxDimensions(fname)
	size = spline_app.getSize(x, y, z, p1, p2, p3)

	data = data*0
	
	if nurbs:
		print 'div = ',div,' size = ', round(size)
		nurbs = NURBS(int(round(size)), int(div), 3, 3000, points)
		P = nurbs.getCourbe3D()
		if P==1:
			print "ERROR: instability in NURBS computation, div will be incremented. "
			return 1
		x_centerline_fit=P[0]
		y_centerline_fit=P[1]
		z_centerline_fit=P[2]
		for i in range(len(z_centerline_fit)) :
			data[int(round(x_centerline_fit[i])),int(round(y_centerline_fit[i])),int(z_centerline_fit[i])] = 1
	else:
		for i in range(len(z)) : 
			data[int(round(x[i])),int(round(y[i])),int(z[i])] = 1 


	path, file_name, ext_fname = sct_utils.extract_fname(fname)
	img = nibabel.Nifti1Image(data, None, hdr_seg)
	
	#return img

	saveFile(file_name, img, div)
	return size
Example #2
0
def check_nurbs(div, size=0, points=0, centerline=''):
    if centerline == '':
        print 'div = ', div, ' size = ', round(size)
        nurbs = NURBS(int(round(size)), int(div), 3, 3000, points)
        P = nurbs.getCourbe3D()
        if P == 1:
            print "ERROR: instability in NURBS computation, div will be incremented. "
            return 1

    else:
        file = nibabel.load(centerline)
        data = file.get_data()
        hdr_seg = file.get_header()
        nx, ny, nz = spline_app.getDim(centerline)

        x = [0 for iz in range(0, nz, 1)]
        y = [0 for iz in range(0, nz, 1)]
        z = [iz for iz in range(0, nz, 1)]
        for iz in range(0, nz, 1):
            x[iz], y[iz] = ndimage.measurements.center_of_mass(
                numpy.array(data[:, :, iz]))
        points = [[x[n], y[n], z[n]] for n in range(len(x))]

        p1, p2, p3 = spline_app.getPxDimensions(centerline)
        size = spline_app.getSize(x, y, z, p1, p2, p3)

        print 'div = ', div, ' size = ', round(size)

        #nurbs = NURBS(int(round(size)), int(div), 3, 3000, points)      --> this work with sct_nurbs_v1
        try:
            nurbs = NURBS(3, 3000, points, False, None, int(round(size)),
                          int(div))
            P = nurbs.getCourbe3D()
        except UnboundLocalError:
            print "ERROR: instability in NURBS computation, UnboundLocalError caught, div will be incremented. "
            return 1
        except ZeroDivisionError:
            print "ERROR: instability in NURBS computation, ZeroDivisionError caught, div will be incremented. "
            return 1

        if P == 1:
            print "ERROR: instability in NURBS computation, div will be incremented. "
            return 1
        else:
            return round(size)
Example #3
0
def returnCenterline(fname=None, nurbs=0, div=0):

    if fname == None:
        fname = 't250_half_sup_straight_seg.nii.gz'

    file = nibabel.load(fname)
    data = file.get_data()
    hdr_seg = file.get_header()

    nx, ny, nz = spline_app.getDim(fname)
    x = [0 for iz in range(0, nz, 1)]
    y = [0 for iz in range(0, nz, 1)]
    z = [iz for iz in range(0, nz, 1)]
    for iz in range(0, nz, 1):
        x[iz], y[iz] = ndimage.measurements.center_of_mass(
            numpy.array(data[:, :, iz]))
    points = [[x[n], y[n], z[n]] for n in range(len(x))]

    p1, p2, p3 = spline_app.getPxDimensions(fname)
    size = spline_app.getSize(x, y, z, p1, p2, p3)

    data = data * 0

    if nurbs:
        if check_nurbs(div, size, points) != 0:
            x_centerline_fit = P[0]
            y_centerline_fit = P[1]
            z_centerline_fit = P[2]
            for i in range(len(z_centerline_fit)):
                data[int(round(x_centerline_fit[i])),
                     int(round(y_centerline_fit[i])),
                     int(z_centerline_fit[i])] = 1
        else:
            return 1
    else:
        for i in range(len(z)):
            data[int(round(x[i])), int(round(y[i])), int(z[i])] = 1

    path, file_name, ext_fname = sct_utils.extract_fname(fname)
    img = nibabel.Nifti1Image(data, None, hdr_seg)

    #return img

    saveFile(file_name, img, div)
    return size
def returnCenterline(fname = None, nurbs = 0, div = 0):


    if fname == None:
        fname = 't250_half_sup_straight_seg.nii.gz'


    file = nibabel.load(fname)
    data = file.get_data()
    hdr_seg = file.get_header()


    nx, ny, nz = spline_app.getDim(fname)
    x = [0 for iz in range(0, nz, 1)]
    y = [0 for iz in range(0, nz, 1)]
    z = [iz for iz in range(0, nz, 1)]
    for iz in range(0, nz, 1):
            x[iz], y[iz] = ndimage.measurements.center_of_mass(numpy.array(data[:,:,iz]))
    points = [[x[n],y[n],z[n]] for n in range(len(x))]

    p1, p2, p3 = spline_app.getPxDimensions(fname)
    size = spline_app.getSize(x, y, z, p1, p2, p3)

    data = data*0

    if nurbs:
        if check_nurbs(div, size, points) != 0:
            x_centerline_fit=P[0]
            y_centerline_fit=P[1]
            z_centerline_fit=P[2]
            for i in range(len(z_centerline_fit)) :
                data[int(round(x_centerline_fit[i])),int(round(y_centerline_fit[i])),int(z_centerline_fit[i])] = 1
        else: return 1
    else:
        for i in range(len(z)) :
            data[int(round(x[i])),int(round(y[i])),int(z[i])] = 1


    path, file_name, ext_fname = sct_utils.extract_fname(fname)
    img = nibabel.Nifti1Image(data, None, hdr_seg)

    #return img

    saveFile(file_name, img, div)
    return size
def check_nurbs(div, size = 0, points = 0, centerline = ''):
    if centerline == '':
        print 'div = ',div,' size = ', round(size)
        nurbs = NURBS(int(round(size)), int(div), 3, 3000, points)
        P = nurbs.getCourbe3D()
        if P==1:
            print "ERROR: instability in NURBS computation, div will be incremented. "
            return 1

    else:
        file = nibabel.load(centerline)
        data = file.get_data()
        hdr_seg = file.get_header()
        nx, ny, nz = spline_app.getDim(centerline)

        x = [0 for iz in range(0, nz, 1)]
        y = [0 for iz in range(0, nz, 1)]
        z = [iz for iz in range(0, nz, 1)]
        for iz in range(0, nz, 1):
                x[iz], y[iz] = ndimage.measurements.center_of_mass(numpy.array(data[:,:,iz]))
        points = [[x[n],y[n],z[n]] for n in range(len(x))]

        p1, p2, p3 = spline_app.getPxDimensions(centerline)
        size = spline_app.getSize(x, y, z, p1, p2, p3)

        print 'div = ',div,' size = ', round(size)

        #nurbs = NURBS(int(round(size)), int(div), 3, 3000, points)      --> this work with sct_nurbs_v1
        try:
            nurbs = NURBS(3, 3000, points, False, None, int(round(size)), int(div))
            P = nurbs.getCourbe3D()
        except UnboundLocalError:
            print "ERROR: instability in NURBS computation, UnboundLocalError caught, div will be incremented. "
            return 1
        except ZeroDivisionError:
            print "ERROR: instability in NURBS computation, ZeroDivisionError caught, div will be incremented. "
            return 1

        if P==1:
            print "ERROR: instability in NURBS computation, div will be incremented. "
            return 1
        else: return round(size)
def returnSquaredErrors(fname=None, div=None, size=None):
    if fname == None:
        #fname = 'centerlines/t250_half_sup_straight_seg_centerline.nii.gz'
        fname = 't234_crop_200_500_straight_centerline.nii.gz'
    file = nibabel.load(fname)
    data = file.get_data()
    p1, p2, p3 = splinap.getPxDimensions(fname)
    nx, ny, nz = splinap.getDim(fname)
    #os.remove(fname)



    print 'sizes: ', nx, ny, nx
    #x, y, x_fit, y_fit = fit(data, nz)

    '''
    print x, y, z
    fig1 = plt.figure()
    ax = Axes3D(fig1)
    ax.plot(x,y,z,'b:',zdir='z')
    plt.show()
    '''

    X,Y,Z = (data>0).nonzero()

    zmin = min(Z) + 10
    zmax = max(Z) - 10

    print "min value element : ", zmin
    print "max value element : ", zmax

    nz = zmax - zmin

    x = [0 for iz in range(0, nz, 1)]
    y = [0 for iz in range(0, nz, 1)]
    z = [iz for iz in range(0, nz, 1)]


    for iz in range(0, nz, 1):
        x[iz], y[iz] = ndimage.measurements.center_of_mass(np.array(data[:,:,iz + zmin]))


    x_fit,y_fit = get_good_centerline(nx, ny, nz)


    msx = mean_squared_error(x, x_fit)
    msy = mean_squared_error(y, y_fit)
    mean_ms = (msx+msy)/2

    #print x, x_fit
    #print y, y_fit

    fig1 = plt.figure()
    ax = Axes3D(fig1)
    ax.plot(x,y,z,zdir='z')
    ax.plot(x_fit,y_fit,z,zdir='z')
    plt.show()


    print msx, msy, mean_ms
    size_crop = splinap.getSize(x, y, z, p1, p2, p3)


    txt = open('results.txt', 'a')
    txt.write(str(div)+' '+str(int(round(size))/div)+' '+str(size_crop)+' '+str(size)+' '+str(msx)+' '+str(msy)+' '+' '+str(mean_ms)+' '+fname+'\n')
    #txt.write(' plynomial_fitting '+str(size_crop)+' '+str(size)+' '+str(msx)+' '+str(msy)+' '+' '+str(mean_ms)+' '+fname+'\n')


    txt.close()