目录
1 概念讲解及用处
非线性滤波器的原始数据与滤波结果是一种逻辑关系,即用逻辑运算实现,如最大值滤波器、最小值滤波器、中值滤波器等,是通过比较一定邻域内的灰度值大小来实现的,没有固定的模板,因而也就没有特定的转移函数(因为没有模板作傅里叶变换),另外,膨胀和腐蚀也是通过最大值、最小值滤波器实现的。
中值滤波是一种常见的图像处理技术,用于去除图像中的椒盐噪声或其他类型的噪声。它的基本思想是将每个像素点的灰度值替换为该像素周围邻域内的中值。中值滤波可以有效地平滑图像,并且在保持边缘细节的同时去除噪声。
2 函数详解
在OpenCV中,中值滤波可以通过medianBlur()函数来实现。函数的定义如下:
void medianBlur(InputArray src, OutputArray dst, int ksize);
src:输入图像,可以是单通道或多通道图像。
dst:输出图像,与输入图像具有相同的大小和类型。
ksize:滤波模板的尺寸,必须是正奇数(例如3、5、7等)。
3 数学原理
中值滤波的数学原理很简单,就是将像素点周围邻域内的像素值进行排序,然后选取其中的中值作为该像素点的新值。
设待滤波像素点周围邻域内共有(2N+1)×(2N+1)个像素点,我们将这些像素点的灰度值按升序排列,然后取中间的值作为该像素点的新灰度值。
将其邻域设置为3×3大小,对其3×3邻域内像素点的像素值进行排序(升序降序均可),按升序排序后得到序列值为:[66,78,90,91,93,94,95,97,101]。在该序列中,处于中心位置(也叫中心点或中值点)的值是“93”,因此用该值替换原来的像素值 78,作为当前点的新像素值
优点:噪声成分很难被选上,所以可以在几乎不影响原有图像的情况下去除全部噪声 缺点:需要进行排序等操作,中值滤波需要的运算量较大
4 用C++编写代码进行实现
下面是使用OpenCV中medianBlur()函数进行中值滤波的示例代码:
#include <opencv2/opencv.hpp>
int main()
{
cv::Mat srcImage = cv::imread("sp_noise.png", cv::IMREAD_COLOR);
if (srcImage.empty())
{
std::cout << "Failed to read image!" << std::endl;
return -1;
}
cv::Mat dstImage;
int ksize = 3; // 滤波模板尺寸,必须是正奇数
cv::medianBlur(srcImage, dstImage, ksize);
cv::imshow("Original Image", srcImage);
cv::imshow("Median Filtered Image", dstImage);
cv::waitKey(0);
return 0;
}
在代码中,我们首先读入待处理的图像input.jpg,然后定义了滤波模板的尺寸ksize为3。接着调用medianBlur()函数对图像进行中值滤波,并将结果显示出来。最后通过cv::waitKey(0)等待按键,使窗口保持显示状态。