一、空域平滑滤波器

import matplotlib.pyplot as plt
# 设置matplotlib的字体为黑体,以便能够正确显示中文
plt.rcParams['font.sans-serif'] = ['SimHei']
# 解决matplotlib中负号无法正常显示的问题
plt.rcParams['axes.unicode_minus'] = False
import cv2
# 使用OpenCV的imread函数以灰度模式读取图像,存储为变量img
img = cv2.imread('D:\DIP\char.bmp', 0)
# 同样以灰度模式读取图像,用于后续添加高斯噪声相关操作,存储为变量img_g
img_g = cv2.imread('D:\DIP\char-gaosi.bmp', 0)
# 以灰度模式读取图像,用于后续添加椒盐噪声相关操作,存储为变量img_s
img_s = cv2.imread('D:\DIP\char-jiaoyan.bmp', 0)
# 使用OpenCV的blur函数对带高斯噪声的图像进行均值滤波,滤波器核大小为3x3
img_g_l = cv2.blur(img_g, (3, 3))
# 使用OpenCV的blur函数对带椒盐噪声的图像进行均值滤波,滤波器核大小为3x3
img_s_l = cv2.blur(img_s, (3, 3))
# 使用OpenCV的blur函数对带高斯噪声的图像进行均值滤波,滤波器核大小为5x5
img_g_l1 = cv2.blur(img_g, (5, 5))
# 使用OpenCV的blur函数对带椒盐噪声的图像进行均值滤波,滤波器核大小为5x5
img_s_l1 = cv2.blur(img_s, (5, 5))
# 创建一个2行3列的子图布局,并定位到第1个子图
plt.subplot(231)
# 显示带高斯噪声的图像,设置颜色映射为灰度图
plt.imshow(img_g, 'gray')
# 设置第1个子图的标题为'带高斯噪声图片'
plt.title('带高斯噪声图片')
# 创建一个2行3列的子图布局,并定位到第4个子图
plt.subplot(234)
# 显示带椒盐噪声的图像,设置颜色映射为灰度图
plt.imshow(img_s, 'gray')
# 设置第4个子图的标题为'带椒盐噪声图片'
plt.title('带椒盐噪声图片')
# 创建一个2行3列的子图布局,并定位到第2个子图
plt.subplot(232)
# 显示使用3x3核进行均值滤波后的带高斯噪声图像,设置颜色映射为灰度图
plt.imshow(img_g_l, 'gray')
# 设置第2个子图的标题为'均值滤波后图像(3*3)'
plt.title('均值滤波后图像(3*3)')
# 创建一个2行3列的子图布局,并定位到第3个子图
plt.subplot(233)
# 显示使用5x5核进行均值滤波后的带高斯噪声图像,设置颜色映射为灰度图
plt.imshow(img_g_l1, 'gray')
# 设置第3个子图的标题为'均值滤波后图像(5*5)'
plt.title('均值滤波后图像(5*5)')
# 创建一个2行3列的子图布局,并定位到第5个子图
plt.subplot(235)
# 显示使用3x3核进行均值滤波后的带椒盐噪声图像,设置颜色映射为灰度图
plt.imshow(img_s_l, 'gray')
# 设置第5个子图的标题为'均值滤波后图像(3*3)'
plt.title('均值滤波后图像(3*3)')
# 创建一个2行3列的子图布局,并定位到第6个子图
plt.subplot(236)
# 显示使用5x5核进行均值滤波后的带椒盐噪声图像,设置颜色映射为灰度图
plt.imshow(img_s_l1, 'gray')
# 设置第6个子图的标题为'均值滤波后图像(5*5)'
plt.title('均值滤波后图像(5*5)')
# 显示所有创建的子图
plt.show()

 


一、实验目的
探究均值滤波对含高斯噪声和椒盐噪声图像的处理效果,对比不同滤波器核大小(3x3和5x5)的滤波表现。
二、实验原理
均值滤波是一种线性滤波方法,通过计算滤波器核内像素的平均值来替换中心像素值,达到平滑图像、去除噪声的目的。滤波器核大小决定了参与计算的像素范围,影响滤波效果和图像细节保留程度。
三、实验步骤
1. 图像读取:使用OpenCV的 imread 函数以灰度模式读取含高斯噪声的图像 char-gaosi.bmp 、含椒盐噪声的图像 char-jiaoyan.bmp 以及原始图像 char.bmp 。
2. 均值滤波:分别使用 cv2.blur 函数对含高斯噪声和椒盐噪声的图像进行均值滤波,滤波器核大小设置为3x3和5x5。
3. 图像显示:利用Matplotlib创建2行3列的子图布局,分别显示含高斯噪声图像、含椒盐噪声图像以及不同核大小均值滤波后的图像,并添加对应标题。
四、实验结果
从实验结果可以直观看到,均值滤波对高斯噪声和椒盐噪声都有一定的抑制作用。3x3核的均值滤波在去除噪声的同时,较好地保留了图像的细节;5x5核的均值滤波虽然能更有效地去除噪声,但图像变得更加模糊,丢失了部分细节。对于高斯噪声,两种核大小的均值滤波都能取得较为明显的去噪效果;对于椒盐噪声,5x5核在去除大颗粒噪声时表现更好,但图像平滑过度,3x3核对小颗粒噪声去除效果尚可,且图像细节保留相对较多。
五、实验结论
均值滤波在去除图像噪声方面具有一定效果,但滤波器核大小的选择需要根据噪声类型和图像细节保留需求进行权衡。较小的核(如3x3)适合在保留图像细节的同时去除轻微噪声;较大的核(如5x5)更适合去除较大噪声,但会牺牲图像细节。在实际应用中,应根据具体情况选择合适的滤波器参数以达到最佳的去噪效果。

