opencv 中值滤波

中值滤波是一种常用的图像滤波算法,是在像素点周围进行多个点的中值滤波,将点的灰度值根据其周围像素点的灰度值进行平均,并使这些点的灰度值具有相似性,以达到平滑去噪的目的。中值滤波在图像处理中应用广泛,在图像滤波和图像增强处理中得到了广泛应用。 中值滤波的原理如下: (1)中值滤波是一种通过计算灰度图像各像素灰度值的均值来实现去噪的算法。它采用灰度均值来代替灰度方差,在保证灰度图像的基本信息不变的同时,滤除噪声。中值滤波的实质是通过对图像进行局部统计和分析,从而确定最佳平滑窗口大小和最佳方向。 (2)中值滤波在图像处理中,利用灰度均值来代替灰度方差是最为简单的一种方法。该算法虽然简单易用,但其对噪声抑制效果不佳。而利用灰度均值来代替灰度方差,其优点在于可以滤除噪声,保留细节信息。 (3)中值滤波是对一个点进行多个点的中值计算,然后根据这个点周围像素点的灰度值进行平均来达到去噪目的。

  • 1、算法思想

    中值滤波是一种基于统计分析的图像处理技术,其基本思想是利用灰度均值代替灰度方差进行图像去噪。它的基本原理是在灰度值空间中,将图像分成若干个相等大小的窗口,并在每个窗口内计算每个像素点的灰度值与邻域窗口中该像素点的灰度值之比,将这一比值作为该像素点的一个灰度特征向量,然后对这一特征向量进行中值滤波,并将其与邻域窗口中所有像素点的灰度值之比加权平均,得到平滑后的图像。 在滤波过程中,往往是在需要滤除噪声的区域内加入噪声,以达到更好的滤波效果。这样在不需要滤除噪声区域内就会出现一些灰度特征不明显、噪声较多的像素点,从而影响图像质量。因此,中值滤波算法不仅具有滤除噪声能力,而且具有良好的边缘保持能力。

  • 2、算法流程

    (1)图像的灰度化:对于每一个像素,其灰度(灰度值)都用一个亮度(亮度值)来描述,并用一个最大亮度(最大值)、最小亮度(最小值)和中值来表示。 (2)求灰度值的均值:对于每一个像素点,用其周围相邻的几个像素点的灰度值与该像素点的灰度值之差计算均值。 (3)确定中值:通过对均值的比较,确定哪几个像素点作为当前像素点。 (4)选择平滑窗口:为了抑制噪声,可根据图像的灰度特征和噪声的特点选择适当大小的平滑窗口。 (5)计算平均值:将当前像素点与其他相邻像素点进行比较,如果当前像素点与其他相邻像素点的灰度相近,则该像素点作为当前像素点。 (6)输出结果:将所得到的中值作为输出结果。 (7)参数设置:设置平滑窗口大小为几,使平滑窗口内所有像素均能获得平滑效果,从而达到去除噪声的目的。

  • 3、窗口大小

    窗口大小决定了窗口中像素点的多少,也就是决定了滤波处理的效果。窗口太大,则在滤波过程中,由于噪声点被淹没而使滤波效果变差;而窗口太小,则噪声点被淹没而使滤波效果变差。因此,选择合适的窗口大小是很重要的。 常用的中值滤波窗口大小选择原则是:以图像像素为单位,相邻两个像素的中值之差不能超过该像素灰度值的一半。 一般情况下,对于小图像窗口选取小一些;对于大图像窗口选取大一些。例如:对于300×300的图像,可以选择: (1)当窗口大小为4时,对噪声点最多处理50个像素;

  • 4、阈值设置

    中值滤波是一种简单、有效的图像滤波算法。它具有以下优点: (1)有效抑制噪声,保留图像细节,对灰度图像的滤波效果较好。 (2)保持了图像的边缘和轮廓,消除了由于图像灰度值突变造成的斑点。 (3)对噪声具有很强的鲁棒性,一般情况下,噪声较多时,滤波效果好。 (4)避免了对图像进行拉伸处理,避免了图像拉伸后产生的条纹和斑点现象。 (5)可以得到良好的滤波效果,能够保持图像中的边缘、纹理、形状等信息。如果需要对图像进行增强处理,那么可以在中值滤波前增加一步中值增强处理,以达到更好的增强效果。 (6)可以对多幅图像进行中值滤波,并能自动设置阈值。这是中值滤波中最重要的参数之一。 (7)中值滤波算法简单、易于实现、计算量较小,因此在实时处理和实时成像等方面得到了广泛应用。 (8)算法处理速度快,运算速度较快,适合于实时处理。

  • 5、中值计算

    中值滤波是一种常用的图像处理技术,它在一定程度上有效地抑制了噪声,但是噪声可能会被保留下来。为了消除噪声,人们设计出了许多中值滤波的方法,常见的方法有平均法、中值平均法和自适应中值法等。这些方法在一定程度上都可以实现对图像的平滑去噪,但其效果并不是很理想。 为了获得较好的效果,人们在中值滤波方法中引入了一个参数—加权中值,它反映了对图像进行处理时所需要的信息。加权中值就是在像素点周围选取若干个点,对这些点计算它们的均值。其计算公式为: 其中:i是像素点;s是一个与i相邻的点,它与i的距离为h (s); h (s)代表第k个像素点的均值; a、b、c分别代表第k个像素点i的均值、j、k。 中值滤波算法最大的优点是它可以平滑噪声,提高图像质量,而且滤波结果清晰稳定,在一定程度上减少了噪声对后续处理所造成的干扰。

  • 6、平滑处理

    在图像处理中,通常采用中值滤波对图像进行平滑处理。中值滤波是一种基本的图像平滑技术,它能在保持图像特征的同时,消除由于噪声引起的干扰。它主要用于解决图像噪声、边缘模糊、纹理失真等问题。 (1)平滑窗口大小。传统中值滤波采用窗口大小固定的方法,它在处理过程中以一定的规律不断地改变窗口大小,当窗口大小与噪声强度成比例时,才能达到最好的去噪效果。而中值滤波则采用固定窗口大小,它在处理过程中不考虑噪声强度的影响,从而能够获得最好的去噪效果。 (2)滤波方向。传统中值滤波一般采用顺时针或逆时针方向进行滤波处理,而中值滤波则可根据图像中噪声所处位置进行选择,从而更有效地滤除噪声。

  • 7、输出结果

    (1)算法的执行过程中,需要考虑到像素值是否均匀,否则会出现局部峰值。当存在局部峰值时,可以判断出图像中可能存在的噪声点。对于灰度图像,通常不需要对其进行中值滤波处理,因为图像的灰度分布不均匀,也很难找出噪声点。但是对于彩色图像来说,如果像素值分布均匀的话,可以直接判断出图像中存在的噪声点。 (2)算法输出结果主要有三种情况: 第一种情况是直接输出结果(即中值滤波后): 第二种情况是在输出结果后进行中值滤波再输出结果,即将中滤波窗口作为原窗口的一部分进行处理。这种方法对噪声抑制的效果非常好。 这种方法虽然没有第一种方法处理效果好,但它有一个好处就是能对噪声起到很好的抑制作用。 (3)算法中通常会涉及到滤波窗口大小的选取,一般选取小窗口即可,即保证了对噪声抑制效果又能达到较好的图像质量。但是如果窗口太小,可能导致图像细节被破坏;如果窗口太大,又容易导致信息丢失。

