ফুরিয়ার পদ্ধতিতে টমোগ্রাফিক পুনর্গঠনের জন্য এই কোডটিতে কী সমস্যা আছে?


19

আমি সম্প্রতি টমোগ্রাফিক পুনর্গঠন অ্যালগরিদম নিয়ে ঘুরেছি। আমার কাছে ইতিমধ্যে এফবিপি, এআরটি, একটি সির্ট / সার্ট-এর মতো পুনরাবৃত্তি স্কিম এবং এমনকি সরল রৈখিক বীজগণিত (ধীর!) ব্যবহার করে সুন্দর কার্যকরী বাস্তবায়ন রয়েছে। এই প্রশ্নটি সেই কোনও কৌশল সম্পর্কে নয় ; ফর্মের উত্তর "কেন কেউ সেভাবে এটি করবে, তার পরিবর্তে এখানে কিছু এফবিপি কোড রয়েছে" যা আমি খুঁজছি তা নয়।

এই প্রোগ্রামটির সাথে আমি পরবর্তী কাজটি করতে চাইছিলাম " সেটটি সম্পূর্ণ করুন " এবং তথাকথিত " ফুরিয়ার পুনর্গঠন পদ্ধতি " বাস্তবায়ন করুন । এটি সম্পর্কে আমার বুঝতে মূলত আপনি সাইনোগ্রামের "এক্সপোজারগুলিতে" একটি 1D এফএফটি প্রয়োগ করেন, 2 ডি ফুরিয়ার স্পেসে র‌্যাডিয়াল "হুইল এর স্পোক" হিসাবে তাদের ব্যবস্থা করুন (এটি কেন্দ্রীয় টুকরো উপপাদ্য থেকে সরাসরি অনুসরণ করার জন্য এটি দরকারী জিনিস) , সেই পয়েন্টগুলি থেকে সেই 2 ডি স্পেসের নিয়মিত গ্রিডে বিভক্ত করুন এবং তারপরে মূল স্ক্যানের লক্ষ্য পুনরুদ্ধারের জন্য ফিউরিয়ার-ট্রান্সফর্মটি সম্ভব হওয়া উচিত।

সহজ শোনায় তবে মূল টার্গেটের মতো দেখতে এমন কোনও পুনর্গঠন করার মতো ভাগ্য আমি পাইনি।

নীচের পাইথন (নম্পী / সায়্পাই / ম্যাটপ্ল্লিটিব) কোডটি আমি যা করতে চাইছি তার সাথে সবচেয়ে সংক্ষিপ্ত প্রকাশটি প্রকাশ করতে পারি। রান করার সময় এটি নিম্নলিখিতটি প্রদর্শন করে:

চিত্র 1: লক্ষ্য আকার 1

চিত্র 2: লক্ষ্য একটি সিনোগ্রাম fig2

চিত্র 3: এফএফটি-এড সিনোগ্রাম সারি fig3

চিত্র 4: উপরের সারিটি ফুরিয়ার-ডোমেন সিনোগ্রাম সারিগুলি থেকে বিভক্ত 2D এফএফটি স্থান; নীচের সারিটি (তুলনার উদ্দেশ্যে) লক্ষ্যটির সরাসরি 2D এফএফটি। এই জায়গাটি আমি সন্দেহজনক হতে শুরু করি; সিনোগ্রাম এফএফটিগুলি থেকে বিভক্ত প্লটগুলি লক্ষ্যমাত্রায় সরাসরি 2D-FFTing দ্বারা নির্মিত প্লটগুলির সাথে মিল দেখায় ... এবং আরও আলাদা। fig4

চিত্র 5: চিত্র 4 এর বিপরীতমুখী-ফুরিয়ার রূপান্তর আমি আশা করি এটি লক্ষ্য হিসাবে এটি হিসাবে লক্ষ্য হিসাবে এটি আরও কিছুটা স্বীকৃত হবে। fig5

কোন ধারণা আমি কি ভুল করছি? ফুরিয়ার পদ্ধতির পুনর্গঠন সম্পর্কে আমার বুঝতে প্রাথমিকভাবে ত্রুটিযুক্ত কিনা তা নিশ্চিত নয় বা আমার কোডে কিছু বাগ আছে 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()


... কারণ এখানে তার জন্য কোড রয়েছে যে স্টাফটি কেন্দ্রে থাকা উচিত প্রান্তে এবং স্টাফগুলি যে প্রান্তে থাকা উচিত সেটি কেন্দ্রে থাকে, যেখানে 90 ডিগ্রি ফেজ শিফট কোথাও হওয়া উচিত নয়?
এন্ডোলিথ

