均值滤波是最简单的滤波器,他将K*K窗口中像素值的平均值作为输出。这种滤波器等价于图像与全部元素值为1的
核函数先进性卷积。
CV_EXPORTS_W void blur( InputArray src, OutputArray dst,
Size ksize, Point anchor = Point(-1,-1),
int borderType = BORDER_DEFAULT );
src : 输入图像;它可以有任意数量的通道,这些通道是独立处理的,但深度应该是CV_8U、CV_16U、CV_16S、CV_32F或CV_64F。
dst :输出图像,与src相同大小和类型。
Ksize :均值滤波内核的大小。 (可以做一维卷积如(1,15)或(15,1))
anchor : 锚点;默认值Point(-1,-1)表示锚位于内核中心。
borderType : 图像的边界模式。
能够有效的抑制噪声,平滑图像。高斯滤波器相比于均值滤波器对图像个模糊程度较小。高斯模糊和均值模糊其原理上
的唯一区别只是在于卷积核的值不同罢了,高斯卷积核矩阵值服从二维高斯函数也就是说一个图像与服从二维高斯分布
的函数做卷积,由于高斯函数是连续的,所有yaoj要将二维高斯函数进行采样和离散化,最后得到服从高斯函数规律的
卷积核矩阵
API:void GaussianBlur(
InputArray src, //输入图片
OutputArray dst, //输出图片
Size ksize, // Ksize为高斯滤波器窗口大小
double sigmaX, // X方向滤波系数
double sigmaY=0, // Y方向滤波系数
int borderType=BORDER_DEFAULT // 默认边缘插值方法)
高斯模糊是考虑图像空间位置对权重的影响,但是它没有考虑图像像素分布对图像卷积输出的影响,双边模糊考虑了像素
值分布的影响,对像素值空间分布差异较大的进行保留从而完整的保留了图像的边缘信息。双边模糊可以去除无关噪声,
同时保持较好的边缘信息。但是,其速度比绝大多数滤波器都慢.对于空间(x、y)和色彩域内做卷积操作,会考虑色
彩空间像素值的差异,只对同一通道内差异大的像素值进行处理
void bilateralFilter( InputArray src, //(原始图像:8-bit或floating-point,1-channel或3-channel)
OutputArray dst, // 目标图像:size和type与原始图像相同
int d, // 过滤期间使用的各像素邻域的直径
double sigmaColor, // 色彩空间的sigma参数,该参数较大时,各像素邻域内相距较远的颜色会被混合到一起,从而造成更大范围的半相等颜色
double sigmaSpace, // 坐标空间的sigma参数,该参数较大时,只要颜色相近,越远的像素会相互影响
int borderType = BORDER_DEFAULT // 边界类型:指定如何确定图像范围外的像素的取值(在处理边缘像素时)
);
关于2个sigma参数
简单起见,可以令2个sigma的值相等;
如果他们很小(小于10),那么滤波器几乎没有什么效果;
如果他们很大(大于150),那么滤波器的效果会很强,使图像显得非常卡通化;
关于参数d
过大的滤波器(d>5)执行效率低。
对于实时应用,建议取 d=5;
对于需要过滤严重噪声的离线应用,可取 d=9;
d>0 时,由 d 指定邻域直径;
d<=0 时,d 会自动由 sigmaSpace 的值确定,且 d 与 sigmaSpace 成正比。
示例代码
void blur_demo(Mat& image) {
Mat dst;
blur(image, dst, Size(5, 5), Point(-1, -1));
imshow("图像模糊", dst);
}
void gaussian_blur_demo(Mat& image) {
Mat dst;
GaussianBlur(image, dst, Size(5, 5),15);
imshow("高斯模糊", dst);
}
void bifilter_demo(Mat& image) {
Mat dst;
bilateralFilter(image, dst, 0, 100, 10);
imshow("高斯双边模糊", dst);
}
void test1901()
{
Mat image = imread("C:/Users/86156/Pictures/Saved Pictures/rat.jpg", IMREAD_GRAYSCALE);
imshow("rat", image);
blur_demo(image);
gaussian_blur_demo(image);
bifilter_demo(image);
waitKey(0);
}
int main()
{
test1901();
system("pause");
}