OpenCV(iOS)平滑处理(模糊,毛玻璃)(10)

原理

OpenCV(iOS)平滑处理(模糊,毛玻璃)(10)_第1张图片

归一化块滤波器 (Normalized Box Filter)

OpenCV(iOS)平滑处理(模糊,毛玻璃)(10)_第2张图片

高斯滤波器 (Gaussian Filter)

OpenCV(iOS)平滑处理(模糊,毛玻璃)(10)_第3张图片

中值滤波器 (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;

}

}

效果

原图

OpenCV(iOS)平滑处理(模糊,毛玻璃)(10)_第4张图片

模糊效果(其中一种)

OpenCV(iOS)平滑处理(模糊,毛玻璃)(10)_第5张图片

参考资料

OpenCV for iOS 学习笔记(九)—— 图像毛玻璃处理

图像平滑处理

你可能感兴趣的:(OpenCV(iOS)平滑处理(模糊,毛玻璃)(10))