1
আপনার লিঙ্ক করা কোডটি ফিল্টারড ব্যাক প্রক্ষেপণ (এফবিপি) পদ্ধতির জন্য। যা একই কেন্দ্রীয়-স্লাইস গণিতের উপর ভিত্তি করে তৈরি হয়, তবে 2D ফুরিয়ার ডোমেন চিত্রটি স্পষ্টভাবে কখনও গড়ে তোলার চেষ্টা করে না। মাঝখানে কেন্দ্রীয় ফালি "স্পোক" এর উচ্চ ঘনত্বের ক্ষতিপূরণ হিসাবে আপনি কম ফ্রিকোয়েন্সিগুলির এফবিপি ফিল্টারটির দমন দেখতে পারেন। ফুুরিয়ার পুনর্গঠন পদ্ধতিতে আমি প্রয়োগের চেষ্টা করছি, এটি কেবল বিভক্ত হওয়ার জন্য পয়েন্টগুলির একটি উচ্চ ঘনত্ব হিসাবে উদ্ভাসিত। আমি নির্দ্বিধায় স্বীকার করছি যে আমি একটি সামান্য ব্যবহৃত কৌশল প্রয়োগ করার চেষ্টা করছি এবং সাহিত্যে এটির সীমিত কভারেজ রয়েছে
টাইমডে

উফ, হ্যাঁ আপনি ঠিক বলেছেন। সি এর একটি সংস্করণ এখানে । আমি এটি কিছুটা দেখেছি এবং কিছু জিনিস পোস্ট করেছি। আমি আরও পরে দেখতে হবে।
এন্ডোলিথ

উত্তর:


15

ঠিক আছে আমি অবশেষে এটি ক্র্যাক করেছি।

কৌতুক মূলত কিছু নির্বাণ নেমে এসেছে fftshift/ ifftshiftসঠিক স্থানে গুলি তাই 2D ফুরিয়ার স্থান উপস্থাপনা দুর্দান্তভাবে দোদুল্যমান এবং দণ্ডপ্রাপ্ত সঠিকভাবে ঢুকান করা অসম্ভব ছিল না। কমপক্ষে এটিই আমি স্থির করেছি বলে মনে করি। ফুরিয়ার তত্ত্ব সম্পর্কে আমার যে সীমাবদ্ধ বোঝাপড়া রয়েছে তার বেশিরভাগই অবিচ্ছিন্ন অবিচ্ছেদ্য গঠনের উপর ভিত্তি করে এবং আমি সর্বদা বিচ্ছিন্ন ডোমেন এবং এফএফটিগুলি কিছুটা ... উদ্দীপনা খুঁজে পাই।

আমি মাতলাব কোডটি বরং ক্রিপ্টিক খুঁজে পেয়েছি, যদিও এই পুনর্নির্মাণের অ্যালগরিদমকে এই পরিবেশে এইভাবে পুনর্নির্মাণের অ্যালগরিদমটি যুক্তিসঙ্গতভাবে প্রকাশ করা যেতে পারে তার জন্য আমাকে এই বাস্তবায়নটি ক্রেডিট করতে হবে।

প্রথমে আমি ফলাফলগুলি দেখাব, তারপরে কোড:

চিত্র 1: একটি নতুন, আরও জটিল লক্ষ্য। আকার 1

চিত্র 2: লক্ষ্যটির সিনোগ্রাম (ঠিক আছে ঠিক আছে, এটি রেডনের রূপান্তর)। Fig2

চিত্র 3: সিনোগ্রামের এফএফটি-এড সারি (কেন্দ্রের ডিসি দিয়ে প্লট করা হয়েছে)। Fig3

চিত্র 4: এফএফটি-এড সিনোগ্রাম 2D এফএফটি স্থান (কেন্দ্রে ডিসি) তে রূপান্তরিত হয়েছে। রঙ নিখুঁত মান একটি ফাংশন। Fig4

চিত্র 4 এ: সাইনোগ্রামের ডেটাগুলির রেডিয়াল প্রকৃতি আরও ভালভাবে দেখানোর জন্য 2 ডি এফএফটি স্থানের কেন্দ্রে জুম বাড়ান। Fig4a

চিত্র 5: শীর্ষ সারিতে: 2D এফএফটি স্থানটি মূলভাবে সাজানো এফএফটি-এড সিনোগ্রাম সারি থেকে বিভক্ত। নীচের সারি: লক্ষ্যমাত্রা 2D FFT-ing থেকে প্রত্যাশিত উপস্থিতি।
Fig5

