OpenCV学习7-图像模糊处理

模糊处理所用的原理:数学上的卷积计算,所谓的卷积算子或称为掩模(窗口),简单理解为一组m*n矩阵,m,n为奇数的好,这样可以保证中心点存在,针对图像的像素矩阵,自上向下,自左向右的移动掩模矩阵(或卷积算子)的中心点,从而遍历像素矩阵(注意,3*3的掩模矩阵,边缘的1列像素点无法处理,5*5的掩模矩阵,边缘的2个像素点无法处理,这些无法处理的像素点可以采取其他算法处理)。

常用的几种方式(各具特色,各有优缺点):

1.均值滤波:blur函数

解释:归一化盒子滤波(均值滤波),掩模矩阵的各系数(权重)值同等(缺点是无法处理极值像素信息,因为它权重平均)。

2.高斯滤波:GaussianBlur函数:

解释:掩模矩阵的各系数(权重)值是不一样的(窗口中其他位置权重偏小,越靠近中心元素权重越大,中心元素权重最大,各位置权重值相加结果为1),因此更利于保存像素原有的特征。

3.中值滤波:medianBlur函数

解释:基于统计学,窗口内的图像各像素值进行排序,取中值替代中心像素的颜色值,同理也存在最大值(最小值)滤波;

4.双边滤波:

解释:窗口内各位置对应的像素值与中心位置像素值进行差值比较,差值大的去除,此方式可以弥补高斯滤波的部分缺点,更好的保留边缘信息

代码示例:

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

using namespace cv;
using namespace std;

int main(int argc, char** argv)
{
	Mat matSrc = imread("D:/Learn/OpenCV/Info/PIC/dt.jpg");
	Mat matRet;

	imshow("ImageSrc", matSrc);

	Size size = Size(3, 3);//掩模矩阵,第一个参数为x轴方向,第二个参数为y轴方向
	Size sizeX = Size(20, 1);//x轴方向的模糊处理之后,类似于动态效果
	Point anchor = Point(-1, -1);//矩阵中心

	//均值模糊
	blur(matSrc, matRet, size, anchor);
	Mat matXImg;
	blur(matSrc, matXImg, sizeX, anchor);
	imshow("Blur", matRet);
	imshow("BlurX", matXImg);

	//高斯模糊
	Mat matGausBlur;
	int sigmaX = 20;
	int sigmaY = 20;
	GaussianBlur(matSrc, matGausBlur, size, sigmaX, sigmaY);
	imshow("GaussianBlur", matGausBlur);

	//中值模糊
	Mat medianMat;
	medianBlur(matSrc, medianMat, 3);//窗口为3*3
	imshow("MedianBlur", medianMat);

	//双边滤波
	Mat bilateralMat;
	int d = 3;//中心点辐射的半径范围
	int sigmaColor = 150;//颜色差值范围
	int sigmaSpace = 3;//如果d参数值为正数,则此参数无效
	bilateralFilter(matSrc, bilateralMat, d, sigmaColor, sigmaSpace);
	imshow("bilateral", bilateralMat);

	waitKey(0);
	return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值