首页 > 编程笔记 > C++笔记 阅读:2

OpenCV blur()函数的用法(附带实例)

归一化方框滤波器(Normalized Box Filter)是很简单的滤波器,输出像素值是核窗口内像素值的均值(所有像素加权系数相等)。其核(Kernel,用 K 表示)如下图所示:


方框滤波和均值滤波的核基本上是一致的,主要区别是要不要归一化处理。如果使用归一化处理,方框滤波就是均值滤波,实际上均值滤波是方框滤波归一化后的特殊情况。注意,均值滤波不能很好地保护细节。

OpenCV 提供了 blur() 函数来实现均值滤波操作,该函数声明如下:
void blur(InputArray src, OutputArray dst, Size ksize, Point anchor=Point(-1, -1), int borderType=BORDER_DEFA);
各个参数的含义如下:
【实例】实现均值滤波。
1) 打开 Qt Creator,新建一个控制台工程,工程名是 test。

2) 在工程中打开 main.cpp,输入如下代码:
#include <iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <stdio.h>

using namespace std;
using namespace cv;

// 定义全局变量
Mat g_srcImage;    // 定义输入图像
Mat g_dstImage;   // 定义目标图像

const int g_nTrackbarMaxValue = 9;    // 定义轨迹条最大值
int g_nTrackbarValue;
int g_nKernelValue;

void on_kernelTrackbar(int, void*);  // 定义回调函数

int main()
{
    g_srcImage = imread("cat.png");
    // 判断图像是否加载成功
    if (g_srcImage.empty())
    {
        cout << "Fail to open file." << endl;
        return -1;
    }

    namedWindow("src", WINDOW_AUTOSIZE);   // 定义窗口显示属性
    imshow("src", g_srcImage);

    g_nTrackbarValue = 1;
    namedWindow("Mean filtering", WINDOW_AUTOSIZE); // 定义滤波后图像显示窗口属性

    // 定义轨迹条名称和最大值
    char kernelName[20];
    sprintf(kernelName, "kernel size: %d", g_nTrackbarMaxValue);

    // 创建轨迹条
    createTrackbar(kernelName, "Mean filtering", &g_nTrackbarValue, g_nTrackbarMaxValue, on_kernelTrackbar);
    on_kernelTrackbar(g_nTrackbarValue, 0);
    waitKey(0);
    return 0;
}

void on_kernelTrackbar(int, void*)
{
    // 根据输入值重新计算 kernel 尺寸
    g_nKernelValue = g_nTrackbarValue * 2 + 1;
    // 均值滤波函数
    blur(g_srcImage, g_dstImage, Size(g_nKernelValue, g_nKernelValue));
    imshow("Mean filtering", g_dstImage);// 显示均值滤波结果图
}

3) 保存工程并运行,结果如下图所示:

相关文章