চিত্র 5 এ: এই চেহারাটিকে গুণগত দিক থেকে বেশ ভাল চুক্তিতে দেখানোর জন্য চিত্র 5 এ সাব 5 এর সাবপ্লটগুলির কেন্দ্রীয় অঞ্চলটি জুম করুন। Fig5a

চিত্র:: অ্যাসিড পরীক্ষা: আন্তঃবিবর্তিত এফএফটি স্থানের বিপরীত 2D এফএফটি লক্ষ্য পুনরুদ্ধার করে। লেনা এখনও সবকিছু দেখতে সত্ত্বেও দেখতে বেশ সুন্দর দেখাচ্ছে (সম্ভবত কারণ 2 ডি এফএফটি বিমানটি যথেষ্ট ঘনভাবে আবরণ করার জন্য পর্যাপ্ত সিনোগ্রাম "স্পোকস" রয়েছে; আপনি এক্সপোজারের কোণগুলিকে কমিয়ে আনলে জিনিসগুলি আকর্ষণীয় হয়ে যায় তাই এটি আর সত্য নয় this )। এখানে চিত্র বর্ণনা লিখুন

কোডটি এখানে; দেবিয়ান / হুইজির bit৪ বিট সাইপাই-তে একটি আই 7-তে 15 এরও কম সময়ে প্লটগুলি নিয়ে আসে।

import math
import matplotlib
import matplotlib.pyplot as plt
import numpy as np

import scipy.interpolate
import scipy.fftpack
import scipy.misc
import scipy.ndimage.interpolation

S=256 # Size of target, and resolution of Fourier space
N=259 # Number of sinogram exposures (odd number avoids redundant direct opposites)

V=100 # Range on fft plots

# Convenience function
def sqr(x): return x*x

# Return the angle of the i-th (of 0-to-N-1) sinogram exposure in radians.
def angle(i): return (math.pi*i)/N

# Prepare a target image
x,y=np.meshgrid(np.arange(S)-S/2,np.arange(S)-S/2)
mask=(sqr(x)+sqr(y)<=sqr(S/2-10))
target=np.where(
    mask,
    scipy.misc.imresize(
        scipy.misc.lena(),
        (S,S),
        interp='cubic'
        ),
    np.zeros((S,S))
    )/255.0

plt.figure()
plt.title("Target")
plt.imshow(target)
plt.gray()

# Project the sinogram (ie calculate Radon transform)
sinogram=np.array([
        np.sum(
            scipy.ndimage.interpolation.rotate(
                target,
                np.rad2deg(angle(i)), # NB rotate takes degrees argument
                order=3,
                reshape=False,
                mode='constant',
                cval=0.0
                )
            ,axis=0
            ) for i in xrange(N)
        ])

plt.figure()
plt.title("Sinogram")
plt.imshow(sinogram)
plt.jet()

# Fourier transform the rows of the sinogram, move the DC component to the row's centre
sinogram_fft_rows=scipy.fftpack.fftshift(
    scipy.fftpack.fft(
        scipy.fftpack.ifftshift(
            sinogram,
            axes=1
            )
        ),
    axes=1
    )

plt.figure()
plt.subplot(121)
plt.title("Sinogram rows FFT (real)")
plt.imshow(np.real(sinogram_fft_rows),vmin=-V,vmax=V)
plt.subplot(122)
plt.title("Sinogram rows FFT (imag)")
plt.imshow(np.imag(sinogram_fft_rows),vmin=-V,vmax=V)

# Coordinates of sinogram FFT-ed rows' samples in 2D FFT space
a=np.array([angle(i) for i in xrange(N)])
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()

plt.figure()
plt.title("Sinogram samples in 2D FFT (abs)")
plt.scatter(
    srcx,
    srcy,
    c=np.absolute(sinogram_fft_rows.flatten()),
    marker='.',
    edgecolor='none',
    vmin=-V,
    vmax=V
    )