以下是常用的OpenCV中值滤波代码:

1. 对灰度图像进行中值滤波
```python
import cv2
# 读取灰度图像
img = cv2.imread('image.jpg', 0)
# 中值滤波
img_median = cv2.medianBlur(img, 5)
# 显示原图和中值滤波后的图像
cv2.imshow('Original Image', img)
cv2.imshow('Median Filtered Image', img_median)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
2. 对彩色图像进行中值滤波
```python
import cv2
# 读取彩色图像
img = cv2.imread('image.jpg')
# 中值滤波
img_median = cv2.medianBlur(img, 5)
# 显示原图和中值滤波后的图像
cv2.imshow('Original Image', img)
cv2.imshow('Median Filtered Image', img_median)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
3. 对视频进行实时中值滤波
```python
import cv2
# 打开摄像头
cap = cv2.VideoCapture(0)
while True:
# 读取视频帧
ret, frame = cap.read()
# 中值滤波
frame_median = cv2.medianBlur(frame, 5)
# 显示原视频和中值滤波后的视频
cv2.imshow('Original Video', frame)
cv2.imshow('Median Filtered Video', frame_median)
# 按下q键退出循环
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# 释放摄像头并关闭所有窗口
cap.release()
cv2.destroyAllWindows()
```

猜你喜欢

转载自blog.csdn.net/qq_42751978/article/details/130790557