二、加噪声 

import matplotlib.pyplot as plt
# 设置matplotlib的字体为黑体,以便能够正确显示中文
plt.rcParams['font.sans-serif'] = ['SimHei']
# 解决matplotlib中负号无法正常显示的问题
plt.rcParams['axes.unicode_minus'] = False
import skimage
import cv2
# 使用OpenCV库的imread函数读取图像,第二个参数0表示以灰度模式读取图像
img = cv2.imread('D:\DIP\char.bmp', 0)
# 将图像的像素值归一化到0到1的范围,因为后续添加噪声的函数可能期望输入在这个范围内
img = img / 255
# 使用scikit-image库的random_noise函数给图像添加高斯噪声,指定均值为0,方差为0.05
img_g = skimage.util.random_noise(img, 'gaussian', mean=0, var=0.05)
# 使用scikit-image库的random_noise函数给图像添加椒盐噪声
img_s = skimage.util.random_noise(img,'salt')
# 创建一个一行三列的子图布局,并定位到第一个子图
plt.subplot(131)
# 显示图像,指定颜色映射为灰度图
plt.imshow(img, 'gray')
# 设置第一个子图的标题为'原图'
plt.title('原图')
# 创建一个一行三列的子图布局,并定位到第二个子图
plt.subplot(132)
# 显示添加高斯噪声后的图像,指定颜色映射为灰度图
plt.imshow(img_g, 'gray')
# 设置第二个子图的标题为'加入高斯噪声后图像'
plt.title('加入高斯噪声后图像')
# 创建一个一行三列的子图布局,并定位到第三个子图
plt.subplot(133)
# 显示添加椒盐噪声后的图像,指定颜色映射为灰度图
plt.imshow(img_s, 'gray')
# 设置第三个子图的标题为'加入椒盐噪声后图像'
plt.title('加入椒盐噪声后图像')
# 显示所有子图
plt.show()

 


一、实验目的
通过编程实践,掌握使用OpenCV和scikit-image库对图像进行基本操作,了解高斯噪声和椒盐噪声的添加方式及对图像的影响。
二、实验原理
1. 图像读取与归一化:利用OpenCV的 imread 函数读取图像,并将像素值从0 - 255归一化到0 - 1,以满足后续添加噪声函数的输入要求。归一化处理使图像数据范围与添加噪声函数期望的输入范围匹配,确保噪声添加的准确性和一致性。
2. 噪声添加:使用scikit - image库的 random_noise 函数,根据不同的噪声类型参数添加高斯噪声和椒盐噪声。高斯噪声是一种符合正态分布的加性噪声,通过指定均值和方差来控制噪声特性,方差越大,噪声越明显;椒盐噪声则是随机将图像中的像素值设置为最大值(盐噪声)或最小值(椒噪声) ,使图像出现黑白相间的噪点。
三、实验步骤
1. 图像读取与预处理:用OpenCV的 imread 函数以灰度模式读取图像,并将其像素值归一化到0 - 1范围。
2. 噪声添加:利用scikit - image库的 random_noise 函数分别为图像添加高斯噪声和椒盐噪声,其中高斯噪声设置均值为0,方差为0.05;椒盐噪声采用默认参数。
3. 图像展示:借助Matplotlib库创建一行三列的子图布局,分别展示原始图像、添加高斯噪声后的图像以及添加椒盐噪声后的图像,并为每个子图添加对应的标题。
四、实验结果
通过实验,成功展示了原始图像以及添加高斯噪声和椒盐噪声后的图像。添加高斯噪声后的图像整体呈现出朦胧的效果,图像细节被一定程度掩盖,画面好像蒙上一层薄雾;添加椒盐噪声后的图像出现大量黑白噪点,随机分布在图像各处,严重干扰了图像的视觉效果和信息表达,使图像内容辨识度降低。
五、实验结论
本次实验成功实现了图像的读取、像素值归一化以及高斯噪声和椒盐噪声的添加,并通过图像展示直观呈现了不同噪声对图像的影响。这有助于理解不同类型噪声的特点和生成方式,为后续研究图像去噪算法以及图像质量提升奠定了基础。 

 

三、高斯滤波器 

