利用所提供的带噪声的lena图,并自己生成带有高斯或者椒盐噪声的lena图;进行傅里叶变换,观察频谱图与原图相比,有何变化?这些变化可以通过怎样的频域处理(滤波等)进行改善?
时间: 2024-05-13 19:15:02 浏览: 177
好的,这是一个很好的图像处理问题,我们可以按照以下步骤进行解答:
1. 读取并显示原始的lena图像
我们可以使用Python中的OpenCV库来读取并显示图像。以下是代码示例:
``` python
import cv2
# 读取原始lena图像
img = cv2.imread("lena.png", cv2.IMREAD_GRAYSCALE)
# 显示图像
cv2.imshow("Original Image", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
2. 生成带有噪声的lena图像
我们可以使用OpenCV库的`randn()`函数来生成高斯噪声,也可以使用`randint()`函数来生成椒盐噪声。以下是代码示例:
``` python
import cv2
import numpy as np
# 读取原始lena图像
img = cv2.imread("lena.png", cv2.IMREAD_GRAYSCALE)
# 生成高斯噪声
mean = 0
var = 100
sigma = var ** 0.5
gaussian = np.random.normal(mean, sigma, img.shape)
noisy_image = img + gaussian
# 生成椒盐噪声
s_vs_p = 0.5
amount = 0.05
num_salt = np.ceil(amount * img.size * s_vs_p)
num_pepper = np.ceil(amount * img.size * (1.0 - s_vs_p))
salt_coords = [np.random.randint(0, i - 1, int(num_salt)) for i in img.shape]
pepper_coords = [np.random.randint(0, i - 1, int(num_pepper)) for i in img.shape]
noisy_image = img.copy()
noisy_image[tuple(salt_coords)] = 255
noisy_image[tuple(pepper_coords)] = 0
# 显示图像
cv2.imshow("Noisy Image", noisy_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
3. 进行傅里叶变换并显示频谱图
我们可以使用OpenCV库的`dft()`函数来进行二维离散傅里叶变换,并使用`magnitude()`函数来计算频谱图的振幅。以下是代码示例:
``` python
import cv2
import numpy as np
# 读取原始lena图像
img = cv2.imread("lena.png", cv2.IMREAD_GRAYSCALE)
# 生成高斯噪声
mean = 0
var = 100
sigma = var ** 0.5
gaussian = np.random.normal(mean, sigma, img.shape)
noisy_image = img + gaussian
# 进行二维离散傅里叶变换
dft = cv2.dft(np.float32(noisy_image), flags=cv2.DFT_COMPLEX_OUTPUT)
dft_shift = np.fft.fftshift(dft)
# 计算频谱图的振幅
magnitude_spectrum = 20 * np.log(cv2.magnitude(dft_shift[:, :, 0], dft_shift[:, :, 1]))
# 显示图像和频谱图
cv2.imshow("Noisy Image", noisy_image)
cv2.imshow("Magnitude Spectrum", magnitude_spectrum.astype(np.uint8))
cv2.waitKey(0)
cv2.destroyAllWindows()
```
4. 进行频域处理来改善图像
我们可以使用低通滤波器来去除高斯噪声,或使用中值滤波器来去除椒盐噪声。以下是代码示例:
``` python
import cv2
import numpy as np
# 读取原始lena图像
img = cv2.imread("lena.png", cv2.IMREAD_GRAYSCALE)
# 生成高斯噪声
mean = 0
var = 100
sigma = var ** 0.5
gaussian = np.random.normal(mean, sigma, img.shape)
noisy_image = img + gaussian
# 进行二维离散傅里叶变换
dft = cv2.dft(np.float32(noisy_image), flags=cv2.DFT_COMPLEX_OUTPUT)
dft_shift = np.fft.fftshift(dft)
# 计算频谱图的振幅
magnitude_spectrum = 20 * np.log(cv2.magnitude(dft_shift[:, :, 0], dft_shift[:, :, 1]))
# 进行低通滤波器来去除高斯噪声
rows, cols = img.shape
crow, ccol = int(rows / 2), int(cols / 2)
mask = np.zeros((rows, cols, 2), np.uint8)
r = 60
mask[crow - r:crow + r, ccol - r:ccol + r] = 1
fshift = dft_shift * mask
f_ishift = np.fft.ifftshift(fshift)
img_back = cv2.idft(f_ishift)
img_back = cv2.magnitude(img_back[:, :, 0], img_back[:, :, 1])
# 进行中值滤波器来去除椒盐噪声
median = cv2.medianBlur(noisy_image, 5)
# 显示图像和频谱图
cv2.imshow("Original Image", img)
cv2.imshow("Noisy Image", noisy_image)
cv2.imshow("Low Pass Filtered Image", img_back.astype(np.uint8))
cv2.imshow("Median Filtered Image", median)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
通过以上步骤,我们可以观察到带有噪声的lena图像的频谱图存在明显的高频噪声,但是经过低通滤波器处理之后,高频噪声被有效地去除了。而对于带有椒盐噪声的lena图像,中值滤波器可以有效地去除椒盐噪声。因此,我们可以通过频域处理来改善带有噪声的图像。
阅读全文