原理
归一化块滤波器 (Normalized Box Filter)
高斯滤波器 (Gaussian Filter)
中值滤波器 (Median Filter)
中值滤波将图像的每个像素用邻域 (以当前像素为中心的正方形区域)像素的中值代替 。
双边滤波 (Bilateral Filter)
目前我们了解的滤波器都是为了平滑图像, 问题是有些时候这些滤波器不仅仅削弱了噪声, 连带着把边缘也给磨掉了。 为避免这样的情形 (至少在一定程度上 ), 我们可以使用双边滤波。
类似于高斯滤波器,双边滤波器也给每一个邻域像素分配一个加权系数。 这些加权系数包含两个部分, 第一部分加权方式与高斯滤波一样,第二部分的权重则取决于该邻域像素与当前像素的灰度差值。
函数介绍:
(1)均值平滑函数(均值滤波器)(blur)(所有像素加权系数相等)
blur(InputArraysrc, // 输入图像
OutputArray dst, // 输出图像
Size ksize, // Size(w,h ): 定义内核大小(w像素宽度, h 像素高度)
Point anchor = Point(-1,-1), // Point(-1,-1): 指定锚点位置(被平滑点), 如果是负值,取核的中心为锚点
int borderType = BORDER_DEFAULT); // 可省略不写
(2)高斯平滑函数(高斯滤波器)(GaussianBlur)(中间像素的加权系数是最大的, 周边像素的加权系数随着它们远离中间像素的距离增大而逐渐减小。)
GaussianBlur(InputArray src,// 输入图像
OutputArray dst,// 输出图像
Size ksize,// Size( w,h ): 定义内核大小( w 像素宽度, h 像素高度)
double sigmaX,// x 方向标准方差
double sigmaY =0,// y 方向标准方差
int borderType = BORDER_DEFAULT)
(3)中值平滑函数(中值滤波器)(medianBlur)(中值滤波将图像的每个像素用邻域 (以当前像素为中心的正方形区域)像素的中值代替。)
medianBlur(InputArray src,// 输入图像
OutputArray dst,// 输出图像
int ksize)// 内核大小 (只需一个值,因为我们使用正方形窗口),必须为奇数。
代码实现
全局变量
Mat src;
Mat dst;
int MAX_KERNEL_LENGTH = 20;
点击btn实现不同效果的转换(按钮是通过storyboard创建的,通过tag值来区分)
- (IBAction)changeType:(id)sender {
UIButton *btn = (UIButton *)sender;
switch (btn.tag) {
case 1000:// 展示原图
{
self.secondImageView.image = MatToUIImage(src);
}
break;
case 1001:// 均值
{
for (int i = 1; i < MAX_KERNEL_LENGTH; i+=2) {
blur(src, dst, cv::Size(i,i));
}
self.secondImageView.image = MatToUIImage(dst);
}
break;
case 1002:// 高斯模糊
{
for (int i = 1; i < MAX_KERNEL_LENGTH; i+=2) {
GaussianBlur(src, dst, cv::Size(i,i),0);
}
self.secondImageView.image = MatToUIImage(dst);
}
break;
case 1003:// 中值
{
for (int i = 1; i < MAX_KERNEL_LENGTH; i+=2) {
medianBlur(src, dst, i);
}
self.secondImageView.image = MatToUIImage(dst);
}
break;
default:
break;
}
}
效果
原图
模糊效果(其中一种)
参考资料