用python实现:分别利用BLPF和BHPF滤波器提取合成图像的低频和高频信息,绘制对应频谱图和空域图像,要求,程序包含滤波器公式
时间: 2024-03-05 19:53:56 浏览: 305
好的,我可以为您提供Python实现代码。首先,我们需要导入一些库,如下所示:
```python
import numpy as np
import cv2
from matplotlib import pyplot as plt
```
然后,我们可以定义两个函数来实现BLPF和BHPF滤波器。滤波器的公式如下:
BLPF:$H(u,v) = \frac{1}{1 + (D(u,v)/D_0)^{2n}}$
BHPF:$H(u,v) = \frac{(D_0^2)}{(D(u,v)^2 + D_0^2)^n}$
其中,$D(u,v)$是频域中的距离,$D_0$是截止频率,$n$是滤波器的阶数。
BLPF实现代码如下:
```python
def BLPF(D0, n, width, height):
P = width / 2
Q = height / 2
H = np.zeros((height, width))
for u in range(width):
for v in range(height):
distance = np.sqrt((u - P) ** 2 + (v - Q) ** 2)
H[u, v] = 1 / (1 + (distance / D0) ** (2 * n))
return H
```
BHPF实现代码如下:
```python
def BHPF(D0, n, width, height):
P = width / 2
Q = height / 2
H = np.zeros((height, width))
for u in range(width):
for v in range(height):
distance = np.sqrt((u - P) ** 2 + (v - Q) ** 2)
H[u, v] = (D0 ** 2) / ((distance ** 2) + (D0 ** 2)) ** n
return H
```
接下来,我们需要读取合成图像并对其进行傅里叶变换。代码如下:
```python
img = cv2.imread('synthetic_image.jpg', 0)
f = np.fft.fft2(img)
fshift = np.fft.fftshift(f)
magnitude_spectrum = 20 * np.log(np.abs(fshift))
```
现在,我们可以使用BLPF和BHPF滤波器对合成图像进行低频和高频信息提取。代码如下:
```python
D0 = 30
n = 2
# BLPF
H_blpf = BLPF(D0, n, img.shape[1], img.shape[0])
G_blpf = H_blpf * fshift
g_blpf = np.real(np.fft.ifft2(np.fft.ifftshift(G_blpf)))
# BHPF
H_bhpf = BHPF(D0, n, img.shape[1], img.shape[0])
G_bhpf = H_bhpf * fshift
g_bhpf = np.real(np.fft.ifft2(np.fft.ifftshift(G_bhpf)))
```
最后,我们可以绘制对应频谱图和空域图像。代码如下:
```python
plt.subplot(231),plt.imshow(img, cmap = 'gray')
plt.title('Input Image'), plt.xticks([]), plt.yticks([])
plt.subplot(232),plt.imshow(magnitude_spectrum, cmap = 'gray')
plt.title('Magnitude Spectrum'), plt.xticks([]), plt.yticks([])
plt.subplot(234),plt.imshow(g_blpf, cmap = 'gray')
plt.title('BLPF Image'), plt.xticks([]), plt.yticks([])
plt.subplot(235),plt.imshow(g_bhpf, cmap = 'gray')
plt.title('BHPF Image'), plt.xticks([]), plt.yticks([])
plt.subplot(236),plt.imshow(H_blpf, cmap = 'gray')
plt.title('BLPF Filter'), plt.xticks([]), plt.yticks([])
plt.show()
```
注意:在代码中,我们假设合成图像的名称为“synthetic_image.jpg”,并且它位于当前工作目录中。
完整代码如下:
阅读全文