本篇博客主要介绍如何使用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;Mat source, result;void onSizeChange(int position) {if (position == 0) {position = 1;}cout << "position" << position << endl;initial_size = position;try {blur(source, result, Size(initial_size, initial_size));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.channels());cvNamedWindow(source_window, CV_WINDOW_AUTOSIZE);cvCreateTrackbar("changeSize", source_window, &initial_size, 100, onSizeChange);cvSetTrackbarPos("changeSize", source_window, 0);waitKey(0);return 0;}
主要实现模糊的代码就是blur(source, result, Size(initial_size, initial_size)),其中source是输入的图像,result是输出的图像,Size代表的是核窗口的大小,原有的像素点的通过计算将被核窗口内所有像素的均值取代,随意这个Size越大代表参与平均的像素点数量越多,反应到结果上就是原有像素的值可能变化更大,值受到影响越大。
看一下相关理论方面的东西:
平滑 也称 模糊, 是一项简单且使用频率很高的图像处理方法。
平滑处理的用途有很多, 但是在本教程中我们仅仅关注它减少噪声的功用 (其他用途在以后的教程中会接触到)。
平滑处理时需要用到一个 滤波器 。 最常用的滤波器是 线性 滤波器,线性滤波处理的输出像素值 (i.e. g(i,j)) 是输入像素值 (i.e. f(i+k,j+l))的加权和 :
h(k,l) 称为 核, 它仅仅是一个加权系数。
不妨把 滤波器 想象成一个包含加权系数的窗口,当使用这个滤波器平滑处理图像时,就把这个窗口滑过图像。
归一化块滤波器 (Normalized Box Filter)¶
最简单的滤波器, 输出像素值是核窗口内像素值的 均值 ( 所有像素加权系数相等)
核如下:
blur的函数原型:
/** @brief Blurs an image using the normalized box filter.The function smoothes an image using the kernel:\f[\texttt{K} = \frac{1}{\texttt{ksize.width*ksize.height}} \begin{bmatrix} 1 & 1 & 1 & \cdots & 1 & 1 \\ 1 & 1 & 1 & \cdots & 1 & 1 \\ \hdotsfor{6} \\ 1 & 1 & 1 & \cdots & 1 & 1 \\ \end{bmatrix}\f]The call `blur(src, dst, ksize, anchor, borderType)` is equivalent to `boxFilter(src, dst, src.type(),anchor, true, borderType)`.@param src input image; it can have any number of channels, which are processed independently, butthe 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 blurring kernel size.@param anchor anchor point; default value Point(-1,-1) means that the anchor is at the kernelcenter.@param borderType border mode used to extrapolate pixels outside of the image, see cv::BorderTypes@sa boxFilter, bilateralFilter, GaussianBlur, medianBlur*/CV_EXPORTS_W void blur( InputArray src, OutputArray dst,Size ksize, Point anchor = Point(-1,-1),int borderType = BORDER_DEFAULT );
src: 输入图像
dst: 输出图像
Size( w,h ): 定义内核大小( w 像素宽度, h 像素高度)
Point(-1, -1): 指定锚点位置(被平滑点), 如果是负值,取核的中心为锚点。
好了,函数的注解也已经提供了,不知道我理解的对不对,如果有什么不正确的地方还请大神指正,我早点改正,不胜感激!!!有兴趣的朋友可以以关注我,遇到问题大家一起讨论一下!!
这是我的微信公众号,如果可以的话,希望您可以帮忙关注一下,这将是对我最大的鼓励了,谢谢!!
代码地址:
文件夹名字为Blur的那一个,不要点错了啊
如果觉得《使用OpenCV进行图片模糊处理(归一化滤波器)》对你有帮助,请点赞、收藏,并留下你的观点哦!