实验题目:图像空域滤波
实验目的:1.掌握图像空域滤波原理
2.理解并分析平滑滤波与锐化滤波的区别与联系
实验内容
3.3平滑滤波
通常用来去除图像的噪声,首先需要给图像加入噪声,加入两种噪声的图像,代码如下:
首先导入库,再使用matplotlib中文字体和符号显示,防止图像注释字体错误
img = cv2.imread('/Users/edmund/Desktop/730_1.jpg', 0) img = img / 255
进行图像归一化,先读取图像并把图像通过置零强制转换为灰度图,随后进行归一化
img_g = skimage.util.random_noise(img, 'gaussian', mean=0, var=0.05)
使用skimage.util.random_noise
函数添加高斯噪声,其中mean=0表示噪声均值为0,var=0.05表示控制噪声强度
img_s=skimage.util.random_noise(img,'salt')
同理,引入椒盐噪声。
随后进行描绘并显示图像
运行结果
本次实验都基于这三张图片进行,将分别通过使用均值滤波器、加权滤波器和中值滤波器去除噪声
3.3.1空域滤波增强
1.空域平滑滤波
(1)均值滤波
代码展示
首先重复实验3.3操作,将图片读入并进行归一化处理,同时加入高斯噪声和椒盐噪声。
运行结果
从图中可以看出两种噪声在均值滤波后都一定程度上减少了噪声,但是也带来了模糊效应。同时也可以看出,随着滤波器变大,虽然去噪效果更好,但是模糊程度也更大。
(2)高斯滤波
为了能够在获取更好的滤波效果的同时又保证图像的清晰度,使用高斯滤波器
代码展示
运行结果
通过图像可以看出其结果和均值滤波类似,同时,通过对两次实验结果进行对比,可以发现高斯滤波后图像清晰度要比均值滤波的高。
(3)中值滤波
常用的空域滤波除了线性滤波器以外,还有非线性的中值滤波器,通常中值滤波器效果要优于均值滤波器和加权平均滤波器等线性滤波器。
代码展示
由于skimage.util.random_noise 返回的是 float64 类型,而cv2.medianBlur() 不支持 float64,但支持 uint8 或 float32,因此需要用 .astype('float32') 转换数据类型
运行结果
通过观察图像,可以看出与前两次实验结果相似的结论,同时,通过与前两次实验结果的对比,可以发现中值滤波对椒盐噪声有更好的滤波效果。
2.空域锐化滤波
空域锐化常用的方法是通过梯度算子进行滤波,一般使用的梯度算子有Roberts、Prewitt和Sobel等。
代码展示
运行结果
从图中可以看出,对于Roberts算子,边缘检测效果最为"锐利"但噪点较多,并且能清晰捕捉图像中的陡峭边缘和角点,背景噪声较明显;对于Prewitt算子,边缘连续性优于Roberts,对噪声有一定抑制作用,检测到的边缘较粗且平滑,但可能丢失部分细节边缘;对于Sobel算子,边缘清晰连续且噪声较少,重要边缘保留完整,边缘线条粗细适中。
3.4改写代码
内容:写一个程序,分别对一幅被均匀噪声和椒盐噪声污染的图像,用均值滤波,高斯滤波和中值滤波器处理,对比分析结果。
代码展示
运行结果
通过对三种滤波器去除噪声实验结果的对比分析,可以通过图片看出在均匀噪声方面,对于均值滤波,平滑效果明显,但会丢失部分细节,图像略显模糊;对于高斯滤波,平滑效果优于均值滤波,保留更多细节;对于均匀中值滤波,平滑效果不如高斯滤波,但能更好保留边缘。在椒盐噪声方面,对于均匀滤波,能减弱噪声但效果有限,仍可见明显噪声点,且边缘模糊;对于高斯滤波,效果与均值滤波类似,对大颗粒噪声处理能力有限;对于中值滤波,表现出最佳去噪效果,能有效消除孤立噪声点。综合来看,均值滤波计算简单但效果一般,高斯滤波适合处理高斯噪声,中值滤波特别适合处理椒盐噪声。
3.5程序编写
内容:不使用matplot库,仅使用openCV库,来编写均值滤波器和中值滤波器的底层实现代码。对比分析matplot方法与openCV方法的优缺点。
1.均值滤波
代码展示
运行结果
通过对输出的两幅结果图进行对比,可以看出原始图像显示未经处理的灰度图像,且保留所有细节,而通过均值滤波后的图像,图像整体更平滑,细小噪声被抑制,但是物体边缘会变模糊。matplot优点:
2.中值滤波
代码展示
neighborhood = [ image[row - 1, col - 1], image[row - 1, col], image[row - 1, col + 1], image[row, col - 1], image[row, col], image[row, col + 1], image[row + 1, col - 1], image[row + 1, col], image[row + 1, col + 1] ] # 对邻域像素排序并取中值 neighborhood.sort() # 原地排序 median = neighborhood[4] # 中间索引为4(第5个元素) # 更新目标图像像素值 dst[row, col] = median
作用:有效去除椒盐噪声,同时保留图像边缘
实验结果
通过对实验结果两幅图进行对比,可以看到结果图椒盐噪声(孤立的白/黑点)被显著消除,图像更平滑。相比均值滤波,中值滤波能更好保留锐利边缘。对于图像的纹理,高频纹理(如细密图案)可能轻微模糊,但主要结构清晰。
1、适合生成论文质量的可视化结果
2、支持标题、坐标轴、颜色条等丰富标注
3、可同时显示多个图像并对比
4、支持子图灵活布局(subplots
)、颜色条、注释
缺点:
1、大数据量(如4K图像)渲染慢
2、无GPU加速支持
3、图像处理功能少,仅支持基础操作
opencv优点:
1、支持摄像头帧处理,响应速度更快
2、优化了图像操作(如滤波、边缘检测)的计算效率
3、提供视频编解码、GUI交互
缺点:
1、仅支持基础显示(无坐标轴、图例等)
2、报错信息不清晰
3、多图对比需手动排列窗口
3.6实验总结
通过这次实验,我掌握了OpenCV中三种滤波函数的调用方法(cv2.blur
、cv2.GaussianBlur
、cv2.medianBlur
),熟悉了Matplotlib多子图对比展示技巧,在算法中我认识到不同噪声类型需要匹配相应的滤波方法,体会到中值滤波的非线性特性在保护边缘方面的优势,以及实际应用中可组合使用多种滤波方法来解决图片噪声问题。同时,对于实时系统,我认识到需要权衡滤波效果和计算效率来选择去除噪声的最优化方法,进而不断优化程序。