import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] #使用黑体
plt.rcParams['axes.unicode_minus'] = False #解决负号显示问题
import cv2
img = cv2.imread('D:\DIP\char.bmp', 0)
# 再次以灰度模式读取相同的图像,存储为变量img_g,后续用于带高斯噪声的相关操作
img_g = cv2.imread('D:\DIP\char-gaosi.bmp', 0)
# 以灰度模式读取相同的图像,存储为变量img_s,后续用于带椒盐噪声的相关操作
img_s = cv2.imread('D:\DIP\char-jiaoyan.bmp', 0)
# 对存储有用于模拟带高斯噪声图像的img_g进行高斯滤波
# 参数(3, 3)表示高斯核的大小(宽度和高度),0表示X方向的高斯核标准差,5表示Y方向的高斯核标准差
img_g_l = cv2.GaussianBlur(img_g, (3, 3), 0, 5)
# 对存储有用于模拟带椒盐噪声图像的img_s进行高斯滤波
# 参数(3, 3)表示高斯核的大小(宽度和高度),0表示X方向的高斯核标准差,5表示Y方向的高斯核标准差
img_s_l = cv2.GaussianBlur(img_s, (3, 3), 0, 5)
# 对存储有用于模拟带高斯噪声图像的img_g进行另一次高斯滤波,这次使用(5, 5)大小的高斯核
# 0表示X方向的高斯核标准差,5表示Y方向的高斯核标准差
img_g_l1 = cv2.GaussianBlur(img_g, (5, 5), 0, 5)
# 对存储有用于模拟带椒盐噪声图像的img_s进行另一次高斯滤波,使用(5, 5)大小的高斯核
# 0表示X方向的高斯核标准差,5表示Y方向的高斯核标准差
img_s_l1 = cv2.GaussianBlur(img_s, (5, 5), 0, 5)
# 创建一个2行3列的子图布局,并定位到第1个子图
plt.subplot(231)
# 显示存储有用于模拟带高斯噪声图像的img_g,设置颜色映射为灰度图
plt.imshow(img_g, 'gray')
# 设置第1个子图的标题为'带高斯噪声图片'
plt.title('带高斯噪声图片')
# 创建一个2行3列的子图布局,并定位到第4个子图
plt.subplot(234)
# 显示存储有用于模拟带椒盐噪声图像的img_s,设置颜色映射为灰度图
plt.imshow(img_s, 'gray')
# 设置第4个子图的标题为'带椒盐噪声图片'
plt.title('带椒盐噪声图片')
# 创建一个2行3列的子图布局,并定位到第2个子图
plt.subplot(232)
# 显示经过(3, 3)高斯核滤波后的存储有用于模拟带高斯噪声图像的img_g_l,设置颜色映射为灰度图
plt.imshow(img_g_l, 'gray')
# 设置第2个子图的标题为'高斯滤波后图像(3*3)'
plt.title('高斯滤波后图像(3*3)')
# 创建一个2行3列的子图布局,并定位到第3个子图
plt.subplot(233)
# 显示经过(5, 5)高斯核滤波后的存储有用于模拟带高斯噪声图像的img_g_l1,设置颜色映射为灰度图
plt.imshow(img_g_l1, 'gray')
# 设置第3个子图的标题为'高斯滤波后图像(5*5)'
plt.title('高斯滤波后图像(5*5)')
# 创建一个2行3列的子图布局,并定位到第5个子图
plt.subplot(235)
# 显示经过(3, 3)高斯核滤波后的存储有用于模拟带椒盐噪声图像的img_s_l,设置颜色映射为灰度图
plt.imshow(img_s_l, 'gray')
# 设置第5个子图的标题为'高斯滤波后图像(3*3)'
plt.title('高斯滤波后图像(3*3)')
# 创建一个2行3列的子图布局,并定位到第6个子图
plt.subplot(236)
# 显示经过(5, 5)高斯核滤波后的存储有用于模拟带椒盐噪声图像的img_s_l1,设置颜色映射为灰度图
plt.imshow(img_s_l1, 'gray')
# 设置第6个子图的标题为'高斯滤波后图像(5*5)'
plt.title('高斯滤波后图像(5*5)')
# 显示所有创建的子图
plt.show()

 


一、实验目的
探究高斯滤波对含高斯噪声和椒盐噪声图像的处理效果,对比不同大小高斯核(3x3和5x5)在滤波中的表现差异。
二、实验原理
高斯滤波是一种线性平滑滤波,通过对邻域内像素进行加权平均来实现去噪。其加权系数基于高斯分布,中心像素权重最高,离中心越远权重越低。高斯核大小和标准差决定了滤波的平滑程度和对噪声的抑制能力。较大的核和标准差会使图像更平滑,但也可能丢失更多细节。
三、实验步骤
1. 图像读取:使用OpenCV的 imread 函数,分别读取含高斯噪声的图像 char-gaosi.bmp 和含椒盐噪声的图像 char-jiaoyan.bmp ,均以灰度模式读取。
2. 高斯滤波:针对含高斯噪声和椒盐噪声的图像,分别使用 cv2.GaussianBlur 函数进行高斯滤波。设置两组不同的高斯核大小(3, 3)和(5, 5) ,X方向标准差为0,Y方向标准差为5。
3. 图像展示:利用Matplotlib创建2行3列的子图布局。依次展示含高斯噪声图像、含椒盐噪声图像,以及不同核大小高斯滤波后的对应图像,并添加清晰的标题标识。
四、实验结果
1. 高斯噪声图像:3x3核滤波后,噪声得到一定抑制,图像细节保留相对较多;5x5核滤波后,噪声抑制效果更明显,但图像变得更模糊,部分细节丢失。
2. 椒盐噪声图像:3x3核滤波对小椒盐噪点有一定去除效果,图像细节基本保留;5x5核滤波虽然能去除更多椒盐噪点,但图像出现过度平滑现象,边缘等细节变得模糊。
五、实验结论
高斯滤波对高斯噪声和椒盐噪声都有去噪能力,但针对不同噪声类型和图像细节需求,应合理选择高斯核大小。处理高斯噪声时,大核在降噪上更有效,但要权衡细节丢失;处理椒盐噪声时,小核更利于保留图像细节,大核则适用于噪声密集需大幅降噪的情况 。 

 

