Example #1
0
def toFinite(fareyVector, N):
    '''
    Return the finite vector corresponding to the Farey vector provided for a given modulus/length N
    and the multiplicative inverse of the relevant Farey angle
    Wraps function from Farey module
    '''
    return farey.toFinite(fareyVector, N)
Example #2
0
def toDRT(projections, angles, N, P, Q, center=False):
    '''
    Convert the Mojette (asymetric) projection data to DRT (symetric) projections.
    Use the iFRT to reconstruct the image. Requires N+1 or N+N/2 projections if N is prime or dyadic respectively.
    Returns the resulting DRT space as a 2D array
    '''
    size = int(N + N/2)
    dyadic = True
    if N % 2 == 1: # if odd, assume prime
        size = int(N+1)
        dyadic = False
        
    m = 0
    
    frtSpace = np.zeros( (size,N) )
    
    if dyadic:
        print("Dyadic size not tested yet.")
        #for each project
        '''for index, proj in enumerate(projections):
            p, q = farey.get_pq(angles[index])
            
            m, inv = farey.toFinite(angles[index], N)

            frtSpace[m][:] = finiteProjection(proj, angles[index], P, Q, N, center)'''
        
    else: #prime size
        for index, proj in enumerate(projections):
            p, q = farey.get_pq(angles[index])
            
            m, inv = farey.toFinite(angles[index], N)

            frtSpace[m][:] = finiteProjection(proj, angles[index], P, Q, N, center)
    
    return frtSpace
Example #3
0
def finiteProjection(projection, angle, P, Q, N, center=False):
    '''
    Convert a Mojette projection taken at angle into a finite (FRT) projection.
    '''
    dyadic = True
    if N % 2 == 1:  # if odd, assume prime
        dyadic = False
    shiftQ = int(N / 2.0 + 0.5) - int(Q / 2.0 + 0.5)
    shiftP = int(N / 2.0 + 0.5) - int(P / 2.0 + 0.5)

    finiteProj = np.zeros(N)
    p, q = farey.get_pq(angle)
    m, inv = farey.toFinite(angle, N)
    #    print "p:", p, "q:", q, "m:", m, "inv:", inv
    translateOffset, perp = farey.finiteTranslateOffset(angle, N, P, Q)
    angleSign = p * q

    if dyadic:
        for translate, bin in enumerate(projection):
            if angleSign >= 0 and perp:  #Reverse for perp
                translateMojette = translateOffset - translate
            else:
                translateMojette = translate - translateOffset
            translateFinite = (inv * translateMojette) % N
            if center:
                translateFinite = (translateFinite + shiftQ + m *
                                   (N - shiftP)) % N
            finiteProj[translateFinite] += bin
    else:
        for translate, bin in enumerate(projection):
            if angleSign >= 0 and perp:  #Reverse for perp
                translateMojette = int(translateOffset) - int(translate)
            else:
                translateMojette = int(translate) - int(translateOffset)

            if translateMojette < 0:
                translateFinite = (N - (inv * abs(translateMojette)) % N) % N
            else:
                translateFinite = (inv * translateMojette
                                   ) % N  #has issues in C, may need checking
            if center:
                translateFinite = (translateFinite + shiftQ + m *
                                   (N - shiftP)) % N
            finiteProj[translateFinite] += bin

    return finiteProj
Example #4
0
def angleSetSliceCoordinates(angles, P, Q, N, center=False):
    '''
    Compute the 2D coordinates of each translate (in NxN DFT space) of every projection having angle in angles.
    Returns a list of u, v coordinate arrays [[u_0[...],v_0[...]], [u_1[...],v_1[...]], ...] per angle
    '''
    coords = []
    translateOffset = 0
    translateMojette = 0
    translateFinite = 0
    m = 0

    offset = 0.0
    if center:
        offset = N / 2.0

    for index, angle in enumerate(angles):
        u = []
        v = []
        coordinateList = []
        p = int(angle.imag)
        q = int(angle.real)
        angleSign = p * q

        m, inv = farey.toFinite(angle, N)
        translateOffset, perp = farey.finiteTranslateOffset(angle, N)
        B = projectionLength(angle, P, Q)

        for translate in range(0, B):
            if angleSign >= 0 and perp:  #Reverse for perp
                translateMojette = translateOffset - translate
            else:
                translateMojette = translate - translateOffset

            translateFinite = (inv * translateMojette
                               ) % N  #has issues in C, may need checking
            #            frtSpace[m][translateFinite] += bin
            u.append((translateFinite + offset) % N)
            v.append((m * translateFinite + offset) % N)

        coordinateList.append(u)
        coordinateList.append(v)
        coords.append(coordinateList)

    return coords
