概述
本篇博客主要介绍如何使用OpenCV自带的归一化滤波器来对图片进行处理,达到模糊图片的效果。在代码中通过使用一个TrackerBar动态改变。具体的还是根据代码来进行解释吧:
先看一下效果图:
gif效果图虽然不清晰,但是可以很明显的通过拖动TrackerBar使得图片更加模糊或者清晰了,下面来看一下具体实现的代码:
#include <iostream>
#include <opencv2opencv.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, 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 blurring kernel size.
@param anchor anchor point; default value Point(-1,-1) means that the anchor is at the kernel
center.
@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进行图片模糊处理(归一化滤波器)的全部内容,希望文章能够帮你解决使用OpenCV进行图片模糊处理(归一化滤波器)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复