我是靠谱客的博主 坚定马里奥,最近开发中收集的这篇文章主要介绍使用OpenCV进行图片模糊处理(归一化滤波器),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

本篇博客主要介绍如何使用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进行图片模糊处理(归一化滤波器)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(49)

评论列表共有 0 条评论

立即
投稿
返回
顶部