>>文章导航
1 实验目的和要求
(1)掌握图像处理的基本原理和滤波器的作用,了解不同滤波器的特点和应用范围;
(2)理解并掌握基于拉普拉斯模板的图像锐化等处理方法;
(3)了解并掌握图像运算的基本概念和方法等;
(4)通过实验,提高对图像处理基本概念的理解,培养实际操作和解决问题的能力。
2 实验环境与配置
(1)计算机;
(2)Python及Anaconda软件;
(3)典型的灰度、彩色图像等文件。
3 空域滤波
空域滤波是一种邻域处理方法,通过直接在图像空间中对邻域内像素进行处理,达到平滑或锐化图像的作用。
3.1 图像平滑(均值滤波、中值滤波、高斯滤波)
(1)均值滤波--cv2.blur(原始图像,核大小) (2)中值滤波--cv2.medianBlur(src, ksize) (3)高斯滤波--cv2.GaussianBlur(src, ksize, sigmaX)
ksize = 3 :
import cv2
img = cv2.imread('D:\images\lena_color_512_saltpepper.jpg ') # 读取图片
result_blur = cv2.blur(img, (3, 3)) #均值滤波
result_GaussianBlur = cv2.GaussianBlur(img, (3, 3), 0) # 高斯滤波(即课本的“加权平均滤波”)
result_medianBlur = cv2.medianBlur(img, 3) # 中值滤波
cv2.imshow('original', img)
cv2.imshow('result_blur', result_blur)
cv2.imshow('result_GaussianBlur', result_GaussianBlur)
cv2.imshow('result_medianBlur', result_medianBlur)
cv2.waitKey(0)
cv2.destroyAllWindows()
1. 比较哪种滤波的去噪效果更好。
中值滤波效果最好。
均值滤波是一种简单的平滑滤波器,它取像素点邻域的平均值作为新的像素值。这种滤波器对于消除图像中的随机噪声(特别是高斯噪声)有较好的效果,但是它对于椒盐噪声的抑制效果较差。
高斯滤波实际上也是加权平均滤波,只不过它给离中心近的像素赋予更大的权重。相比于均值滤波,高斯滤波对于消除噪声的效果更好一些,特别是对于消除椒盐噪声。
中值滤波是一种非线性操作滤波器,它将像素邻域的灰度值进行排序,然后取中间值作为新的像素值。中值滤波对于消除椒盐噪声特别有效,但是对于高斯噪声的抑制效果不如前两者。
哪种滤波器的去噪效果更好,取决于你的图像具体存在哪种噪声。如果处理的是高斯噪声,那么均值滤波和高斯滤波的效果会更好。如果处理的是椒盐噪声,那么中值滤波的效果会更好。
2. 对每种滤波函数,尝试不同的核大小 ksize (如 3 ,5 ,7 ),比较输出的平滑效果有何不同。
对于均值滤波,改变核大小会影响到滤波器对图像的平滑程度。较大的核大小将使滤波器对图像的平滑效果更强,这将使图像看起来更加模糊。较小的核大小将使滤波器的平滑效果较弱,图像将保留更多的细节。
对于高斯滤波,改变核大小也会影响到滤波器对图像的平滑程度。与均值滤波类似,较大的核大小将使图像看起来更加模糊,较小的核大小将使图像保留更多的细节。
对于中值滤波,改变核大小主要影响滤波器对图像的平滑程度。由于中值滤波是一种非线性操作,它对消除椒盐噪声特别有效,因此改变核大小对中值滤波的效果影响不大。
ksize = 5 :
import cv2
img = cv2.imread('D:\images\lena_color_512_saltpepper.jpg ') # 读取图片
result_blur = cv2.blur(img, (5, 5)) #均值滤波
result_GaussianBlur = cv2.GaussianBlur(img, (5, 5), 0) # 高斯滤波(即课本的“加权平均滤波”)
result_medianBlur = cv2.medianBlur(img, 5) # 中值滤波
cv2.imshow('original', img)
cv2.imshow('result_blur', result_blur)
cv2.imshow('result_GaussianBlur', result_GaussianBlur)
cv2.imshow('result_medianBlur', result_medianBlur)
cv2.waitKey(0)
cv2.destroyAllWindows()
ksize = 7 :
import cv2
img = cv2.imread('D:\images\lena_color_512_saltpepper.jpg ') # 读取图片
result_blur = cv2.blur(img, (7, 7)) #均值滤波
result_GaussianBlur = cv2.GaussianBlur(img, (7, 7), 0) # 高斯滤波(即课本的“加权平均滤波”)
result_medianBlur = cv2.medianBlur(img, 7) # 中值滤波
cv2.imshow('original', img)
cv2.imshow('result_blur', result_blur)
cv2.imshow('result_GaussianBlur', result_GaussianBlur)
cv2.imshow('result_medianBlur', result_medianBlur)
cv2.waitKey(0)
cv2.destroyAllWindows()
3. 自选一幅没有噪声的图片, 分别用上述三种滤波函数进行滤波, 观察无噪声情况下的平滑效果有何特点。
在无噪声的情况下,这三种滤波函数都可以使图像变得平滑,但是它们的特点有所不同。均值滤波和中值滤波都会使图像稍微变模糊,但是中值滤波对于边缘的保留效果更好一些。高斯滤波可以在保持图像清晰度的同时,去除一些小的噪声。
这三种滤波函数的效果还受到滤波器大小的影响。较大的滤波器可以更好地去除噪声,但是会使图像变得更加模糊。较小的滤波器可以更好地保留图像的细节,但是去除噪声的效果会较差。
import cv2
img = cv2.imread('D:\myimages\lake.jpg ') # 读取图片
result_blur = cv2.blur(img, (7, 7)) #均值滤波
result_GaussianBlur = cv2.GaussianBlur(img, (7, 7), 0) # 高斯滤波(即课本的“加权平均滤波”)
result_medianBlur = cv2.medianBlur(img, 7) # 中值滤波
cv2.imshow('original', img)
cv2.imshow('result_blur', result_blur)
cv2.imshow('result_GaussianBlur', result_GaussianBlur)
cv2.imshow('result_medianBlur', result_medianBlur)
cv2.waitKey(0)
cv2.destroyAllWindows()
4. 在不调用上述 cv2 自带 滤波 函数 的 情况下, 自己手动编程分别实现中值滤波、 高斯滤波(课本 p62 加权平均滤波), 要提供自己实现的代码和滤波效果。 滤波器大小为定为 3 ×3。
中值滤波:
import cv2
import numpy as np
def median_filter(image):
height, width = image.shape
result = np.zeros((height, width), dtype=np.uint8)
for i in range(1, height - 1):
for j in range(1, width - 1):
neighborhood = image[i - 1:i + 2, j - 1:j + 2]
result[i, j] = np.median(neighborhood)
return result
# 读取图像
image = cv2.imread('D:\myimages\cat.jfif', cv2.IMREAD_GRAYSCALE)
# 应用中值滤波
filtered_image = median_filter(image)
# 显示原始图像和滤波后的图像
cv2.imshow('Original Image', image)
cv2.imshow('Median Filtered Image', filtered_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
高斯滤波:
import cv2
import numpy as np
def gaussian_filter(image):
height, width = image.shape
result = np.zeros((height, width), dtype=np.uint8)
kernel = np.array([[1, 2, 1],
[2, 4, 2],
[1, 2, 1]]) / 16
for i in range(1, height - 1):
for j in range(1, width - 1):
neighborhood = image[i - 1:i + 2, j - 1:j + 2]
weighted_sum = np.sum(neighborhood * kernel)
result[i, j] = weighted_sum
return result
# 读取图像
image = cv2.imread('D:\myimages\cat.jfif', cv2.IMREAD_GRAYSCALE)
# 应用高斯滤波
filtered_image = gaussian_filter(image)
# 显示原始图像和滤波后的图像
cv2.imshow('Original Image', image)
cv2.imshow('Gaussian Filtered Image', filtered_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
3.2 图像锐化
dst = cv2.filter2D(src, -1, kernel) 上式中-1 表示目标图像和原图像深度(数据位数)一致,kernel 为滤波器模板,不同的模板具有的滤波效果。
(1) 拉普拉斯模板(线性)
kernel = 8:
import cv2
import numpy as np
src = cv2.imread('D:\myimages\dog_single.png')
kernel = np.array([[-1, -1, -1],
[-1, 8, -1],
[-1, -1, -1]])
dst = cv2.filter2D(src, -1, kernel)
cv2.imshow('original', src)
cv2.imshow('dst', dst)
cv2.imshow('src+dst', src+dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
2. 思考题:如果将上例中滤波模板中心的值由 8 改为 9 ,经filter2D(src, -1, kernel) 滤波后的图像是什么?简要分析为何会出现这样的滤波图像。
如果将滤波模板中心的值由8改为9,那么滤波器将变为一个锐化滤波器。经过filter2D(src, -1, kernel)滤波后,图像将变得更加清晰。因为锐化滤波器可以突出图像的边缘和细节,使图像看起来更加清晰。同时,由于滤波器中心值的变化,滤波器对图像的平滑程度也会有所不同,因此滤波后的图像可能会略有变化。
kernel = 9:
import cv2
import numpy as np
src = cv2.imread('D:\myimages\dog_single.png')
kernel = np.array([[-1, -1, -1],
[-1, 9, -1],
[-1, -1, -1]])
dst = cv2.filter2D(src, -1, kernel)
cv2.imshow('original', src)
cv2.imshow('dst', dst)
cv2.imshow('src+dst', src+dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
3. 换另一幅图像(不限于文件夹 images 内的图像,可以自己找)进行基于拉普拉斯模板的图像锐化。
import cv2
import numpy as np
src = cv2.imread('D:\myimages\cat.jfif')
kernel = np.array([[-1, -1, -1],
[-1, 8, -1],
[-1, -1, -1]])
dst = cv2.filter2D(src, -1, kernel)
cv2.imshow('original', src)
cv2.imshow('dst', dst)
cv2.imshow('src+dst', src+dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
4. 在不调用 filter2D 函数的情况下, 自己手动编程实现下面这个拉普拉斯模板的锐化滤波,要提供自己实现的代码和滤波效果。 滤波器 大小为 定为 3 ×3。
import cv2
import numpy as np
def laplacian_sharpening(image):
height, width = image.shape
result = np.zeros((height, width), dtype=np.uint8)
# 定义拉普拉斯锐化滤波器
laplacian_kernel = np.array([[0, -1, 0],
[-1, 4, -1],
[0, -1, 0]])
for i in range(1, height - 1):
for j in range(1, width - 1):
neighborhood = image[i - 1:i + 2, j - 1:j + 2]
weighted_sum = np.sum(neighborhood * laplacian_kernel)
result[i, j] = np.clip(weighted_sum, 0, 255) # 确保像素值在 0 到 255 之间
return result
# 读取图像
image = cv2.imread('D:\myimages\cat.jfif', cv2.IMREAD_GRAYSCALE)
# 应用拉普拉斯锐化滤波
sharpened_image = laplacian_sharpening(image)
# 显示原始图像和锐化后的图像
cv2.imshow('Original Image', image)
cv2.imshow('Sharpened Image', sharpened_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
4 实验心得与思考
4.1 实验心得总结
通过本次实验,我深入了解了图像处理的基本原理和不同滤波器的特点和应用范围。我不仅掌握了如何使用均值滤波、高斯滤波和中值滤波对图像进行去噪和平滑处理,还学习了如何利用拉普拉斯模板对图像进行锐化处理。同时,我也了解了图像运算的基本概念和方法。
在实验过程中,我通过观察和比较处理后的图像,发现不同滤波器在去噪效果和图像平滑效果方面有着不同的表现。均值滤波对消除图像中的随机噪声(特别是高斯噪声)有较好的效果,但会降低图像的清晰度。高斯滤波能更好地消除高斯噪声,但仍然会保留一部分噪声。中值滤波对消除椒盐噪声特别有效,但会使图像变得模糊。我还发现拉普拉斯锐化方法能够增强图像的边缘细节,使图像看起来更加清晰。
4.2 实验问题与解决
在实验中遇到预想之外的问题(比如得到的图像处理效果与预期不同),自己找到原因,并想到办法加以解决。
(1)用拉普拉斯滤波的将数组元素与序列进行赋值时出现问题, result数组用于存储整个滤波后的图像解决遇到的错误:
如果觉得作者写得还不错的话, 点赞 / 收藏 / 评论 / 转发 四连支持一下吧~😘
最重要的是点一个大大的关注, 你的支持就是作者创作的最大动力!!!