Example #5
0
def computeLines(kSpace, angles, centered=True, twoQuads=False):
    '''
    compute finite lines coordinates
    Returns a list or list of slice 2-tuples and corresponding list of m values
    '''
    p, s = kSpace.shape
    lines = []
    mValues = []
    for angle in angles:
        m, inv = farey.toFinite(angle, p)
        u, v = radon.getSliceCoordinates2(m, kSpace, centered, p)
        lines.append((u, v))
        mValues.append(m)
        #second quadrant
        if twoQuads:
            if m != 0 and m != p:  #dont repeat these
                m = p - m
                u, v = radon.getSliceCoordinates2(m, kSpace, centered, p)
                lines.append((u, v))
                mValues.append(m)

    return lines, mValues
Example #6
0
def createFractal4(reduction, N, proportion):
    #parameters
    M = 2*N
    twoQuads = True
    angles, lengths = mojette.angleSet_Symmetric(N,N,1,True,50)
    perpAngle = farey.farey(1,0)
    angles.append(perpAngle)
    powerSpect = np.zeros((M,M))

    #compute lines
    centered = True
    mLines = []
    sLines = []
    mValues = []
    sValues = []
    pValues = []
    qValues = []
    for angle in angles:
        m, s, p, q, inv = farey.toFinite(angle, M)
        pValues.append(p)
        qValues.append(q)
        if m not in mValues and m < M:
            u, v = radon.getSliceCoordinates2(m, powerSpect, centered, M)
            mLines.append((u,v))
            mValues.append(m)
        
        #second quadrant
        if twoQuads:
            if m != 0 and m != M: #dont repeat these
                m = M-m
                if m not in mValues and m < M:
                    u, v = radon.getSliceCoordinates2(m, powerSpect, centered, M)
                    mLines.append((u,v))
                    mValues.append(m)
                    i = (len(mValues)+len(sValues))/float(M)
                    if i >= 1:
                        break

    ss = []
    ss.append(M)
    ss.extend(range(0, N/2))

    maxLines = len(ss)
    for i,s in enumerate(ss):
        u, v = radon.getSliceCoordinates2(s, powerSpect, centered, M)
        sLines.append((u,v))
        sValues.append(s)
        i = (len(mValues)+len(sValues))/float(M)
        if i >= 1.5:
            break

    length = 0

    fig, ax = plt.subplots(nrows=1, ncols=2, figsize=(16, 8))

    plt.gray()
    plt.tight_layout()

    maxLines = len(sLines+mLines)
    i = 0
    ax[0].imshow(powerSpect)
    ax[1].imshow(powerSpect)
    color=iter(cm.jet(np.linspace(0,1,maxLines+1)))
    fareyImage = np.zeros_like(powerSpect)
    fareyImage1 = np.zeros_like(powerSpect)
    for i, sLine in enumerate(sLines):
        u, v = sLine
        ax[1].plot(u, v, '.w',markersize=1)
        fareyImage[u,v] = 1
        length = length + 1
        i = np.count_nonzero(fareyImage)/float((M*M))
        if i >= reduction*proportion:
            break

    maxLines = len(mLines)
    for i, mLine in enumerate(mLines):
        u, v = mLine
        ax[0].plot(u, v, '.r', markersize=1)
        ax[1].plot(u, v, '.r',markersize=1)
        fareyImage[u,v] = 1
        fareyImage1[u,v] = 1
        length = length + 1
        i = np.count_nonzero(fareyImage)/float((M*M))
        if i >= reduction:
            break

    print("Proportion of M:", (length/float(M)))

    print("Non-zero elements with holes: ", np.count_nonzero(fareyImage1)/float((M*M)) * 100)
    print("Non-zero elements without holes: ", np.count_nonzero(fareyImage)/float((M*M)) * 100)

    print("Absolute difference percentage extra filled in is ", (np.count_nonzero(fareyImage)- np.count_nonzero(fareyImage1))/float((M*M)) *100)

    withHoles = np.count_nonzero(fareyImage1)/float((M*M)) * 100
    withoutHoles = np.count_nonzero(fareyImage)/float((M*M)) * 100

    percentage = (withoutHoles - withHoles)/float(withHoles) * 100

    print("Percentage difference percentage extra filled in is ", percentage)
            
    ax[0].set_title('Sampling (colour per line) for dyadic size:'+str(M))
    ax[1].set_title('Sampling (same colour per line) for dyadic size:'+str(M))
    imageio.imsave("farey_image_"+str(M)+"_"+".png", fareyImage)
    plt.show()

    lines = mLines + sLines

    return fareyImage, lines