四、中值滤波器 

import matplotlib.pyplot as plt
# 设置matplotlib使用黑体字体,用于正常显示中文
plt.rcParams['font.sans-serif'] = ['SimHei']
# 解决matplotlib中负号显示异常的问题
plt.rcParams['axes.unicode_minus'] = False
import cv2
import matplotlib.pyplot as plt  # 这里重复导入了,可删除这一行,因为前面已导入过
# 使用OpenCV的imread函数以灰度模式读取图像文件,将图像存储在变量img中
img = cv2.imread('D:\DIP\char.bmp', 0)
# 再次以灰度模式读取同一图像文件,存储在变量img_g中,用于模拟带高斯噪声的图像(实际未添加噪声)
img_g = cv2.imread('D:\DIP\char-gaosi.bmp', 0)
# 以灰度模式读取同一图像文件,存储在变量img_s中,用于模拟带椒盐噪声的图像(实际未添加噪声)
img_s = cv2.imread('D:\DIP\char-jiaoyan.bmp', 0)
# 对存储模拟带高斯噪声图像的img_g进行中值滤波,滤波器大小为3x3
img_g_l = cv2.medianBlur(img_g, 3)
# 对存储模拟带椒盐噪声图像的img_s进行中值滤波,滤波器大小为3x3
img_s_l = cv2.medianBlur(img_s, 3)
# 对存储模拟带高斯噪声图像的img_g进行中值滤波,滤波器大小为5x5
img_g_l1 = cv2.medianBlur(img_g, 5)
# 对存储模拟带椒盐噪声图像的img_s进行中值滤波,滤波器大小为5x5
img_s_l1 = cv2.medianBlur(img_s, 5)
# 创建一个2行3列的子图布局,并定位到第1个子图
plt.subplot(231)
# 显示存储模拟带高斯噪声图像的img_g,设置颜色映射为灰度图
plt.imshow(img_g, 'gray')
plt.title('带高斯噪声图片')
# 创建一个2行3列的子图布局,并定位到第4个子图
plt.subplot(234)
# 显示存储模拟带椒盐噪声图像的img_s,设置颜色映射为灰度图
plt.imshow(img_s, 'gray')
plt.title('带椒盐噪声图片')
# 创建一个2行3列的子图布局,并定位到第2个子图
plt.subplot(232)
# 显示经过3x3中值滤波后的存储模拟带高斯噪声图像的img_g_l,设置颜色映射为灰度图
plt.imshow(img_g_l, 'gray')
plt.title('中值滤波后图像(3*3)')
# 创建一个2行3列的子图布局,并定位到第3个子图
plt.subplot(233)
# 显示经过5x5中值滤波后的存储模拟带高斯噪声图像的img_g_l1,设置颜色映射为灰度图
plt.imshow(img_g_l1, 'gray')
plt.title('中值滤波后图像(5*5)')
# 创建一个2行3列的子图布局,并定位到第5个子图
plt.subplot(235)
# 显示经过3x3中值滤波后的存储模拟带椒盐噪声图像的img_s_l,设置颜色映射为灰度图
plt.imshow(img_s_l, 'gray')
plt.title('中值滤波后图像(3*3)')
# 创建一个2行3列的子图布局,并定位到第6个子图
plt.subplot(236)
# 显示经过5x5中值滤波后的存储模拟带椒盐噪声图像的img_s_l1,设置颜色映射为灰度图
plt.imshow(img_s_l1, 'gray')
plt.title('中值滤波后图像(5*5)')
# 显示所有创建的子图
plt.show()

 


