本次实验的目标主要是为了学会使用Python对图像作滤波处理,掌握相关滤波算法。对于给定图像添加噪声,能用平均滤波器、中值滤波器对不同强度的高斯噪声和椒盐噪声进行滤波处理。同时学会使用相关算子对图像作锐化处理,掌握相关锐化算法。
本次实验主要完成了对原始图像添加指定强度的高斯噪声和椒盐噪声,使用拉普拉斯算子对图像进行锐化处理,使用中值滤波和均值滤波两种方式进行图像平滑处理并比较其对于高斯和椒盐两类噪声的平滑处理效果,使用不同掩膜大小的中值滤波和均值滤波对带有高斯噪声的图像进行平滑处理并比较不同掩膜大小对于图像平滑的效果影响。
以下为代码:
import cv2 import numpy as np import matplotlib.pyplot as plt # 定义求卷积运算的函数 def convolution(img_old, kernel): #参数为输入图像和卷积模板 img_new = np.zeros(img_old.shape, dtype=int) #生成与原图像等大的元素均为0的矩阵 for i in range(1, img_new.shape[0] - 1): # 第一列和最后一列不用处理 for j in range(1, img_new.shape[1] - 1): tmp = 0 # 初始化为0,用来求和 for k in range(-1, 2): for l in range(-1, 2): tmp += img_old[i + k][j + l] * kernel[k + 1][l + 1] img_new[i][j] = abs(tmp) return img_new #返回卷积运算后的图像 #定义高斯噪声的生成函数 def add_gaussian_noise(img, mean=0, sigma=25): #参数为输入图像,高斯噪声的均值与标准差 gauss = np.random.normal(mean, sigma, img.shape) # 根据均值和标准差生成符合高斯分布的噪声 image_gaussian = img + gauss # 给图片添加高斯噪声 image_gaussian = np.clip(image_gaussian, a_min=0, a_max=255) # 设置图片添加高斯噪声之后的像素值的范围 return image_gaussian#返回添加完高斯噪声的图像 #定义椒盐噪声的生成函数 def add_sp_noise(img, s_vs_p=0.5, amount=0.04): # s_vs_p 设置添加椒盐噪声的数目比例 # amount 设置添加噪声图像像素的数目 image_sp = np.copy(img) # 添加 salt 噪声 num_salt = np.ceil(amount * img.size * s_vs_p) coords = [np.random.randint(0, i - 1, int(num_salt)) for i in img.shape] # 设置添加噪声的坐标位置 image_sp[tuple(coords)] = 255 # 添加 pepper 噪声 num_pepper = np.ceil(amount * img.size * (1. - s_vs_p)) coords = [np.random.randint(0, i - 1, int(num_pepper)) for i in img.shape] # 设置添加噪声的坐标位置 image_sp[tuple(coords)] = 0 return image_sp def main(): grayimg = cv2.imread('camera.png', cv2.IMREAD_GRAYSCALE) # 生成画布1 plt.figure(num=1,figsize=(8, 4)) # 显示原始图像 plt.subplot(1, 2, 1), plt.imshow(grayimg, cmap='gray'), plt.title('original img') # Laplacian锐化 kernel_Laplacian = np.array([[0, -1, 0], [-1, 5, -1], [0, -1, 0]]) img_Laplacian = convolution(grayimg, kernel_Laplacian) img_Laplacian = abs(img_Laplacian) plt.subplot(1, 2, 2), plt.imshow(img_Laplacian, cmap="gray"), plt.title("after Laplacian") # 生成画布2 plt.figure(num=2, figsize=(8, 4)) # 显示原始图像 plt.subplot(1, 3, 1), plt.imshow(grayimg, cmap='gray'), plt.title('original img') #加高斯噪声并显示 image_gaussian = add_gaussian_noise(grayimg) plt.subplot(1, 3, 2), plt.imshow(image_gaussian, cmap='gray'), plt.title('Gaussian Noise Image') # 加椒盐噪声并显示 image_sp = add_sp_noise(grayimg) plt.subplot(1, 3, 3), plt.imshow(image_sp, cmap='gray'), plt.title('Salt Noise Image') # 生成画布3 plt.figure(num=3,figsize=(8, 4)) # 对图像均值滤波,核大小为 3x3 Mean_gaussian = cv2.blur(image_gaussian, ksize=(3, 3)) Mean_sp = cv2.blur(image_sp, ksize=(3, 3)) # 对图像中值滤波,核大小为 3x3 Median_gaussian = cv2.medianBlur(np.uint8(image_gaussian), 3) Median_sp = cv2.medianBlur(np.uint8(image_sp), 3) #分别显示带有高斯和椒盐噪声的图像,以及分别用均值滤波和中值滤波对不同类型噪声的图像做处理后的图像 plt.subplot(2, 3, 1), plt.imshow(image_gaussian, cmap='gray'), plt.title('Gaussian Noise Image') plt.subplot(2, 3, 4), plt.imshow(image_sp, cmap='gray'), plt.title('Salt Noise Image') plt.subplot(2, 3, 2), plt.imshow(Mean_gaussian, cmap='gray'), plt.title('Mean Filtering For Gaussian') plt.subplot(2, 3, 3), plt.imshow(Median_gaussian, cmap='gray'), plt.title('Median Filtering For Gaussian') plt.subplot(2, 3, 5), plt.imshow(Mean_sp, cmap='gray'), plt.title('Mean Filtering For Salt') plt.subplot(2, 3, 6), plt.imshow(Median_sp, cmap='gray'), plt.title('Median Filtering For Salt') # 生成画布4 plt.figure(num=4, figsize=(8, 4)) # 对带有高斯噪声的图像均值滤波,核大小为 5x5 Mean_gaussian1 = cv2.blur(image_gaussian, ksize=(5, 5)) # 对带有高斯噪声的图像中值滤波,核大小为 5x5 Median_gaussian1 = cv2.medianBlur(np.uint8(image_gaussian), 5) # 显示分别用不同大小掩膜的均值滤波和中值滤波对带有高斯噪声的图像做处理后的图像 plt.subplot(2, 2, 1), plt.imshow(Mean_gaussian, cmap='gray'), plt.title('3*3 Mean Filtering For Gaussian') plt.subplot(2, 2, 2), plt.imshow(Mean_gaussian1, cmap='gray'), plt.title('5*5 Mean Filtering For Gaussian') plt.subplot(2, 2, 3), plt.imshow(Median_gaussian, cmap='gray'), plt.title('3*3Median Filtering For Gaussian') plt.subplot(2, 2, 4), plt.imshow(Median_gaussian1, cmap='gray'), plt.title('5*5Median Filtering For Gaussian') plt.show() if __name__ == '__main__': main()
考核思考题
1.结合实验内容,定性评价均值滤波/中值滤波对高斯噪声和椒盐噪声的去噪效果。
均值滤波对于高斯噪声的去噪效果更好,对椒盐噪声的去噪效果一般;
中值滤波对于高斯噪声的去噪效果一般,对椒盐噪声的去噪效果更好。
原因如下:
高斯噪声是幅值近似正态分布,但分布在每点像素上。因为正态分布的均值为0,所以均值滤波可以消除噪声。椒盐噪声是幅值近似相等但随机分布在不同位置上,图像中有干净点也有污染点。因为噪声的均值不为0,所以均值滤波不能很好地去除噪声点。
椒盐噪声是幅值近似相等但随机分布在不同位置上,图像中有干净点也有污染点。使用中值滤波时,被污染的点一般不处于中值的位置,即选择适当的点来替代污染点的值,所以处理效果好。高斯噪声是幅值近似正态分布,但分布在每点像素上。找不到干净的点来替代被污染的点,故处理效果不好。
2.结合实验内容,定性评价滤波窗口的大小对去噪效果的影响。
滤波窗口越大,去噪效果越好,但同时给图像带来的模糊也越严重。
实验分析与日志