আমি সম্প্রতি টমোগ্রাফিক পুনর্গঠন অ্যালগরিদম নিয়ে ঘুরেছি। আমার কাছে ইতিমধ্যে এফবিপি, এআরটি, একটি সির্ট / সার্ট-এর মতো পুনরাবৃত্তি স্কিম এবং এমনকি সরল রৈখিক বীজগণিত (ধীর!) ব্যবহার করে সুন্দর কার্যকরী বাস্তবায়ন রয়েছে। এই প্রশ্নটি সেই কোনও কৌশল সম্পর্কে নয় ; ফর্মের উত্তর "কেন কেউ সেভাবে এটি করবে, তার পরিবর্তে এখানে কিছু এফবিপি কোড রয়েছে" যা আমি খুঁজছি তা নয়।
এই প্রোগ্রামটির সাথে আমি পরবর্তী কাজটি করতে চাইছিলাম " সেটটি সম্পূর্ণ করুন " এবং তথাকথিত " ফুরিয়ার পুনর্গঠন পদ্ধতি " বাস্তবায়ন করুন । এটি সম্পর্কে আমার বুঝতে মূলত আপনি সাইনোগ্রামের "এক্সপোজারগুলিতে" একটি 1D এফএফটি প্রয়োগ করেন, 2 ডি ফুরিয়ার স্পেসে র্যাডিয়াল "হুইল এর স্পোক" হিসাবে তাদের ব্যবস্থা করুন (এটি কেন্দ্রীয় টুকরো উপপাদ্য থেকে সরাসরি অনুসরণ করার জন্য এটি দরকারী জিনিস) , সেই পয়েন্টগুলি থেকে সেই 2 ডি স্পেসের নিয়মিত গ্রিডে বিভক্ত করুন এবং তারপরে মূল স্ক্যানের লক্ষ্য পুনরুদ্ধারের জন্য ফিউরিয়ার-ট্রান্সফর্মটি সম্ভব হওয়া উচিত।
সহজ শোনায় তবে মূল টার্গেটের মতো দেখতে এমন কোনও পুনর্গঠন করার মতো ভাগ্য আমি পাইনি।
নীচের পাইথন (নম্পী / সায়্পাই / ম্যাটপ্ল্লিটিব) কোডটি আমি যা করতে চাইছি তার সাথে সবচেয়ে সংক্ষিপ্ত প্রকাশটি প্রকাশ করতে পারি। রান করার সময় এটি নিম্নলিখিতটি প্রদর্শন করে:
চিত্র 1: লক্ষ্য
চিত্র 2: লক্ষ্য একটি সিনোগ্রাম
চিত্র 3: এফএফটি-এড সিনোগ্রাম সারি
চিত্র 4: উপরের সারিটি ফুরিয়ার-ডোমেন সিনোগ্রাম সারিগুলি থেকে বিভক্ত 2D এফএফটি স্থান; নীচের সারিটি (তুলনার উদ্দেশ্যে) লক্ষ্যটির সরাসরি 2D এফএফটি। এই জায়গাটি আমি সন্দেহজনক হতে শুরু করি; সিনোগ্রাম এফএফটিগুলি থেকে বিভক্ত প্লটগুলি লক্ষ্যমাত্রায় সরাসরি 2D-FFTing দ্বারা নির্মিত প্লটগুলির সাথে মিল দেখায় ... এবং আরও আলাদা।
চিত্র 5: চিত্র 4 এর বিপরীতমুখী-ফুরিয়ার রূপান্তর আমি আশা করি এটি লক্ষ্য হিসাবে এটি হিসাবে লক্ষ্য হিসাবে এটি আরও কিছুটা স্বীকৃত হবে।
কোন ধারণা আমি কি ভুল করছি? ফুরিয়ার পদ্ধতির পুনর্গঠন সম্পর্কে আমার বুঝতে প্রাথমিকভাবে ত্রুটিযুক্ত কিনা তা নিশ্চিত নয় বা আমার কোডে কিছু বাগ আছে if
import math
import matplotlib
import matplotlib.pyplot as plt
import numpy as np
import scipy.interpolate
import scipy.fftpack
import scipy.ndimage.interpolation
S=256 # Size of target, and resolution of Fourier space
A=359 # Number of sinogram exposures
# Construct a simple test target
target=np.zeros((S,S))
target[S/3:2*S/3,S/3:2*S/3]=0.5
target[120:136,100:116]=1.0
plt.figure()
plt.title("Target")
plt.imshow(target)
# Project the sinogram
sinogram=np.array([
np.sum(
scipy.ndimage.interpolation.rotate(
target,a,order=1,reshape=False,mode='constant',cval=0.0
)
,axis=1
) for a in xrange(A)
])
plt.figure()
plt.title("Sinogram")
plt.imshow(sinogram)
# Fourier transform the rows of the sinogram
sinogram_fft_rows=scipy.fftpack.fftshift(
scipy.fftpack.fft(sinogram),
axes=1
)
plt.figure()
plt.subplot(121)
plt.title("Sinogram rows FFT (real)")
plt.imshow(np.real(np.real(sinogram_fft_rows)),vmin=-50,vmax=50)
plt.subplot(122)
plt.title("Sinogram rows FFT (imag)")
plt.imshow(np.real(np.imag(sinogram_fft_rows)),vmin=-50,vmax=50)
# Coordinates of sinogram FFT-ed rows' samples in 2D FFT space
a=(2.0*math.pi/A)*np.arange(A)
r=np.arange(S)-S/2
r,a=np.meshgrid(r,a)
r=r.flatten()
a=a.flatten()
srcx=(S/2)+r*np.cos(a)
srcy=(S/2)+r*np.sin(a)
# Coordinates of regular grid in 2D FFT space
dstx,dsty=np.meshgrid(np.arange(S),np.arange(S))
dstx=dstx.flatten()
dsty=dsty.flatten()
# Let the central slice theorem work its magic!
# Interpolate the 2D Fourier space grid from the transformed sinogram rows
fft2_real=scipy.interpolate.griddata(
(srcy,srcx),
np.real(sinogram_fft_rows).flatten(),
(dsty,dstx),
method='cubic',
fill_value=0.0
).reshape((S,S))
fft2_imag=scipy.interpolate.griddata(
(srcy,srcx),
np.imag(sinogram_fft_rows).flatten(),
(dsty,dstx),
method='cubic',
fill_value=0.0
).reshape((S,S))
plt.figure()
plt.suptitle("FFT2 space")
plt.subplot(221)
plt.title("Recon (real)")
plt.imshow(fft2_real,vmin=-10,vmax=10)
plt.subplot(222)
plt.title("Recon (imag)")
plt.imshow(fft2_imag,vmin=-10,vmax=10)
# Show 2D FFT of target, just for comparison
expected_fft2=scipy.fftpack.fftshift(scipy.fftpack.fft2(target))
plt.subplot(223)
plt.title("Expected (real)")
plt.imshow(np.real(expected_fft2),vmin=-10,vmax=10)
plt.subplot(224)
plt.title("Expected (imag)")
plt.imshow(np.imag(expected_fft2),vmin=-10,vmax=10)
# Transform from 2D Fourier space back to a reconstruction of the target
fft2=scipy.fftpack.ifftshift(fft2_real+1.0j*fft2_imag)
recon=np.real(scipy.fftpack.ifft2(fft2))
plt.figure()
plt.title("Reconstruction")
plt.imshow(recon,vmin=0.0,vmax=1.0)
plt.show()