一、实验目的
探究中值滤波对含高斯噪声和椒盐噪声图像的处理效果,对比不同滤波核大小(3x3和5x5)在去噪过程中的表现差异。
二、实验原理
中值滤波是一种非线性滤波方法,它将图像中每个像素点的灰度值用其邻域像素灰度值的中值替代。这种方法能有效抑制脉冲噪声(如椒盐噪声),同时较好地保留图像边缘和细节信息。滤波核大小决定了参与中值计算的邻域范围,不同大小的滤波核对图像的平滑和去噪效果有显著影响。
三、实验步骤
1. 图像读取:利用OpenCV的 imread 函数,以灰度模式读取含高斯噪声的图像 char-gaosi.bmp 和含椒盐噪声的图像 char-jiaoyan.bmp 。
2. 中值滤波:针对含高斯噪声和椒盐噪声的图像,分别使用 cv2.medianBlur 函数进行中值滤波操作。设置两组不同的滤波核大小,即3x3和5x5 。
3. 图像展示:借助Matplotlib创建2行3列的子图布局,依次展示含高斯噪声图像、含椒盐噪声图像,以及不同核大小中值滤波后的对应图像,并为每个子图添加准确的标题描述。
四、实验结果
1. 高斯噪声图像:3x3核的中值滤波对高斯噪声有一定的抑制作用,图像细节保持相对较好;5x5核的中值滤波虽然能进一步降低噪声,但图像出现了一定程度的模糊,部分细节丢失。
2. 椒盐噪声图像:3x3核的中值滤波能有效去除较小的椒盐噪点,图像细节基本得以保留;5x5核的中值滤波在去除较大噪点方面表现出色,但图像出现了过度平滑的现象,边缘等关键细节变得模糊。
五、实验结论
中值滤波在处理椒盐噪声时效果显著,能在有效去除噪声的同时较好地保留图像细节。对于高斯噪声,中值滤波也有一定的去噪能力,但效果不如处理椒盐噪声明显。在选择滤波核大小时,需根据噪声类型和图像细节保留需求进行权衡。较小的核(3x3)适用于保留图像细节,处理轻微噪声;较大的核(5x5)更适合去除大噪点,但可能导致图像过度平滑。 

五 、空域锐化滤波器

import matplotlib.pyplot as plt
# 设置matplotlib使用黑体字体,用于正常显示中文
plt.rcParams['font.sans-serif'] = ['SimHei']
# 解决matplotlib中负号显示异常的问题
plt.rcParams['axes.unicode_minus'] = False
import cv2
import matplotlib.pyplot as plt  # 这里重复导入了,实际保留一个即可
import numpy as np
# 使用OpenCV的imread函数以灰度模式读取图像文件,将图像存储在变量img中
img = cv2.imread('D:\DIP\char.bmp', 0)
# Roberts算子部分
# 定义Roberts算子在x方向的卷积核
Robertx = np.array([[-1, 0], [0, 1]])
# 定义Roberts算子在y方向的卷积核
Roberty = np.array([[0, -1], [1, 0]])
# 使用cv2.filter2D函数对图像进行卷积操作,计算图像在x方向的边缘响应,-1表示输出图像的深度与输入相同
img_x = cv2.filter2D(img, -1, Robertx)
# 使用cv2.filter2D函数对图像进行卷积操作,计算图像在y方向的边缘响应,-1表示输出图像的深度与输入相同
img_y = cv2.filter2D(img, -1, Roberty)
# 将x方向和y方向的边缘响应的绝对值相加,得到最终的边缘图像
img_r = abs(img_x) + abs(img_y)
# Prewitt算子部分
# 定义Prewitt算子在x方向的卷积核
Prewittx = np.array([[1, 1, 1], [0, 0, 0], [-1, -1, -1]])
# 定义Prewitt算子在y方向的卷积核
Prewitty = np.array([[-1, 0, 1], [-1, 0, 1], [-1, 0, 1]])
# 使用cv2.filter2D函数对图像进行卷积操作,计算图像在x方向的边缘响应,-1表示输出图像的深度与输入相同
img_x = cv2.filter2D(img, -1, Prewittx)
# 使用cv2.filter2D函数对图像进行卷积操作,计算图像在y方向的边缘响应,-1表示输出图像的深度与输入相同
img_y = cv2.filter2D(img, -1, Prewitty)
# 将x方向和y方向的边缘响应的绝对值相加,得到最终的边缘图像
img_p = abs(img_x) + abs(img_y)
# Sobel算子部分
# 使用cv2.Sobel函数对图像进行Sobel边缘检测,-1表示输出图像的深度与输入相同,1, 1分别表示在x和y方向上的导数阶数
img_s = cv2.Sobel(img, -1, 1, 1)
# 创建一个1行4列的子图布局,并定位到第1个子图
plt.subplot(141)
# 显示原始图像,设置颜色映射为灰度图
plt.imshow(img, 'gray')
# 设置第1个子图的标题为'原图'
plt.title('原图')
# 创建一个1行4列的子图布局,并定位到第2个子图
plt.subplot(142)
# 显示使用Roberts算子滤波后的图像,设置颜色映射为灰度图
plt.imshow(img_r, 'gray')
# 设置第2个子图的标题为'Roberts 算子滤波后图'
plt.title('Roberts 算子滤波后图')
# 创建一个1行4列的子图布局,并定位到第3个子图
plt.subplot(143)
# 显示使用Prewitt算子滤波后的图像,设置颜色映射为灰度图
plt.imshow(img_p, 'gray')
# 设置第3个子图的标题为'Prewitt 算子滤波后图'
plt.title('Prewitt 算子滤波后图')
# 创建一个1行4列的子图布局,并定位到第4个子图
plt.subplot(144)
# 显示使用Sobel算子滤波后的图像,设置颜色映射为灰度图
plt.imshow(img_s, 'gray')
# 设置第4个子图的标题为'Sobel 算子滤波后图'
plt.title('Sobel 算子滤波后图')
# 显示所有创建的子图
plt.show()

 


