使用OpenCV进行图片模糊处理(高斯滤波器)
本篇博客主要介绍如何使用OpenCV自带的高斯滤波器来对图片进行处理,达到模糊图片的效果。在代码中通过使用一个TrackerBar动态改变。具体的还是根据代码来进行解释吧:
先看一下效果图:
gif不能截取很长时间而且效果图也不是很清晰,但是可以很明显的通过拖动TrackerBar使得图片更加模糊或者清晰了,下面来看一下具体实现的代码:
#include <iostream>
#include <opencv2\opencv.hpp>
using namespace cv;
using namespace std;const char* source_window = "source";
int initial_size = 1;
int x = 0;
int y = 0;
Mat source, result;
void onSizeChange(int position) {cout << "y = " << x;cout << " , x = " << y;cout << " , initial_size = " << initial_size << endl;if (position == 0) {position = 1;}if (position%2 == 0) {position += 1;}initial_size = position;try {GaussianBlur(source, result, Size(initial_size, initial_size),x,y);imshow(source_window, result);}catch (Exception e) {std::cout << "Exception message = " << e.msg << std::endl;}
}void onXChange(int position) {cout << "y = " << x;cout << " , x = " << y;cout << " , initial_size = " << initial_size << endl;x = position;try {GaussianBlur(source, result, Size(initial_size, initial_size), x, y);imshow(source_window, result);}catch (Exception e) {std::cout << "Exception message = " << e.msg << std::endl;}
}
void onYChange(int position) {cout << "y = " << x;cout << " , x = " << y;cout << " , initial_size = " << initial_size << endl;y = position;try {GaussianBlur(source, result, Size(initial_size, initial_size), x, y);imshow(source_window, result);}catch (Exception e) {std::cout << "Exception message = " << e.msg << std::endl;}
}
int main()
{source = imread("fifth.jpg", IMREAD_UNCHANGED);result.create(source.rows, source.cols, source.type());cvNamedWindow(source_window, CV_WINDOW_AUTOSIZE);cvCreateTrackbar("changeSize", source_window, &initial_size, 100, onSizeChange);cvCreateTrackbar("x方向方差", source_window, &x, 100, onXChange);cvCreateTrackbar("y方向方差", source_window, &y, 100, onYChange);cvSetTrackbarPos("changeSize", source_window, 0);cvSetTrackbarPos("x方向方差", source_window, 0);cvSetTrackbarPos("y方向方差", source_window, 0);waitKey(0);cvDestroyAllWindows();return 0;
}
看一下相关理论方面的东西:
平滑 也称 模糊, 是一项简单且使用频率很高的图像处理方法。
平滑处理的用途有很多, 但是在本教程中我们仅仅关注它减少噪声的功用 (其他用途在以后的教程中会接触到)。
平滑处理时需要用到一个 滤波器 。 最常用的滤波器是 线性 滤波器,线性滤波处理的输出像素值 (i.e. g(i,j)) 是输入像素值 (i.e. f(i+k,j+l))的加权和 :
h(k,l) 称为 核, 它仅仅是一个加权系数。
不妨把 滤波器 想象成一个包含加权系数的窗口,当使用这个滤波器平滑处理图像时,就把这个窗口滑过图像。
高斯滤波器 (Gaussian Filter)
最有用的滤波器 (尽管不是最快的)。 高斯滤波是将输入数组的每一个像素点与 高斯内核 卷积将卷积和当作输出像素值。个人感觉与归一化滤波器相比就是加权系数不在是所有像素点的加权系数都相同了,而是越靠近中部加权系数越大,可以看一下图:
而且高通滤波器的速度要比归一化滤波器慢上不少,如果只是想达到图片模糊的效果,建议还是选择速度快一点的比较好!
看一下GaussianBlur的原型:
/** @brief Blurs an image using a Gaussian filter.The function convolves the source image with the specified Gaussian kernel. In-place filtering is
supported.@param src input image; the image can have any number of channels, which are processed
independently, but the depth should be CV_8U, CV_16U, CV_16S, CV_32F or CV_64F.
@param dst output image of the same size and type as src.
@param ksize Gaussian kernel size. ksize.width and ksize.height can differ but they both must be
positive and odd. Or, they can be zero's and then they are computed from sigma.
@param sigmaX Gaussian kernel standard deviation in X direction.
@param sigmaY Gaussian kernel standard deviation in Y direction; if sigmaY is zero, it is set to be
equal to sigmaX, if both sigmas are zeros, they are computed from ksize.width and ksize.height,
respectively (see cv::getGaussianKernel for details); to fully control the result regardless of
possible future modifications of all this semantics, it is recommended to specify all of ksize,
sigmaX, and sigmaY.
@param borderType pixel extrapolation method, see cv::BorderTypes@sa sepFilter2D, filter2D, blur, boxFilter, bilateralFilter, medianBlur*/
CV_EXPORTS_W void GaussianBlur( InputArray src, OutputArray dst, Size ksize,double sigmaX, double sigmaY = 0,int borderType = BORDER_DEFAULT );
src: 输入图像
dst: 输出图像
Size(w, h): 定义内核的大小(需要考虑的邻域范围)。 w 和 h 必须是正奇数,否则将使用 sigmaX和 sigmaY 参数来计算内核大小。
sigmaX: x 方向标准方差, 如果是 0 则sigmaX 使用内核大小计算得到。
sigmaY : y 方向标准方差, 如果是 0 则sigmaY 使用内核大小计算得到。
好了,函数的注解也已经提供了,不知道我理解的对不对,如果有什么不正确的地方还请大神指正,我早点改正,不胜感激!!!有兴趣的朋友可以以关注我,遇到问题大家一起讨论一下!!
这是我的微信公众号,如果可以的话,希望您可以帮忙关注一下,这将是对我最大的鼓励了,谢谢!!
代码地址:文件夹名为GaussianBlur
使用OpenCV进行图片模糊处理(高斯滤波器)相关推荐
- OpenCV高斯滤波器详解及代码实现
高斯滤波(Gauss Filter)是线性滤波中的一种.在OpenCV图像滤波处理中,高斯滤波用于平滑图像,或者说是图像模糊处理,因此高斯滤波是低通的.其广泛的应用在图像处理的减噪过程中,尤其是被高斯 ...
- Python机器视觉--OpenCV进阶(核心)--常用低通滤波器(方盒滤波器,均值滤波器,高斯滤波器,中值滤波器,双边滤波器)
1.常用低通滤波器介绍 1.1低通滤波器与高通滤波器的区别: 1.低通滤波主要用于噪点的消除或者是用于图像的降噪 2.高通滤波器主要于图像边缘的寻找 1.2 方盒滤波 boxFilter(src, d ...
- 【OpenCV 例程200篇】57. 低通高斯滤波器
[OpenCV 例程200篇]57. 低通高斯滤波器 欢迎关注 『OpenCV 例程200篇』 系列,持续更新中 欢迎关注 『Python小白的OpenCV学习课』 系列,持续更新中 图像滤波是在尽可 ...
- 高斯滤波器(Gaussian Filter) python实现及部分原理说明(opencv)
上传图片 # read the image img = cv2.imread("img/11.jpeg")# Print out the type of image data an ...
- 使用opencv把视频转图片以及图片模糊问题
代码如下: # -*- coding: utf-8 -*-# # Author: weiz # Date: 2019/11/26 10:22 # Name: main # Description: i ...
- JAVA Opencv在图片上添加中文
问题描述: 将图片进行均值.中值.高斯滤波,高斯边缘检测,并在图片上添加中文文字. 一.算法思想 首先经过opencv的一系列操作,例如高斯模糊.均值模糊等操作后.用Imgcodecs.imwrite ...
- OpenCV中的模糊处理(python)
OpenCV中的模糊处理 前言 1.写在模糊理解前 1.1什么是卷积 1.2滤波器 2.模糊方式 2.1均值模糊(滤波) 2.2中值模糊 2.3高斯模糊 总结 前言 接到考核任务. 在学OpenCV模 ...
- python怎么换背景颜色_用opencv给图片换背景色的示例代码
图像平滑 模糊/平滑图片来消除图片噪声 OpenCV函数:cv2.blur(), cv2.GaussianBlur(), cv2.medianBlur(), cv2.bilateralFilter() ...
- OpenCV图像处理学习九,双边滤波器 (Bilateral Filter)和中位数滤波器 (Median Filter)
均值模糊无法克服边缘像素信息丢失缺陷,原因是均值滤波是基于平均权重,赋予图像内的像素与图像边缘像素一样的比值权重,图像处理是会使得边缘部分图像部分像素信息丢失: 高斯模糊部分克服了该缺陷,但是无法完全 ...
最新文章
- Nacos 1.3.0 发布,一个修炼内功的版本:全新内核构建!
- C语言用指针求两个矩阵的差,求破C语言用指针和函数求转置矩阵
- UE4 材质:石缝提高混合权重
- zepto的ajax使用,Ajax的实现及使用-zepto
- PHP学习笔记【9】_表达式
- jQuery html5Validate基于HTML5表单验证插件
- 智慧女人——你懂吗?
- spring session spring:session:sessions:expires 源码跟踪
- Asp.net页面之间传递参数的几种方法荟萃
- html弹出框交互,HTML5/SVG模态窗口(对话框)交互动画
- 数字交易所内存撮合、无锁并发技术源码
- 计算机设备问题代码43,win10系统提示由于该设备有问题windows已将其停止(代码43)的修复方案...
- [索引汇总帖] 【eoeAndroid社区索引】Cocos2d-x部分汇总 [转贴]
- Linux下批量tiff转pdf
- exosip鉴权及使用
- 深入理解逻辑回归算法(Logistic Regression)
- Nature子刊:大脑在局部区域的结构-功能耦合的遗传度与个体差异
- 【FreeSwitch开发实践】使用SIP客户端Yate连接FreeSwitch进行VoIP通话
- php 斗牛 牌型 和 比牌 规则
- 浏览器升级提示网站:《快乐浏览》