滤波实际上是信号处理里的一个概念,而图像本身也可以看成是一个二维的信号。其中像素点灰度值的高低代表信号的强弱。

高频:图像中灰度变化剧烈的点。

低频:图像中平坦的,灰度变化不大的点。

根据图像的高频与低频的特征,我们可以设计相应的高通与低通滤波器,高通滤波可以检测图像中尖锐、变化明显的地方;低通滤波可以让图像变得光滑,滤除图像中的噪声。

下面我们来看一下OpenCV中的一些滤波函数:

一、低通滤波

1,blur函数

这个函数是一个平滑图像的函数,它用一个点邻域内像素的平均灰度值来代替该点的灰度。

cv::blur(p_w_picpath,result,cv::Size(5,5));

2,高斯模糊

上面的blur的平滑原理是用邻域内的平均值来代替当前的灰度值,但是我们往往希望越靠近该像素的点提供越高的权重,这样就产生了高斯模糊滤波。它的滤波器或者叫遮罩是一个高斯分布的二维矩阵。

cv::GaussianBlur(p_w_picpath,result,cv::Size(5,5),1.5);

参数p_w_picpath为输入图像,result为输出图像,Size(5,5)定义了核的大小,最后一个参数说明了高斯核的方差。

3,中值滤波

上面讲到的2个滤波器,都是邻域内的像素按照一个权重相加最后设置为当前点的灰度值,这种操作又称为卷积,这样的滤波器叫线性滤波器,另外还有一种非线性的滤波器,比如中值滤波器,它是取邻域内所有像素的中值作为当前点的灰度值。

中值即排序后中间的那个值:median({1,2,3,3,7,5,1,8})=3。

cv::medianBlur(p_w_picpath,result,5);

其中最后一个参数指定了邻域的大小为5*5。中值滤波也是在实际中应用最多的平滑滤波,它可以有效的去除比如椒盐噪声一类的干扰。

下面我们对比一下上面三种滤波器的效果:

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
int main()
{using namespace cv;Mat p_w_picpath=imread("../cat.png");cvtColor(p_w_picpath,p_w_picpath,CV_BGR2GRAY);Mat blurResult;Mat gaussianResult;Mat medianResult;blur(p_w_picpath,blurResult,Size(5,5));GaussianBlur(p_w_picpath,gaussianResult,Size(5,5),1.5);medianBlur(p_w_picpath,medianResult,5);namedWindow("blur");imshow("blur",blurResult);namedWindow("Gaussianblur");imshow("Gaussianblur",gaussianResult);namedWindow("medianBlur");imshow("medianBlur",medianResult);waitKey();return 0;
}

二、高通滤波:边缘检测

高通滤波器最好的一个应用就是边缘检测,由文章开头分析可知高频是图像中变化剧烈的地方,所以图像的边缘区域恰好符合这一特性,我们可以利用高通滤波让图像的边缘显露出来,进一步计算图像的一些特征。

边缘检测本来打算作为一个单独的主题来写一篇文章,但是由于Canny边缘检测算法比较复杂,篇幅也较大,所以先把Sobel边缘检测在高通滤波这里作为一个实例,以后Canny边缘检测作为单独的一篇文章来写。

实际上OpenCV有提供了Sobel边缘检测的函数,但是一方面阈值好像取的不太好,另一方面没有对最后边缘作细化处理,所以效果并不太让人满意,本文是模仿Matlab中算法来写的,相关的理论可以参考我原来写过的一篇文章《视觉算法:Sobel边缘检测》。

下面是Sobel实现的C++代码:

bool Sobel(const Mat& p_w_picpath,Mat& result,int TYPE)
{if(p_w_picpath.channels()!=1)return false;// 系数设置int kx(0);int ky(0);if( TYPE==SOBEL_HORZ ){kx=0;ky=1;}else if( TYPE==SOBEL_VERT ){kx=1;ky=0;}else if( TYPE==SOBEL_BOTH ){kx=1;ky=1;}elsereturn false;// 设置maskfloat mask[3][3]={{1,2,1},{0,0,0},{-1,-2,-1}};Mat y_mask=Mat(3,3,CV_32F,mask)/8;Mat x_mask=y_mask.t(); // 转置// 计算x方向和y方向上的滤波Mat sobelX,sobelY;filter2D(p_w_picpath,sobelX,CV_32F,x_mask);filter2D(p_w_picpath,sobelY,CV_32F,y_mask);sobelX=abs(sobelX);sobelY=abs(sobelY);// 梯度图Mat gradient=kx*sobelX.mul(sobelX)+ky*sobelY.mul(sobelY);// 计算阈值int scale=4;double cutoff=scale*mean(gradient)[0];result.create(p_w_picpath.size(),p_w_picpath.type());result.setTo(0);for(int i=1;i<p_w_picpath.rows-1;i++){float* sbxPtr=sobelX.ptr<float>(i);float* sbyPtr=sobelY.ptr<float>(i);float* prePtr=gradient.ptr<float>(i-1);float* curPtr=gradient.ptr<float>(i);float* lstPtr=gradient.ptr<float>(i+1);uchar* rstPtr=result.ptr<uchar>(i);// 阈值化和极大值抑制for(int j=1;j<p_w_picpath.cols-1;j++){if( curPtr[j]>cutoff && ((sbxPtr[j]>kx*sbyPtr[j] && curPtr[j]>curPtr[j-1] && curPtr[j]>curPtr[j+1]) ||(sbyPtr[j]>ky*sbxPtr[j] && curPtr[j]>prePtr[j] && curPtr[j]>lstPtr[j]) ))rstPtr[j]=255;}}return true;
}