一、实验目的
比较Roberts、Prewitt和Sobel三种算子对图像的边缘检测效果,了解不同算子在提取图像边缘特征时的特点和差异。
二、实验原理
1. Roberts算子:通过2x2的卷积核分别在x和y方向上计算梯度近似值,基于对角方向相邻像素灰度值之差来检测边缘,对具有陡峭边缘且噪声较少的图像有较好效果。
2. Prewitt算子:利用3x3的卷积核在x和y方向上计算梯度,它考虑了中心像素周围邻域像素的灰度变化,对灰度渐变和噪声较多的图像表现较好。
3. Sobel算子:同样使用3x3的卷积核,在计算梯度时不仅考虑邻域像素灰度差,还对中心像素周围的像素进行加权,增强了对噪声的抑制能力,能检测出更连续和平滑的边缘。
三、实验步骤
1. 图像读取:利用OpenCV的 imread 函数以灰度模式读取图像 char.bmp 。
2. 边缘检测:
- Roberts算子:定义x和y方向的卷积核,使用 cv2.filter2D 函数进行卷积操作,分别计算x和y方向的边缘响应,将两者绝对值相加得到最终边缘图像。
- Prewitt算子:定义x和y方向的3x3卷积核,通过 cv2.filter2D 计算边缘响应并相加得到边缘图像。
- Sobel算子:直接使用 cv2.Sobel 函数对图像进行边缘检测,指定x和y方向的导数阶数。
3. 图像展示:借助Matplotlib创建1行4列的子图布局,依次展示原始图像、Roberts算子检测结果、Prewitt算子检测结果和Sobel算子检测结果,并添加对应标题。
四、实验结果
1. Roberts算子:检测出的边缘较为粗糙,对细节的捕捉能力有限,在图像边缘处表现为一些离散的像素点,能大致勾勒出物体轮廓,但边缘连续性较差。
2. Prewitt算子:检测到的边缘比Roberts算子更连续,对噪声的容忍度稍高,图像中的一些小细节也能被较好地保留,整体边缘效果相对平滑。
3. Sobel算子:检测出的边缘最为连续和平滑,能清晰地描绘出物体的轮廓,同时对噪声的抑制效果明显,在图像中产生的伪边缘较少,图像边缘更符合人眼视觉感受。
五、实验结论
不同的边缘检测算子各有特点。Roberts算子简单快速,但对噪声敏感,边缘检测结果较粗糙;Prewitt算子在噪声处理和边缘连续性上优于Roberts算子;Sobel算子综合性能较好,在抑制噪声的同时能检测出清晰连续的边缘,更适用于实际应用场景。在选择边缘检测算子时,需根据图像特点和具体需求进行权衡。 

六、任务一 

写一个程序,分别对一副被均匀噪声和椒盐噪声污染的图像,用均值滤波,高斯滤波和中值滤波处理,对比分析结果,用python

对于均匀噪声:
均值滤波:能一定程度平滑噪声,但图像细节有损失。
高斯滤波:对噪声有较好抑制,相比均值滤波,边缘保留较好。
中值滤波:对均匀噪声效果一般,会模糊图像细节。
 
对于椒盐噪声:
均值滤波:效果较差,噪声点依然明显,且图像变模糊。
高斯滤波:效果也不理想,不能有效去除椒盐噪声点。
中值滤波:效果最好,能有效去除椒盐噪声,同时较好保留图像细节。
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] #使用黑体
plt.rcParams['axes.unicode_minus'] = False #解决负号显示问题
import cv2
import numpy as np
from skimage.util import random_noise

# 读取图像并转换为float类型,归一化像素值到[0, 1]
img = cv2.imread('D:\DIP\char.bmp', 0).astype(float) / 255

# 添加均匀噪声
# 使用numpy生成均匀分布的噪声
noise_uniform = np.random.uniform(-0.1, 0.1, img.shape)  # 调整噪声范围
img_uniform = img + noise_uniform
img_uniform = np.clip(img_uniform, 0, 1)

# 添加椒盐噪声
img_salt = random_noise(img, mode='salt')

# 均值滤波
mean_filter_uniform = cv2.blur(img_uniform, (3, 3))
mean_filter_salt = cv2.blur(img_salt, (3, 3))

# 高斯滤波
gaussian_filter_uniform = cv2.GaussianBlur(img_uniform, (3, 3), 0)
gaussian_filter_salt = cv2.GaussianBlur(img_salt, (3, 3), 0)

# 中值滤波
median_filter_uniform = cv2.medianBlur((img_uniform * 255).astype(np.uint8), 3) / 255
median_filter_salt = cv2.medianBlur((img_salt * 255).astype(np.uint8), 3) / 255

# 展示结果
plt.figure(figsize=(15, 10))

# 均匀噪声
plt.subplot(2, 4, 1)
plt.imshow(img_uniform, cmap='gray')
plt.title('均匀噪声污染图像')

plt.subplot(2, 4, 2)
plt.imshow(mean_filter_uniform, cmap='gray')
plt.title('均值滤波处理均匀噪声图像')

plt.subplot(2, 4, 3)
plt.imshow(gaussian_filter_uniform, cmap='gray')
plt.title('高斯滤波处理均匀噪声图像')

plt.subplot(2, 4, 4)
plt.imshow(median_filter_uniform, cmap='gray')
plt.title('中值滤波处理均匀噪声图像')

