'Questions about details of the filter back projection

Lately I've been studying the filter back projection, and I download the code from github.com. I was confused the process of the filter back projection. here is part of his code:

def backproject(sinogram, theta):
    """Backprojection function. 
    inputs:  sinogram - [n x m] numpy array where n is the number of projections and m the number of angles
             theta - vector of length m denoting the angles represented in the sinogram
    output: backprojArray - [n x n] backprojected 2-D numpy array"""

    imageLen = sinogram.shape[0] #sinogram : [n x m] , so imageLen = n(height)
    reconMatrix = np.zeros((imageLen, imageLen)) 
    
    x = np.arange(imageLen)-imageLen/2 
    y = x.copy()
    X, Y = np.meshgrid(x, y) 

    plt.ion() 
    fig2, ax = plt.subplots() 
    im = plt.imshow(reconMatrix, cmap='gray') 

    theta = theta*np.pi/180 
    numAngles = len(theta)

    for n in range(numAngles):
        Xrot = X*np.sin(theta[n])-Y*np.cos(theta[n]) 
        XrotCor = np.round(Xrot+imageLen/2) 
                                            
        XrotCor = XrotCor.astype('int') 
        projMatrix = np.zeros((imageLen, imageLen)) 
        m0, m1 = np.where((XrotCor >= 0) & (XrotCor <= (imageLen-1))) 
                                                                      

        s = sinogram[:,n] 
        projMatrix[m0, m1] = s[XrotCor[m0, m1]] 
        reconMatrix += projMatrix
        im.set_data(Image.fromarray((reconMatrix-np.min(reconMatrix))/np.ptp(reconMatrix)*255)) 
                                                                                                
        ax.set_title('Theta = %.2f degrees' % (theta[n]*180/np.pi))
        fig2.canvas.draw()
        fig2.canvas.flush_events()
         
    plt.close()
    plt.ioff()
    backprojArray = np.flipud(reconMatrix) 
    return backprojArray

For the loop 'for', I was confused for two weeks. Firstly, I really don't know the following code.

    Xrot = X*np.sin(theta[n])-Y*np.cos(theta[n]) 
    XrotCor = np.round(Xrot+imageLen/2) .

I don't know how it works through geometric ways. I have drown the matrix and so on, but I still don't know the priciples. Lastly, for the code, im.set_data(Image.fromarray((reconMatrix-np.min(reconMatrix))/np.ptp(reconMatrix)*255)) , what does it mean, cause I only know the direct back projection. And I really don't know why there's 255



Solution 1:[1]

Xrot = X*np.sin(theta[n])-Y*np.cos(theta[n])
This is the simple back projection algorithmm. I am also learning it so I will try to make it as simple and concise as possible. There are some steps for FBP.

  • Input Sinogram image(Radon Transform) _ Create Filter (Ram filter works best but you can try other High pass filters as well)
  • Forward Fourier Transform(dft function )
  • Apply Filter
  • Inverse Fourier Transform
  • Backprojection (Basically reversing the sinogram technique) Backprojection is simply back projecting the values and add up them to get the original image for each projection. im.set_data(Image.fromarray((reconMatrix-.min(reconMatrix))/np.ptp(reconMatrix)*255))
    I believe this code is normalizing the image nothing else.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Rohit Das