# Let the central slice theorem work its magic!
# Interpolate the 2D Fourier space grid from the transformed sinogram rows
fft2=scipy.interpolate.griddata(
    (srcy,srcx),
    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(np.real(fft2),vmin=-V,vmax=V)
plt.subplot(222)
plt.title("Recon (imag)")
plt.imshow(np.imag(fft2),vmin=-V,vmax=V)

# Show 2D FFT of target, just for comparison
expected_fft2=scipy.fftpack.fftshift(
    scipy.fftpack.fft2(
        scipy.fftpack.ifftshift(
            target
            )
        )
    )

plt.subplot(223)
plt.title("Expected (real)")
plt.imshow(np.real(expected_fft2),vmin=-V,vmax=V)
plt.subplot(224)
plt.title("Expected (imag)")
plt.imshow(np.imag(expected_fft2),vmin=-V,vmax=V)

# Transform from 2D Fourier space back to a reconstruction of the target
recon=np.real(
    scipy.fftpack.fftshift(
        scipy.fftpack.ifft2(
            scipy.fftpack.ifftshift(fft2)
            )
        )
    )

plt.figure()
plt.title("Reconstruction")
plt.imshow(recon,vmin=0.0,vmax=1.0)
plt.gray()

plt.show()

আপডেট 2013-02-17: আপনি যদি এতটুকু সময় কাটাতে আগ্রহী হন তবে স্ব-গবেষণা প্রোগ্রামের আরও কিছু আউটপুট যা এটির একটি অংশ ছিল এই পোস্টার আকারে পাওয়া যাবে । এই সংগ্রহস্থলের কোডের মূল অংশটিও আগ্রহী হতে পারে (তবে নোট করুন যে কোডটি উপরের মতো প্রায় প্রবাহিত নয়)। আমি এটিকে একবারে আইপিথন "নোটবুক" হিসাবে আবার চেষ্টা করে দেখতে পারি।


3

সমস্যাটি ঠিক কোথায় তা আমি জানি না তবে স্লাইস উপপাদ্যের অর্থ এই দুটি বিশেষ ক্ষেত্রে হওয়া উচিত:

fft2(target)[0] = fft(sinogram[270])
fft2(target)[:,0] = fft(sinogram[0])

সুতরাং আপনার কোডটি অনুসরণ করুন এবং সাইনোগ্রাম থেকে এবং উত্পন্ন 2D এফএফটি থেকে পিছনে পিছনে কাজ করা এই পয়েন্টগুলির সমতুল্য হওয়া বন্ধ করে দেওয়ার জন্য চেষ্টা করুন।

এটি ঠিক দেখাচ্ছে না:

In [47]: angle(expected_fft2[127:130,127:130])
Out[47]: 
array([[-0.07101021,  3.11754929,  0.02299738],
       [ 3.09818784,  0.        , -3.09818784],
       [-0.02299738, -3.11754929,  0.07101021]])

In [48]: fft2_ = fft2_real+1.0j*fft2_imag

In [49]: angle(fft2_[127:130,127:130])
Out[49]: 
array([[ 3.13164353, -3.11056554,  3.11906449],
       [ 3.11754929,  0.        , -3.11754929],
       [ 3.11519503,  3.11056604, -2.61816765]])

আপনি যে 2 ডি এফএফটি তৈরি করছেন তা 90 ডিগ্রিটি কী হওয়া উচিত তা থেকে ঘোরানো হয়?

আমি বাস্তব এবং কাল্পনিক না হয়ে প্রশস্ততা এবং ধাপের সাথে কাজ করার পরামর্শ দেব, যাতে আপনি আরও সহজে কী ঘটছে তা দেখতে পাবেন:

এখানে চিত্র বর্ণনা লিখুন

(সাদা কোণগুলি করণে অন্তর্ভুক্ত log(abs(0)), তারা কোনও সমস্যা নয়)


2

আমি বিশ্বাস করি যে প্রথম সমাধানটি কাজ না করার জন্য আসল তাত্ত্বিক কারণটি এ থেকে আসে যে চিত্রগুলি কেন্দ্রগুলির সাথে ঘোরানো হয়, এটি একটি অফসেটকে প্ররোচিত করে [S/2, S/2], যার অর্থ আপনার সারিগুলির প্রতিটি সীমা sinogramথেকে 0আসে না Sবরং থেকে -S/2থেকে S/2। আপনার উদাহরণে, অফসেটটি আসলে offset = np.floor(S/2.)। নোট করুন যে Sএটি সমান বা বিজোড়র জন্য কাজ করে এবং আপনি আপনার কোডটিতে যা করেছেন তার সমতুল্য S/2(যদিও আরও স্পষ্টত ইস্যুগুলি এড়ানো Sহয় float, উদাহরণস্বরূপ , যখন এটি একটি )।

আমার ধারণা হ'ল ফুরিয়ার ট্রান্সফর্ম (এফটি) এর সাথে এই শিফ্টটি প্রবর্তনকারী পর্যায়ে বিলম্ব হয় যা আপনি আপনার দ্বিতীয় বার্তায় যে বিষয়ে কথা বলবেন তার সূচনা: পর্যায়ক্রমে গোলমাল হয়ে যায় এবং সক্ষম হওয়ার জন্য একজনকে সেই শিফটটি ক্ষতিপূরণ দিতে হবে রেডন রূপান্তরটির বিপরীত প্রয়োগ করুন। উল্টোটি প্রত্যাশার মতো কাজ করার জন্য ঠিক কী প্রয়োজন তা নিশ্চিত হওয়ার জন্য একজনকে সেই তত্ত্বের আরও খনন করতে হবে।

এই অফসেটটি ক্ষতিপূরণ দেওয়ার জন্য আপনি হয় ফাফশিফ্টটি আপনার মতো করে ব্যবহার করতে পারেন (যা প্রতিটি সারিটির শুরুতে কেন্দ্র স্থাপন করে, এবং যেহেতু ডিএফটি ব্যবহার করা আসলে একটি এস-পিরিয়ডিক সংকেতের ফুরিয়ার ট্রান্সফর্মের সংখ্যার সাথে সামঞ্জস্য করে, আপনি সঠিক স্টাফ দিয়ে শেষ করেন ), বা sinogramএফটি কম্পিউটিং করার সময় জটিল ফুরিয়ার ট্রান্সফর্মে স্পষ্টভাবে এই প্রভাবটিকে ক্ষতিপূরণ দিন । অনুশীলনে, পরিবর্তে:

sinogram_fft_rows=scipy.fftpack.fftshift(
    scipy.fftpack.fft(
        scipy.fftpack.ifftshift(
            sinogram,
            axes=1
            )
        ),
    axes=1
    )

আপনি ifftshiftসংশোধনকারী ভেক্টর দ্বারা প্রতিটি সারিটি মুছে ফেলতে এবং গুণতে পারেন :

offset = np.floor(S/2.)
sinogram_fft_rows = scipy.fftpack.fftshift(
    scipy.fftpack.fft(sinogram, axis=1)
    * (np.exp(1j * 2.* np.pi * np.arange(S) * offset / S)),
    axes=1)

এটি ফুরিয়ার রূপান্তর বৈশিষ্ট্য থেকে আসে, যখন সময়-শিফটের কথা বিবেচনা করে ( "শিফট উপপাদ্য" এর জন্য এফটি উইকিপিডিয়া পৃষ্ঠাটি পরীক্ষা করে দেখুন এবং সমান শিফটের জন্য আবেদন করুন - offset- কারণ আমরা চিত্রটিকে কেন্দ্রের চারপাশে রেখেছি)।

তেমনি, আপনি পুনর্গঠনের ক্ষেত্রে একই কৌশল প্রয়োগ করতে পারেন fftshiftএবং উভয় মাত্রায় পর্যায়ক্রমে সংশোধন করে প্রতিস্থাপন করতে পারেন , তবে অন্য দিকে (ক্ষতিপূরণ ফিরিয়ে দিতে):

recon=np.real(
    scipy.fftpack.ifft2(
        scipy.fftpack.ifftshift(fft2)
        *  np.outer(np.exp(- 1j * 2.* np.pi * np.arange(S) * offset / S),
                    np.exp(- 1j * 2.* np.pi * np.arange(S) * offset / S))
        )
    )

ঠিক আছে, এটি আপনার সমাধানটির উন্নতি করে না, বরং আপনার প্রশ্নের তাত্ত্বিক দিকগুলিতে আরও একটি আলোকপাত করবে। আশা করি এইটি কাজ করবে!

অতিরিক্তভাবে, আমি ব্যবহারের এত পছন্দ করি না fftshiftকারণ এটি যেভাবে fftগণনা করা হয় তা ঘিরে গোলমাল করে। তবে এক্ষেত্রে, আপনাকে বিভক্ত হওয়ার আগে চিত্রটির কেন্দ্রস্থলে FT- র কেন্দ্র স্থাপন করতে হবে fft2(বা সেট করার সময় কমপক্ষে সতর্কতা অবলম্বন করুন r- যাতে আপনি এটি সম্পূর্ণ- fftshiftনিখরচায় তৈরি করতে পারেন ), এবং fftshiftসত্যই কার্যকর হয়ে আসে comes আছে। আমি তবে এই ফাংশনটির ব্যবহার ভিজ্যুয়ালাইজেশনের উদ্দেশ্যে রাখার পক্ষে পছন্দ করি, এবং গণনা "মূল" এর মধ্যে নয়। :-)

শুভেচ্ছান্তে,

জাঁ লুই

পিএস: আপনি চারপাশের বৃত্তটি না কাটিয়ে ছবিটি পুনর্গঠনের চেষ্টা করেছেন? এটি কোণে একটি দুর্দান্ত শীতল ঝাপসা প্রভাব দেয়, ইনস্টাগ্রামের মতো প্রোগ্রামগুলিতে এমন বৈশিষ্ট্যটি পেয়ে ভাল লাগবে, তাই না?

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.