使用OpenCV进行图片模糊处理(中值滤波)

来源:互联网 发布:北京申奥成功 知乎 编辑:程序博客网 时间:2024/06/16 11:30

本篇博客主要介绍如何使用OpenCV自带的中值滤波器来对图片进行处理,达到模糊图片的效果。在代码中通过使用一个TrackerBar动态改变。具体的还是根据代码来进行解释吧!
先看一下效果图:
这里写图片描述这里写图片描述

通过效果图可以很清楚的感受到随着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) {    cout << " , initial_size = " << initial_size << endl;    if (position == 0) {        position = 1;    }    if (position%2 == 0) {        position = position + 1;    }    initial_size = position;    try {        medianBlur(source, result, initial_size);        imshow(source_window, result);    }    catch (Exception e) {        std::cout << "Exception message = " << e.msg << std::endl;    }}int main(){    source = imread("tw.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);    cvSetTrackbarPos("changeSize", source_window,2);    waitKey(0);    cvDestroyAllWindows();    return 0;}

进行模糊处理最核心的函数就是:medianBlur(source, result, initial_size),看一下这个函数的api介绍:

/** @brief Blurs an image using the median filter.The function smoothes an image using the median filter with the \f$\texttt{ksize} \times\texttt{ksize}\f$ aperture. Each channel of a multi-channel image is processed independently.In-place operation is supported.@note The median filter uses BORDER_REPLICATE internally to cope with border pixels, see cv::BorderTypes@param src input 1-, 3-, or 4-channel image; when ksize is 3 or 5, the image depth should beCV_8U, CV_16U, or CV_32F, for larger aperture sizes, it can only be CV_8U.@param dst destination array of the same size and type as src.@param ksize aperture linear size; it must be odd and greater than 1, for example: 3, 5, 7 ...@sa  bilateralFilter, blur, boxFilter, GaussianBlur */CV_EXPORTS_W void medianBlur( InputArray src, OutputArray dst, int ksize );

src代表输入图像,dst代表输出图像,ksize代表着内核尺寸,由于是中值滤波,所有ksize的大小必须为奇数,这也是我在程序中对trackerbar的值进行判断的原因。

中值滤波的实现原理:中值滤波将图像的每个像素用邻域 (以当前像素为中心的正方形区域)像素的 中值 代替 。

好了,函数的注解也已经提供了,不知道我理解的对不对,如果有什么不正确的地方还请大神指正,我早点改正,不胜感激!!!有兴趣的朋友可以以关注我,遇到问题大家一起讨论一下!!

这是我的微信公众号,如果可以的话,希望您可以帮忙关注一下,这将是对我最大的鼓励了,谢谢!!

这里写图片描述

代码地址:MedianBlur

原创粉丝点击