Example #7
0
powerSpect = np.zeros((M,M))

#np.set_printoptions(threshold=np.nan)

#compute lines
print("Computing Finite lines...")
centered = True
lines = []
mValues = []
pValues = []
qValues = []
z=25
for angle in angles:
    #m, inv = farey.toFinite(angle, p)
    #u, v = radon.getSliceCoordinates2(m, powerSpect, centered, p)
    m, p, q, inv = farey.toFinite(angle, M)
    u, v = radon.getSliceCoordinates2(m, powerSpect, centered, M)
    lines.append((u,v))
    mValues.append(m)
    pValues.append(p)
    qValues.append(q)
    
    #second quadrant
    if twoQuads:
        #if m != 0 and m != p: #dont repeat these
        if m != 0 and m != M: #dont repeat these
            #m = p-m
            #u, v = radon.getSliceCoordinates2(m, powerSpect, centered, p)
            m = M-m
            z = M-2*z
            u, v = radon.getSliceCoordinates2(m, powerSpect, centered, M)
angles.append(perpAngle)
print("Number of Angles:", len(angles))
print("angles:", angles)

powerSpect = np.zeros((p, p))

#compute lines
print("Computing Finite lines...")
centered = True
lines = []
mValues = []
pValues = []
qValues = []

for angle in angles:
    m, p1, q, inv = farey.toFinite(angle, p)
    u, v = radon.getSliceCoordinates2(m, powerSpect, centered, p)
    lines.append((u, v))
    mValues.append(m)
    pValues.append(p1)
    qValues.append(q)
    #second quadrant
    if twoQuads:
        if m != 0 and m != p:  #dont repeat these
            m = p - m
            u, v = radon.getSliceCoordinates2(m, powerSpect, centered, p)
            lines.append((u, v))
            mValues.append(m)
mu = len(lines)
print("Number of lines:", len(lines))
print("Proportion of p:", len(lines) / float(p))
#angles = mojette.angleSet_Finite(pDash, 2)
angles, lengths = mojette.angleSet_Symmetric(N, N, 1, True, K)
perpAngle = farey.farey(1, 0)
angles.append(perpAngle)
print("Number of Angles:", len(angles))
print("angles:", angles)

powerSpect = np.zeros((p, p))

#compute lines
print("Computing Finite lines...")
centered = True
lines = []
mValues = []
for angle in angles:
    m, inv = farey.toFinite(angle, p)
    u, v = radon.getSliceCoordinates2(m, powerSpect, centered, p)
    lines.append((u, v))
    mValues.append(m)
    #second quadrant
    if twoQuads:
        if m != 0 and m != p:  #dont repeat these
            m = p - m
            u, v = radon.getSliceCoordinates2(m, powerSpect, centered, p)
            lines.append((u, v))
            mValues.append(m)
mu = len(lines)
print("Number of lines:", len(lines))
print("Proportion of p:", len(lines) / float(p))
print("Proportion of 2D space:", 2.0 - len(lines) / float(p))
print(mValues)
'''
Test for the pure independent modules for number theory
'''
import _libpath  #add custom libs
import finitetransform.numbertheory as nt
import finitetransform.farey as farey

x = 5
m = 641

##########
# test the multiplicative inverse mod m
inv = nt.minverse(x, m)
print inv

identity = (inv * x) % m
print identity

##########
# test the Farey finite vector function
vector = farey.farey(1, 2)
m = farey.toFinite(vector, m)
print vector, "->", m