在OpenCV里实现中值平滑

图像去噪是进行数字图像处理的一个基本环节,而中值滤波是基于排序统计理论的一种能有效抑制噪声的非线性信号处理技术,其基本原理是把数字图像或数字序列中一点的值用该点的一个邻域中各点值的中值代替,让周围的像素值接近真实值,从而消除孤立的噪声点。中值滤波是一种典型的非线性滤波,是基于排序统计理论的一种能够有效抑制噪声的非线性信号处理技术,基本思想是用像素点邻域灰度值的中值来代替该像素点的灰度值,让周围的像素值接近真实的值从而消除孤立的噪声点。该方法在取出脉冲噪声、椒盐噪声的同时能保留图像的边缘细节。这些优良特性是线性滤波所不具备的。中值滤波对消除椒盐噪声非常有效,能够克服线性滤波器带来的图像细节模糊等弊端,能够有效保护图像边缘信息,是非常经典的平滑噪声处理方法。在光学测量条纹图像的香味分析处理方法中有特殊作用,但在条纹中心分析方法中作用不大。

中值滤波相较于线性滤波中的均值滤波优点在前面已经提到,取得良好滤波效果的代价就是耗时的提升,可能达到均值滤波的数倍,而且对于细节较多的图像也不太适用。

 

计算图像的中值,就如下图所示:

在OpenCV里实现中值平滑_第1张图片

从给出一定大小的窗口里,取出所有像素,然后进行排序,再取中间的值。因为这样做要进行排序,所以计算量非常大。演示的代码如下:

#python 3.7.4,opencv4.1
#蔡军生 https://blog.csdn.net/caimouse/article/details/51749579
#
import cv2
import numpy as np

#图片的路径
imgname = "gauss1.jpg"

#读取图片
image = cv2.imread(imgname, cv2.IMREAD_GRAYSCALE)

#图片的高度和宽度
h,w = image.shape[:2]
print('imagesize={}-{}'.format(w,h))

#显示原图
cv2.imshow("Image",image)

#平滑
out = cv2.medianBlur(image,5)
out = out.astype(np.uint8)
cv2.imshow("out",out)


cv2.waitKey(0)
cv2.destroyAllWindows()

结果输出如下:

在OpenCV里实现中值平滑_第2张图片

输入图片

在OpenCV里实现中值平滑_第3张图片

输出图片

在这里使用cv2.medianBlur函数,它实现了中值平滑,定义如下:

dst=cv.medianBlur(src, ksize[, dst])

src  输入矩阵

dst 输出矩阵,其大小和数据类型与src相同

ksize 若为大于1的奇数,则窗口的大小为ksize X ksize

https://blog.csdn.net/caimouse/article/details/51749579

你可能感兴趣的:(opencv,OpenCV)