OpenCV学习十:blur、GaussianBlur、medianBlur 、bilateralFilter 图片的模糊、高斯模糊、中值模糊、二值滤波(课程里将模糊与滤波认定为一样) 以及 锐化算子

bilateralFilter 函数说明

双边滤波是一种非线性的滤波方法,是结合图像的空间邻近度和像素值相似度的一种折衷处理,同时考虑空间与信息和灰度相似性,达到保边去噪的目的,具有简单、非迭代、局部处理的特点。之所以能够达到保边去噪的滤波效果是因为滤波器由两个函数构成:一个函数是由几何空间距离决定滤波器系数,另一个是由像素差值决定滤波器系数。 

双边滤波器中,输出像素的值依赖于邻域像素的值的加权组合,其公式如下: 
这里写图片描述 
权重系数w(i,j,k,l)取决于定义域核 
这里写图片描述 
和值域核 
这里写图片描述 
的乘积,也就是 
这里写图片描述
 

通俗来讲就是双边滤波模板主要有两个模板生成,第一个是高斯模板,第二个是以灰度级的差值作为函数系数生成的模板,然后这两个模板点乘就得到了最终的双边滤波模板,第一个模板是全局模板,所以只需要生成以西,第二个模板需要对每个像素都计算一次。双边滤波器比高斯滤波器多了一个高斯方差sigma-d,它是基于空间分布的高斯滤波函数,所以在边缘附近,离的较远的像素不会太多影响到边缘上的像素,这样就能对边缘附近的像素值予以保存,但是由于保存过多的高频信息,对于彩色图像里的高频噪声,双边滤波器不能够干净的滤掉,只能够对于低频信息进行较好的滤除。

opencv中提供了bilateralFilter()函数来实现双边滤波操作,其原型如下:

void bilateralFilter
(
InputArray src, 
OutputArray dst, 
int d, 
double sigmaColor, 
double sigmaSpace, 
int borderType=BORDER_DEFAULT 
)

参数解释: 
. InputArray src: 输入图像,可以是Mat类型,图像必须是8位或浮点型单通道、三通道的图像。 
. OutputArray dst: 输出图像,和原图像有相同的尺寸和类型。 
. int d: 表示在过滤过程中每个像素邻域的直径范围。如果这个值是非正数,则函数会从第五个参数sigmaSpace计算该值。 
. double sigmaColor: 颜色空间过滤器的sigma值,这个参数的值月大,表明该像素邻域内有月宽广的颜色会被混合到一起,产生较大的半相等颜色区域。 
. double sigmaSpace: 坐标空间中滤波器的sigma值,如果该值较大,则意味着颜色相近的较远的像素将相互影响,从而使更大的区域中足够相似的颜色获取相同的颜色。当d>0时,d指定了邻域大小且与sigmaSpace五官,否则d正比于sigmaSpace. 
. int borderType=BORDER_DEFAULT: 用于推断图像外部像素的某种边界模式,有默认值BORDER_DEFAULT.

双边滤波器可以很好的保存图像边缘细节而滤除掉低频分量的噪音,但是双边滤波器的效率不是太高,花费的时间相较于其他滤波器而言也比较长。 
对于简单的滤波而言,可以将两个sigma值设置成相同的值,如果值<10,则对滤波器影响很小,如果值>150则会对滤波器产生较大的影响,会使图片看起来像卡通。 

上面是 bilateralFilter 双边滤波函数说明,下面是代码。

 

#include <stdio.h>
#include <opencv2/opencv.hpp>

using namespace std;
using namespace cv;

int main(int argc, char** argv)
{
	Mat img = imread("C.jpg", -1);
	pyrDown(img, img, Size(img.cols/2, img.rows/2));
	imshow("img", img);imwrite("img.jpg",img);

	// blur模糊是对 Size() 函数覆盖的面积内元素取均值进行的模糊
	Mat blur_img;
	int b = 5;
	blur(img, blur_img, Size(b, b), Point(-1, -1), 4);
	imshow("blur",blur_img);imwrite("blur_img.jpg",blur_img);

	//高斯模糊,一定程度上避免了峰值的损失,因此模糊之后轮廓依然比较清晰。
	Mat gau_blur;
	GaussianBlur(img, gau_blur, Size(b, b), 11, 11, 4);
	imshow("GaussianBlur",gau_blur);imwrite("gau_blur.jpg",gau_blur);

	//中植滤波,是把 Size() (第三个参数)范围内的像素从小到大排序,用中间值替换当前值。对椒盐噪声效果特别好
	Mat med_blur;
	medianBlur(img, med_blur, b);
	imshow("medianBlur",med_blur);imwrite("med_blur.jpg",med_blur);
	
	//二值滤波,对特定部分进行处理
	Mat bil_blur;
	bilateralFilter(img, bil_blur, 10,100, 5);
	imshow("bilateralFilter",bil_blur);imwrite("bil_blur1.jpg",bil_blur);

	//锐化算子优化图片
	Mat kernel =  (Mat_<int>(3,3)<<0,-1,0, -1,5,-1, 0, -1, 0);
	filter2D(bil_blur, bil_blur, -1, kernel);
	imshow("filter2D",bil_blur);imwrite("bil_blur2.jpg",bil_blur);	

	waitKey();
}

img.jpg

 

blur.jpg

gao_blur.jpg

 

med_blur.jpg

bil_blur1.jpg

 

bil_blur2.jpg

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值