您的位置:首页 > 运维架构

opencv中常用的非线性滤波器--中值滤波medianBlur() 和 双边滤波bilateralFilter()

2017-07-06 22:42 246 查看
1.1 中值滤波

中值滤波的原理很简单,就是用像素点邻域灰度值的中值来代替该像素点的灰度。由于中值滤波是基于排序统计理论,所以其对脉冲噪声、椒盐噪声会有很好的滤波效果,并能保留图像的边缘细节。但是代价就是效率低,花费的时间是均值滤波的5倍以上。

opencv中对应的函数为medianBlur(), 下面分别利用高斯滤波和中值滤波对衣服有椒盐噪声的图片进行滤波。

1.2 源代码及滤波效果

#include<opencv.hpp>
#include<iostream>

int main(void)
{
cv::Mat src = cv::imread("d:/Opencv Picture/Lena1.png", CV_LOAD_IMAGE_GRAYSCALE);

if (!src.data)
{
std::cout << "image read error!!!\n";
}
cv::imshow("src", src);

//Gaussian Filter
cv::Mat GaussianFilterResult;
cv::GaussianBlur(src, GaussianFilterResult, cv::Size(7, 7), 2, 2);
cv::imshow("GaussianBlur result", GaussianFilterResult);

//medianFilter
cv::Mat medianFilterResult;
cv::medianBlur(src, medianFilterResult, 7);
cv::imshow("medianBlur result", medianFilterResult);

cvWaitKey(0);

return 0;
}




2.1 双边滤波

双边滤波中双边的意思是同时考虑两条边(因素),这两条边分别是空间域和值域。这里的空间域是指考虑空间位置关系,根据距离核心位置的距离的远近给予不同的加权值,原理和高斯滤波一样。而值域是指考虑邻域范围内的像素差值计算出滤波器系数,类似于α-截尾均值滤波器(去掉百分率为α的最小值和最大之后剩下像素的均值作为滤波器)。

双边滤波是结合图像的空间邻近度和像素值相似度的一种折中处理,同时考虑空域信息和灰度相似性,达到保边去燥的目的,具有简单、非迭代、局部的特点。双边滤波在图像处理领域中有着广泛的应用,比如去噪、去马赛克、光流估计等等。

更多的关键双边滤波原理的推导和说明可以参考下面两篇博客:

1. http://blog.csdn.net/abcjennifer/article/details/7616663

2.http://blog.csdn.net/dangchangying/article/details/14451963

opencv中的双边滤波函数为bilateralFilter(src, dst, d, sigmaColor, sigmaSpace, borderType), 下面展示了利用双边滤波对图像进行滤波的处理。

其中sigmaColor越大,就表明该像素邻域内有越宽广的颜色会被混合到一起,产生较大的相等颜色区域。sigmaSpace越大,则表明越远的像素会对kernel中心的像素产生影响,从而使更大的区域中足够相似的颜色获取相同的颜色。

下面通过调用opencv的函数比较高斯滤波和双边滤波的效果。

2.2 代码及滤波效果

#include<opencv.hpp>
#include<iostream>

int main(void)
{
cv::Mat src = cv::imread("d:/Opencv Picture/bilateral filter.png");

if (!src.data)
{
std::cout << "image read error!!!\n";
}
cv::imshow("src", src);

//bilateral filter
cv::Mat bilateralFilterResult;
cv::bilateralFilter(src, bilateralFilterResult, 25,50,35);
cv::imshow("medianBlur result", bilateralFilterResult);

cvWaitKey(0);
return 0;
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