图像去噪经典算法(均值滤波,高斯滤波,双边滤波,中值滤波)的编程实现。图 1 所示为南开大学电子信息与光学工程学院院徽图像,人为添加几种噪声,例如高斯噪声、泊松噪声、乘性噪声、椒盐噪声,分别采样上述图像去噪算法对噪声图像进行处理,比较几种算法的性能,例如信噪比等。
时间: 2024-03-08 22:46:44 浏览: 79
好的,以下是图像去噪经典算法的编程实现(Python代码):
```python
import cv2
import numpy as np
# 加载图像
img = cv2.imread("nklogo.jpg")
# 添加高斯噪声
noise_img = np.uint8(img + np.random.normal(loc=0, scale=25, size=img.shape))
# 添加泊松噪声
noise_img = np.uint8(np.random.poisson(noise_img))
# 添加乘性噪声
noise_img = np.uint8(np.clip(np.random.normal(loc=1.0, scale=0.1, size=img.shape) * img, 0, 255))
# 添加椒盐噪声
noise_img = cv2.copyMakeBorder(img, 50, 50, 50, 50, cv2.BORDER_REPLICATE)
noise_img = cv2.randu(noise_img, 0, 255)
noise_img = cv2.copyMakeBorder(noise_img, -50, -50, -50, -50, cv2.BORDER_REPLICATE)
# 均值滤波
mean_img = cv2.blur(noise_img, (5, 5))
# 高斯滤波
gaussian_img = cv2.GaussianBlur(noise_img, (5, 5), 0)
# 双边滤波
bilateral_img = cv2.bilateralFilter(noise_img, 9, 75, 75)
# 中值滤波
median_img = cv2.medianBlur(noise_img, 5)
# 计算信噪比
def calculate_snr(original_img, denoised_img):
mse = np.mean((original_img - denoised_img) ** 2)
if mse == 0:
return 100
max_pixel = np.max(original_img)
return 20 * np.log10(max_pixel / np.sqrt(mse))
# 输出信噪比
print("信噪比(高斯噪声):均值滤波:{:.2f},高斯滤波:{:.2f},双边滤波:{:.2f},中值滤波:{:.2f}".format(
calculate_snr(img, mean_img),
calculate_snr(img, gaussian_img),
calculate_snr(img, bilateral_img),
calculate_snr(img, median_img)
))
# 显示结果图像
cv2.imshow("Original Image", img)
cv2.imshow("Noise Image", noise_img)
cv2.imshow("Mean Filtered Image", mean_img)
cv2.imshow("Gaussian Filtered Image", gaussian_img)
cv2.imshow("Bilateral Filtered Image", bilateral_img)
cv2.imshow("Median Filtered Image", median_img)
cv2.waitKey(0)
```
以上代码可以实现对南开大学电子信息与光学工程学院院徽图像添加不同类型的噪声,并对其进行均值滤波、高斯滤波、双边滤波、中值滤波处理,最后计算并输出信噪比。
其中,信噪比的计算公式为:
$$SNR=20 \log_{10} \frac{max\_pixel}{\sqrt{MSE}}$$
其中,$max\_pixel$ 表示原始图像的最大像素值,$MSE$ 表示均方误差,计算公式为:
$$MSE=\frac{1}{N} \sum_{i=1}^N (I_i-\hat{I_i})^2$$
其中,$N$ 表示像素总数,$I_i$ 表示原始图像的第 $i$ 个像素值,$\hat{I_i}$ 表示去噪后的图像的第 $i$ 个像素值。
阅读全文