利用Opencv2.4.13.6在VS2015下进行图像滤波操作(一)

       对Opencv2.4.13支持的滤波器操作进行整理,首先需要阅读一下它的支持文件https://docs.opencv.org/2.4.13.6/#,里面会有最全面的内容。

   这是老版本2.3.2的内容参考,内容不是很全,比较老,很多东西都没有,但是是中文教程,容易入门看,链接在下面

http://www.opencv.org.cn/opencvdoc/2.3.2/html/doc/tutorials/imgproc/table_of_content_imgproc/table_of_content_imgproc.html#table-of-content-imgproc

     准备是整理一下Opencv2.4.13.6所能提供的滤波操作

(一)BaseFilte

(二)BaseRowFilter

(三)图像滤波核心引擎  FilterEngine

Opencv2.4.13.6所提供的滤波核心引擎 FilterEngine在steven_xiu的博客下有比较详细的分析,https://www.cnblogs.com/stevenxiu/p/5591423.html

(四)双边滤波器  bilateralFilter 

 

先贴一下常见的几种滤波操作的实现方法。

(1)均值平滑

       采用线性的方法,平均整个窗口范围内的像素值,将像素用领域像素均值代替。均值滤波对高斯噪声表现较好,对椒盐噪声表现较差。

(2)高斯平滑

      最有用的滤波器 ,平时用的比较多的, 高斯滤波是将输入数组的每一个像素点与 高斯内核 卷积将卷积和当作输出像素值。

(3)中值平滑

     中值滤波将图像的每个像素用邻域 (以当前像素为中心的正方形区域)像素的 中值代替 。采用非线性的方法,它在平滑脉冲噪声方面非常有效。

(4)双边平滑

     保边滤波器中常见的一种,可以一定程度地避免破坏对图像边缘的破坏,图像边缘细节较多且边缘作用较大时推荐使用。

    双边滤波器的原理见此http://www.cnblogs.com/Imageshop/p/3406823.html

 

%滤波操作的源代码,亲测可用,感谢Ana Huamán

#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"

using namespace std;
using namespace cv;

/// 全局变量
int DELAY_CAPTION = 1500;
int DELAY_BLUR = 100;
int MAX_KERNEL_LENGTH = 31;

Mat src; Mat dst;
char window_name[] = "Filter Demo 1";

/// 函数申明
int display_caption(char* caption);
int display_dst(int delay);

/**
*  main 函数
*/
int main(int argc, char** argv)
{
    namedWindow(window_name, CV_WINDOW_AUTOSIZE);

    /// 载入原图像
    src = imread("3.bmp", 1);                //图片在工程目录下,要么就放完整路径

    if (display_caption("Original Image") != 0) { return 0; }

    dst = src.clone();
    if (display_dst(DELAY_CAPTION) != 0) { return 0; }

    /// 使用 均值平滑
    if (display_caption("Homogeneous Blur") != 0) { return 0; }

    for (int i = 1; i < MAX_KERNEL_LENGTH; i = i + 2)
    {
        blur(src, dst, Size(i, i), Point(-1, -1));
        if (display_dst(DELAY_BLUR) != 0) { return 0; }
    }

    /// 使用高斯平滑
    if (display_caption("Gaussian Blur") != 0) { return 0; }

    for (int i = 1; i < MAX_KERNEL_LENGTH; i = i + 2)
    {
        GaussianBlur(src, dst, Size(i, i), 0, 0);
        if (display_dst(DELAY_BLUR) != 0) { return 0; }
    }

    /// 使用中值平滑
    if (display_caption("Median Blur") != 0) { return 0; }

    for (int i = 1; i < MAX_KERNEL_LENGTH; i = i + 2)
    {
        medianBlur(src, dst, i);
        if (display_dst(DELAY_BLUR) != 0) { return 0; }
    }

    /// 使用双边平滑
    if (display_caption("Bilateral Blur") != 0) { return 0; }

    for (int i = 1; i < MAX_KERNEL_LENGTH; i = i + 2)
    {
        bilateralFilter(src, dst, i, i * 2, i / 2);
        if (display_dst(DELAY_BLUR) != 0) { return 0; }
    }

    /// 等待用户输入
    display_caption("End: Press a key!");

    waitKey(0);
    return 0;
}

int display_caption(char* caption)
{
    dst = Mat::zeros(src.size(), src.type());
    putText(dst, caption,
        Point(src.cols / 4, src.rows / 2),
        CV_FONT_HERSHEY_COMPLEX, 1, Scalar(255, 255, 255));

    imshow(window_name, dst);
    int c = waitKey(DELAY_CAPTION);
    if (c >= 0) { return -1; }
    return 0;
}

int display_dst(int delay)
{
    imshow(window_name, dst);
    int c = waitKey(delay);
    if (c >= 0) { return -1; }
    return 0;
}

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值