前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【OpenCV入门之十六】多种方式模糊图像

【OpenCV入门之十六】多种方式模糊图像

作者头像
小白学视觉
发布2019-06-02 14:31:53
4710
发布2019-06-02 14:31:53
举报

模糊原理

  • Smooth/Blur 是图像处理中最简单和常用的操作之一
  • 使用该操作的原因之一就为了给图像预处理时候减低噪声
  • 使用Smooth/Blur操作其背后是数学的卷积计算

其中:f()表示一副图像,i、j表示图像的行和列,h(k,l)表示卷积算子(和)(也可以叫掩膜),k l又可以叫窗口大小(掩膜的大小,比如3*3),g()表示输出的像素值;

  • 通常这些卷积算子计算都是线性操作,所以又叫线性滤波

假设有6x6的图像像素点矩阵

卷积过程:6x6上面是个3x3的窗口,从左向右,从上向下移动,黄色的每个像个像素点值之和取平均值赋给中心红色像素作为它卷积处理之后新的像素值。每次移动一个像素格。

1. 归一化盒子滤波(均值滤波)

主要函数

代码语言:javascript
复制
blur(Mat src, Mat dst, Size(xradius, yradius), Point(-1,-1));

完整历程程序

代码语言:javascript
复制
#include<opencv2/opencv.hpp>
#include<iostream>
using namespace cv;

int main(int argc,char** argv){
  Mat src=imread("E:/Experiment/OpenCV/Pictures/dog2.jpg");
  if(!src.data){
    printf("could not load image ...");
    return -1;
  }
  char windows_name[]="input Image";
  namedWindow(windows_name,CV_WINDOW_AUTOSIZE);
  imshow(windows_name,src);

  //均值模糊
  Mat dst1, dst2, dst3;
    //Size()的参数必须是正数
    blur(src, dst1, Size(15, 15), Point(-1, -1));//均值模糊,Size(15, 15)表示卷积算子(掩膜)大小(不一定要正方形)为15*15, Point(-1, -1) 表示取掩膜中心点为计算结果
    blur(src, dst2, Size(29, 1), Point(-1, -1));//x方向模糊看起来像是瞬间移动一样
    blur(src, dst3, Size(1, 15), Point(-1, -1));//y方向模糊看起来会把图像拉高一点点
    imshow("blur1", dst1);
    imshow("blur2", dst2);
    imshow("blur3", dst3);

  waitKey(0);
  return 0;
}

运行结果

2. 高斯滤波

主要函数

代码语言:javascript
复制
GaussianBlur(Mat src, Mat dst, Size(11, 11), sigmax, sigmay);

完成历程

代码语言:javascript
复制
#include<opencv2/opencv.hpp>
#include<iostream>
using namespace cv;

int main(int argc,char** argv){
  Mat src=imread("E:/Experiment/OpenCV/Pictures/dog2.jpg");
  if(!src.data){
    printf("could not load image ...");
    return -1;
  }
  char windows_name[]="input Image";
  namedWindow(windows_name,CV_WINDOW_AUTOSIZE);
  imshow(windows_name,src);

  //高斯模糊
  Mat dst1, dst2, dst3;
    //同样的卷积因子,均值模糊会比高斯模糊更模糊些
    //Size()的参数必须是正数而且是奇数,否则会报错
    //参数sigma x 11, sigma y 11 是控制x,y方向高斯权重分布的,似乎是值越大,图像越模糊,但不是线性关系
    GaussianBlur(src, dst1, Size(15, 15), 11, 11);//高斯模糊,Size(15, 15)表示卷积算子(掩膜)大小(不一定要正方形)为15*15
    GaussianBlur(src, dst2, Size(15, 1), 11, 11);//x方向模糊看起来像是瞬间移动一样
    GaussianBlur(src, dst3, Size(1, 15), 11, 11);//y方向模糊看起来会把图像拉高一点点
    imshow("gaussian blur1", dst1);
    imshow("gaussian blur2", dst2);
    imshow("gaussian blur3", dst3);


  waitKey(0);
  return 0;
}

运行结果

3. 关于滤波的几点说明

模糊原理: 同样的卷积因子,均值模糊会比高斯模糊更模糊些。 不管对于哪种模糊,卷积和(比如3*3)的大小最好是奇数 1. 归一化盒子滤波(均值滤波): 就是上面的卷积计算,卷积算子(掩膜)中的格子权重都是1,所以卷积和之后还要除以卷积因子的大小取均值 2. 高斯滤波: 相比于均值滤波,权重是不一样,但是权重和为1,所以计算卷积和之后不用取均值了

  • 在模糊处理方面,filter2D() 也可以自己定义卷积核;通过如下程序实现
代码语言:javascript
复制
#include<opencv2/opencv.hpp>
#include<iostream>
#include<math.h>

using namespace cv;

int main(int argc,char** argv){
  Mat src,dst1,dst2;
  src=imread("E:/Experiment/OpenCV/Pictures/dog2.jpg");
  if(!src.data){
    printf("could not load image ...");
    return -1;
  }
  imshow("input",src);

  //模糊处理一
  Mat kernel=(Mat_<float>(3,3)<< 1.0/9, 1.0/9, 1.0/9, 1.0/9, 1.0/9, 1.0/9 , 1.0/9, 1.0/9, 1.0/9);
  filter2D(src,dst1,src.depth(),kernel);
  //filter2D(src,dst,-1,kernel);
  
  imshow("filter2D",dst1);

  //模糊处理二
  blur(src, dst2, Size(3,3), Point(-1, -1));

  imshow("Blur",dst2);

  waitKey(0);
  return 0;
}

用自定义的卷积核模糊图像的结果如下:

主要借鉴”Madcola“和”Micheal超“两位大神的文章。两位大神的博客主页是: https://www.cnblogs.com/skyfsm/(Madcola) https://blog.csdn.net/qq_42887760(Micheal超)

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-04-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 小白学视觉 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 模糊原理
    • 1. 归一化盒子滤波(均值滤波)
      • 2. 高斯滤波
        • 3. 关于滤波的几点说明
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档