# 椒盐噪声
plt.subplot(2, 4, 5)
plt.imshow(img_salt, cmap='gray')
plt.title('椒盐噪声污染图像')

plt.subplot(2, 4, 6)
plt.imshow(mean_filter_salt, cmap='gray')
plt.title('均值滤波处理椒盐噪声图像')

plt.subplot(2, 4, 7)
plt.imshow(gaussian_filter_salt, cmap='gray')
plt.title('高斯滤波处理椒盐噪声图像')

plt.subplot(2, 4, 8)
plt.imshow(median_filter_salt, cmap='gray')
plt.title('中值滤波处理椒盐噪声图像')

plt.tight_layout()
plt.show()

 


一、实验目的
对比均值滤波、高斯滤波和中值滤波三种方法对均匀噪声和椒盐噪声的去噪效果,分析不同滤波器针对不同噪声类型的适用性。
二、实验原理
噪声添加
1. 均匀噪声:借助 numpy 的 random.uniform 函数生成取值在-0.1到0.1间均匀分布的噪声,将其与原始图像叠加,模拟均匀噪声污染的图像。
2. 椒盐噪声:利用 skimage.util 库的 random_noise 函数,按 salt 模式添加椒盐噪声,随机使部分像素变为最大值(盐噪声) 。
滤波原理
1. 均值滤波:通过计算滤波器窗口内像素的平均值替换中心像素值,实现图像平滑去噪,对服从均匀分布的噪声有一定抑制作用。
2. 高斯滤波:依据高斯分布对邻域像素加权平均,中心像素权重高,离中心越远权重越低,能有效抑制高斯分布噪声,同时保留图像边缘。
3. 中值滤波:将滤波器窗口内像素值排序,用中值替换中心像素值,对脉冲噪声(如椒盐噪声)抑制效果好,且能保留图像边缘和细节。
三、实验步骤
1. 图像读取与噪声添加:用OpenCV读取图像,转为浮点数类型并归一化到[0, 1] ,分别添加均匀噪声和椒盐噪声。
2. 滤波处理:对含均匀噪声和椒盐噪声的图像,分别使用OpenCV的 cv2.blur (均值滤波)、 cv2.GaussianBlur (高斯滤波)和 cv2.medianBlur (中值滤波)函数处理。中值滤波因要求输入为整数类型,先将图像像素值乘255转为 np.uint8 类型,处理后再归一化。
3. 图像展示:用Matplotlib创建2行4列的图像展示布局,分别呈现均匀噪声污染图像及其三种滤波结果,以及椒盐噪声污染图像及其三种滤波结果,并添加对应标题。
四、实验结果
均匀噪声
均值滤波和高斯滤波有效抑制均匀噪声,图像变得平滑,但均值滤波使图像细节损失较多,更模糊;高斯滤波较好保留边缘和部分细节。中值滤波对均匀噪声处理效果较弱,图像残留噪声点。
椒盐噪声
均值滤波和高斯滤波对椒盐噪声去除效果有限,处理后图像仍有大量明显噪点,且变得模糊,边缘和细节严重丢失。中值滤波显著去除椒盐噪声,有效保留图像边缘和细节,视觉效果最佳。
五、实验结论
不同滤波器对不同类型噪声处理效果不同。均值滤波和高斯滤波处理均匀噪声表现较好,高斯滤波在保留图像细节上更优;中值滤波是处理椒盐噪声的最佳选择,能有效去噪并最大程度保留图像原有特征。实际应用中,需依据图像噪声类型和特点合理选择滤波器,以获最佳去噪效果。 

七、任务二 

不使用matpolot库,仅使用OpenCV库,来编写均值滤波器和中值滤波器的底层实现代码。对比分析matplot方法与opencv方法的优缺点。

 Matplotlib方法和OpenCV方法的优缺点对比分析
 Matplotlib方法:
 优点:
 1. 具有丰富的绘图功能,可视化效果好,能方便地绘制各种图表、曲线,对于数据的可视化展示很强大。
 2. 有多种颜色映射、样式等自定义选项,便于生成高质量的可视化结果。
 缺点:
 1. 对于图像滤波等操作并非其主要功能,处理速度相对较慢,底层实现较为复杂。
 2. 不是专门的图像和视频处理库,在处理图像的效率和灵活性上不如OpenCV。
 OpenCV方法:
 优点:
 1. 是专门为计算机视觉任务设计的库,处理图像和视频的速度非常快,底层经过优化。
 2. 提供了丰富的图像滤波、特征提取、目标检测等函数,对于图像处理的功能非常全面。
 3. 支持多种编程语言,有广泛的社区支持和大量的文档资源。
 缺点:
 1. 可视化功能相对较弱,主要侧重于图像的处理和分析,在绘制复杂图表等方面不如Matplotlib。
 2. 对于初学者来说,部分函数的使用可能需要一定的学习成本,尤其是一些高级的计算机视觉算法。
import cv2
import numpy as np

