فصل چهارم: آزمایشهای پالایش حوزه فرکانس¶
این Notebook مکمل فصل چهارم است و از داده مصنوعی مستقل استفاده میکند. برای اجرای مجدد به NumPy، Matplotlib و Pillow نیاز دارید.
In [ ]:
import numpy as np
import matplotlib.pyplot as plt
from pathlib import Path
N=256
y,x=np.indices((N,N))
image=0.15+0.3*x/N
image[((x-85)**2+(y-110)**2)<42**2]=0.85
image[(x>155)&(x<215)&(y>153)&(y<210)]=0.25
plt.imshow(image,cmap="gray"); plt.title("Synthetic input"); plt.axis("off");
۱. طیف، اندازه و فاز¶
فاز حامل اطلاعات مربوط به محل قرارگیری ساختارهاست. اندازه طیف را برای نمایش بهصورت لگاریتمی رسم میکنیم.
In [ ]:
F=np.fft.fftshift(np.fft.fft2(image))
fig,ax=plt.subplots(1,3,figsize=(12,4))
for a,t,data in zip(ax,["Image","Log magnitude","Phase"],[image,np.log1p(np.abs(F)),np.angle(F)]):
a.imshow(data,cmap="gray"); a.set_title(t); a.axis("off")
plt.show()
۲. سه پایینگذر و یک بالاگذر¶
پارامتر cutoff و مرتبه باتروورث را تغییر دهید و ringing و محوشدگی را مقایسه کنید.
In [ ]:
yy=np.fft.fftshift(np.fft.fftfreq(N))*N
D=np.hypot(*np.meshgrid(yy,yy))
D0=22
filters={"Ideal":(D<=D0).astype(float),"Gaussian":np.exp(-D**2/(2*D0**2)),"Butterworth":1/(1+(D/D0)**6)}
fig,ax=plt.subplots(1,3,figsize=(12,4))
for a,(label,H) in zip(ax,filters.items()):
z=np.fft.ifft2(np.fft.ifftshift(F*H)).real
a.imshow(z,cmap="gray");a.set_title(label);a.axis("off")
plt.show()
۳. نویز تناوبی و ناتچهای متقارن¶
در این آزمایش یک موج سینوسی به تصویر اضافه میکنیم و دو نقطه متقارن طیف را تضعیف میکنیم.
In [ ]:
noisy=image+0.2*np.sin(2*np.pi*20*x/N)
S=np.fft.fftshift(np.fft.fft2(noisy));H=np.ones_like(image)
for dx in [-20,20]:
d=np.hypot(x-(N//2+dx),y-N//2)
H*=1-np.exp(-d**2/(2*3**2))
restored=np.fft.ifft2(np.fft.ifftshift(S*H)).real
fig,ax=plt.subplots(1,3,figsize=(11,4))
for a,t,z in zip(ax,["Interference","Notch","Restored"],[noisy,H,restored]):a.imshow(z,cmap="gray");a.set_title(t);a.axis("off")
plt.show()
پرسش¶
چرا در نویز سینوسی به دو ناتچ متقارن نیاز است؟ اگر عرض ناتچ را دو برابر کنیم چه مقدار جزئیات واقعی نیز حذف میشود؟