Frequceial Transform
频域变换
Transform
FFT
通过np.fft.fft2可以进行图片的傅里叶变换。

Code
import numpy as np
import matplotlib.pyplot as plt
from skimage import data, color
# 使用skimage的案例图片:camera
image = np.clip(color.rgb2gray(data.coffee())*255.0,0,255).astype(np.uint8)
# 图像尺寸
rows, cols = image.shape
# 变换结果
f = np.fft.fft2(image)
fshift = np.fft.fftshift(f)
# 显示原始图像和变换后的图像
fig, axs = plt.subplots(2, 3, figsize=(20, 10))
# 原始图像
axs[0][0].imshow(image, cmap='gray')
axs[0][0].set_title('Original Image')
# 变换后的图像
axs[1][0].imshow(np.log(np.abs(fshift)), cmap='gray')
axs[1][0].set_title('Fourier Transformed Image')
def function_im(m, n):
N = 256
x, y = np.meshgrid(np.arange(N), np.arange(N))
im = np.exp(-2j * np.pi * (m * x / N + n * y / N)).real
if m == 0 and n == 0:
im = np.round(im)
return im
axs[0][1].imshow(function_im(0,1),cmap='gray')
axs[0][1].set_title("(0,1)")
axs[1][1].imshow(function_im(1,0),cmap='gray')
axs[1][1].set_title("(1,0)")
axs[0][2].imshow(function_im(1,1),cmap='gray')
axs[0][2].set_title("(1,1)")
axs[1][2].imshow(function_im(2,3),cmap='gray')
axs[1][2].set_title("(2,3)")
plt.show()
Filtering
Ideal Filter
简单的把频域切成高通与低通,会产生“振铃”效应。

Code
from skimage import data
import numpy as np
import matplotlib.pyplot as plt
def freq_trans(image,func=None):
# Convert the image to the frequency domain
f = np.fft.fft2(image)
fshift = np.fft.fftshift(f)
if func == None: return fshift, image
# Apply the filter function to the frequency domain
fshift_filtered = func(fshift)
# Convert back to the spatial domain
f_inv = np.fft.ifftshift(fshift_filtered)
image_filtered = np.fft.ifft2(f_inv)
return fshift_filtered, image_filtered
def cal_dis(image_shape):
"""Create a high-pass mask."""
center_width = image_shape[0] // 2
center_height = image_shape[1] // 2
x = np.arange(image_shape[0])
y = np.arange(image_shape[1])
X, Y = np.meshgrid(x, y)
distances = np.sqrt((X - center_width)**2 + (Y - center_height)**2)
return distances
def ideal_high_pass_filter(fshift):
"""High pass filter function."""
return np.where(cal_dis(fshift.shape)>40, fshift, 0)
def ideal_low_pass_filter(fshift):
"""Low pass filter function."""
return np.where(cal_dis(fshift.shape)<=40, fshift, 0)
img = data.camera()
f1,m1 = freq_trans(img)
f2,m2 = freq_trans(img, ideal_high_pass_filter)
f3,m3 = freq_trans(img, ideal_low_pass_filter)
plt.subplot(2,3,1)
plt.imshow(m1,cmap='gray')
plt.title("Original Image")
plt.axis('off')
plt.subplot(2,3,2)
plt.imshow(np.real(m2),cmap='gray')
plt.title("High Pass Image")
plt.axis('off')
plt.subplot(2,3,3)
plt.imshow(np.real(m3),cmap='gray')
plt.title("Low Pass Image")
plt.axis('off')
plt.subplot(2,3,4)
plt.imshow(np.log(np.abs(f1)),cmap='gray')
plt.axis('off')
plt.subplot(2,3,5)
plt.imshow(np.log(np.abs(f2)),cmap='gray')
plt.axis('off')
plt.subplot(2,3,6)
plt.imshow(np.log(np.abs(f3)),cmap='gray')
plt.axis('off')
plt.show()Butterworth Filter

Code
from skimage import data, filters
import numpy as np
import matplotlib.pyplot as plt
def fft(img):
f = np.fft.fft2(img)
return np.fft.fftshift(f)
m1 = data.camera()
f1 = fft(m1)
m2 = filters.butterworth(m1,high_pass=True,cutoff_frequency_ratio=0.04)
f2 = fft(m2)
m3 = filters.butterworth(m1,high_pass=False,cutoff_frequency_ratio=0.04)
f3 = fft(m3)
plt.subplot(2,3,1)
plt.imshow(m1,cmap='gray',vmax=255,vmin=0)
plt.title("Original Image")
plt.axis('off')
plt.subplot(2,3,2)
plt.imshow(m2,cmap='gray',vmax=255,vmin=0) # type: ignore
plt.title("High Pass Image")
plt.axis('off')
plt.subplot(2,3,3)
plt.imshow(m3,cmap='gray') # type: ignore
plt.title("Low Pass Image")
plt.axis('off')
plt.subplot(2,3,4)
plt.imshow(np.log(np.abs(f1)),cmap='gray')
plt.axis('off')
plt.subplot(2,3,5)
plt.imshow(np.log(np.abs(f2)),cmap='gray')
plt.axis('off')
plt.subplot(2,3,6)
plt.imshow(np.log(np.abs(f3)),cmap='gray')
plt.axis('off')
plt.tight_layout()
plt.show()Wavelet
Haar 小波基函数,(a) 为缩放因子,(b) 为平移因子
ψa,b(x)=∣a∣−1/2ψ(ax−b)
对于离散小波:i为缩放因子,j为平移因子
a=2j,b=ia
ϕji(x)=2j/2ϕ(2jx−i)

Reference
最后更新于
这有帮助吗?