转载于:https://blog.51cto.com/ronny/1394138

OpenCV成长之路:图像滤波相关推荐

  1. OpenCV成长之路:直线、轮廓的提取与描述

    http://ronny.blog.51cto.com/8801997/1394139 OpenCV成长之路:直线.轮廓的提取与描述 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 . ...

  2. opencv(4)图像滤波

    都是一些常用函数,但是可能太常用了,里面的一些关键点,没做过多的研究,今天主要对函数中特殊的地方做出分析 1.cvSmooth  图像滤波 CV_BLUR_NO_SCALE (简单不带尺度变换的模糊) ...

  3. 【OpenCV】5种图像滤波辨析:方框、均值、高斯、中值、双边

    from:http://www.07net01.com/2015/12/1003192.html 图像滤波 什么是图像滤波 图像滤波,即在尽量保留图像细节特征的条件下对目标图像的噪声进行抑制,是图像预 ...

  4. OpenCV(十一)图像滤波(平滑处理)(平均、中值、高斯、双边滤波)

    目录 一.基础理论 1.图像噪声 1-1.椒盐噪声 1-2.高斯噪声 2.滤波 3.线性滤波 1.概述 2.线性滤波原理: 二.均值滤波(cv::blur())(简单滤波) 1.原理 2.API 三. ...

  5. Opencv的学习之图像滤波

    python的代码展示 import cv2 import matplotlib.pyplot as pltimg = cv2.imread(r'C:\Users\master\Desktop\HHH ...

  6. OpenCV成长之路(3):模仿PhotoShop中魔术棒工具

    转自:http://blog.csdn.net/cv_ronny/article/details/17438131 模仿PhotoShop中魔术棒工具 本文的主题实际上是图像的颜色空间的转换,借助一个 ...

  7. OpenCV成长之路:模仿PhotoShop中魔术棒工具

    本文的主题实际上是图像的颜色空间的转换,借助一个颜色选取程序来说明OpenCV中颜色转换函数的用法以及一些注意事项. 一.几种常见的颜色空间: RGB颜色空间:RGB采用加法混色法,因为它是描述各种& ...

  8. youcans 的 OpenCV 学习课—8.频率域图像滤波(上)

    欢迎关注 『OpenCV 例程200篇』 系列,持续更新中 欢迎关注 『youcans 的 OpenCV 学习课』 系列,持续更新中 youcans 的 OpenCV 学习课-1.安装与环境配置 yo ...

  9. OpenCV——几种图像滤波总结(python实现和c++实现)

    OpenCV--图像滤波原理及实现 4.1 简介 图像的实质是一种二维信号,滤波是信号处理中的一个重要概念.在图像处理中,滤波是一种非常常见的技术,它们的原理非常简单,但是其思想却十分值得借鉴,滤波是 ...

最新文章

  1. swing java管理系统_Java swing实现酒店管理系统
  2. 计算机网络——数据通信过程
  3. 更新Android Studio 3.1.1碰到的问题
  4. rawquery 没扎到返回什么_Flutter之踩坑的日子(RawQuery的使用)
  5. offline .net3.5
  6. cocoscreator editbox 只允许数字_用Cocos做一个数字调节框
  7. AjaxPro使用说明
  8. jQuery 设置表格隔行变色、隔列变色
  9. 让C68平台“冷又静”
  10. stm32 Keil编译后查看代码/内存占用空间,Flash/RAM占用大小,Code-Data,RO-Data,RW-Data,ZI-Data是什么含义
  11. utilities(C++)——单例(Singleton) (使用智能指针 shared_ptr)
  12. GitHub使用(四) - 关于分支Branch
  13. 医院耗材管理系统开发_7
  14. AlphaGo Zero,造神还是开启潘多拉魔盒?【附论文下载】
  15. OAuth2.0公钥私钥授权技术
  16. Learning Compact Binary Descriptors with Unsupervised Deep Neural Networks
  17. 解决谷歌浏览器Chrome不能播放央视新闻视频的问题
  18. C#隐藏任务管理器中进程 支持win10 win8.1 win7
  19. 日语动词变形整理 By Killua
  20. 【OCR】中文街景数据集、场景文本定位识别新网络:End2End-PSL

热门文章

  1. Python基础第六天——函数的使用、函数的参数、函数的返回值、函数的嵌套、命名空间、作用域、函数对象...
  2. elasticsearch 复杂查询小记
  3. postgresql查询栅格数据范围(extent)
  4. python 错误--UnboundLocalError: local variable '**' referenced before assignment
  5. 计算机:2014年考研大纲解析之数据结构
  6. WebGIS在行业中应用的演变
  7. Cempi实战攻略(六)——如何截获到达的短消息
  8. centos ffmpeg m3u8切片相关
  9. 对互联网用户分类的思考
  10. C# 中的 sealed(密封) 关键字