# 均值滤波器
def mean_filter(image, kernel_size):
    h, w = image.shape[:2]
    k_h, k_w = kernel_size
    pad_h = k_h // 2
    pad_w = k_w // 2
    padded_image = cv2.copyMakeBorder(image, pad_h, pad_h, pad_w, pad_w, cv2.BORDER_REPLICATE)
    filtered_image = np.zeros_like(image)

    for y in range(h):
        for x in range(w):
            roi = padded_image[y:y + k_h, x:x + k_w]
            filtered_image[y, x] = np.mean(roi)

    return filtered_image.astype(np.uint8)

# 中值滤波器
def median_filter(image, kernel_size):
    h, w = image.shape[:2]
    k_h, k_w = kernel_size
    pad_h = k_h // 2
    pad_w = k_w // 2
    padded_image = cv2.copyMakeBorder(image, pad_h, pad_h, pad_w, pad_w, cv2.BORDER_REPLICATE)
    filtered_image = np.zeros_like(image)

    for y in range(h):
        for x in range(w):
            roi = padded_image[y:y + k_h, x:x + k_w]
            filtered_image[y, x] = np.median(roi)

    return filtered_image.astype(np.uint8)

# 读取图像
image = cv2.imread('D:\DIP\char-gaosi.bmp', cv2.IMREAD_GRAYSCALE)

# 应用均值滤波器
mean_filtered = mean_filter(image, (3, 3))

# 应用中值滤波器
median_filtered = median_filter(image, (3, 3))

# 水平拼接原始图像和均值滤波后的图像
h_concat_1 = cv2.hconcat([image, mean_filtered])

# 水平拼接原始图像和中值滤波后的图像
h_concat_2 = cv2.hconcat([image, median_filtered])

# 垂直拼接上述两个水平拼接的结果
v_concat = cv2.vconcat([h_concat_1, h_concat_2])

# 缩小图像
scale_percent = 50  # 缩小比例,这里设置为50%,可根据需要调整
width = int(v_concat.shape[1] * scale_percent / 100)
height = int(v_concat.shape[0] * scale_percent / 100)
dim = (width, height)
resized = cv2.resize(v_concat, dim, interpolation=cv2.INTER_AREA)

# 显示结果
cv2.imshow('Original, Mean Filtered and Median Filtered Images', resized)
cv2.waitKey(0)
cv2.destroyAllWindows()

 


一、实验目的
通过自定义实现均值滤波器和中值滤波器,对含噪声图像进行滤波处理,对比两种滤波器的去噪效果,加深对图像滤波原理和方法的理解。
二、实验原理
1. 均值滤波:均值滤波是一种线性滤波方法。在处理图像时,它以每个像素为中心,取一个大小为  kernel_size  的邻域,计算该邻域内所有像素的灰度平均值,并将此平均值赋给中心像素,以此达到平滑图像、去除噪声的目的。由于其简单地对邻域像素进行平均操作,对高斯噪声有一定的抑制作用,但可能会使图像边缘变得模糊。
2. 中值滤波:中值滤波属于非线性滤波方法。同样以每个像素为中心选取一个邻域,将邻域内的像素灰度值进行排序,取其中值作为中心像素的新灰度值。这种方法对于椒盐噪声等脉冲噪声有很好的抑制效果,因为它能有效避免噪声点对滤波结果的影响,同时较好地保留图像的边缘和细节信息。
三、实验步骤
1. 函数实现:分别编写  mean_filter  函数和  median_filter  函数实现均值滤波和中值滤波。函数先对图像进行边界填充,然后遍历图像的每个像素,计算邻域内像素的均值或中值,得到滤波后的图像。
2. 图像读取:使用OpenCV的  cv2.imread  函数以灰度模式读取含高斯噪声的图像  char-gaosi.bmp 。
3. 滤波处理:调用上述实现的  mean_filter  函数和  median_filter  函数,分别对读取的图像进行均值滤波和中值滤波,滤波器核大小设置为  (3, 3) 。
4. 图像拼接与缩放:将原始图像与均值滤波后的图像进行水平拼接,再将原始图像与中值滤波后的图像进行水平拼接,最后将这两个水平拼接结果进行垂直拼接。为方便显示,将拼接后的图像缩小为原来的50%。
5. 结果展示:使用OpenCV的  cv2.imshow  函数显示拼接并缩小后的图像,通过  cv2.waitKey(0)  等待按键输入,最后使用  cv2.destroyAllWindows()  关闭显示窗口。
四、实验结果
从拼接展示的图像可以直观地看出,均值滤波对高斯噪声有一定的平滑效果,图像整体变得较为模糊,噪声点的影响有所减弱,但图像的边缘和细节也在一定程度上被模糊。中值滤波对高斯噪声的处理效果相对均值滤波不那么明显,图像的噪声点仍然存在一些,但图像的边缘和细节保留得相对较好,没有像均值滤波那样出现明显的模糊现象。
五、实验结论
均值滤波和中值滤波在处理含噪声图像时各有特点。均值滤波对于高斯噪声有一定的抑制作用,但会牺牲图像的边缘和细节;中值滤波对于椒盐噪声等脉冲噪声效果显著,在处理高斯噪声时虽然去噪效果不如对脉冲噪声明显,但能较好地保留图像的边缘和细节。在实际应用中,应根据噪声的类型和图像的具体需求选择合适的滤波方法。 

 

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