opencv笔记 4.线性和非线性滤波

本文列举了opencv里最常用的线性和非线性滤波函数,并举例实现了各个函数。

#include<cv.hpp>
#include<iostream>

using namespace std;
using namespace cv;

//定义一个mat数据srcImge用来存放图像,一个控制条初始值和五个控制条调用函数
Mat srcImage;
int currentvalue = 3;

void on_MeanBlur(int, void*);
void on_GaussianBlur(int, void*);
void on_BoxBlur(int, void*);
void on_MeanBlur(int, void*);
void on_MedianBlur(int, void*);
void on_BilateralBlur(int, void*);

int main()
{
    //读图并显示
    srcImage = imread("1.tif");
    imshow("原图", srcImage);

    //创建五个窗口,依附于每个窗口创建一个控制条,用控制条调用滤波函数(线性:均值、高斯和方框滤波;非线性:中值、双边)
    namedWindow("均值");
    createTrackbar("内核:", "均值", &currentvalue, 30, on_MeanBlur);
    on_MeanBlur(currentvalue,0);

    namedWindow("高斯");
    createTrackbar("内核:", "高斯", &currentvalue, 30, on_GaussianBlur);
    on_GaussianBlur(currentvalue, 0);

    namedWindow("方框");
    createTrackbar("内核:", "方框", &currentvalue, 30, on_BoxBlur);
    on_BoxBlur(currentvalue, 0);

    namedWindow("中值");
    createTrackbar("内核:", "中值", &currentvalue, 30, on_MedianBlur);
    on_MedianBlur(currentvalue, 0);

    namedWindow("双边");
    createTrackbar("内核:", "双边", &currentvalue, 30, on_BilateralBlur);
    on_BilateralBlur(currentvalue, 0);


    waitKey();
    return 0;
}


//五个控制条函数的调用函数,前三个size里都有加一操作,是因为内核必须为正数,即大于零,第四个 2*currentvalue+1 是因为这个参数得取大于一的奇数
void on_MeanBlur(int, void*)
{
    Mat dstImage = srcImage.clone();
    blur(srcImage, dstImage,Size(currentvalue+1,currentvalue+1));
    imshow("均值", dstImage);
}


void on_GaussianBlur(int, void*)
{
    Mat dstImage = srcImage.clone();
    GaussianBlur(srcImage, dstImage, Size(2*currentvalue+1, 2*currentvalue+1),0,0);//高斯函数的内核大小必须是正数和奇数
    imshow("高斯", dstImage);
}


void on_BoxBlur(int, void*)
{
    Mat dstImage = srcImage.clone();
    boxFilter(srcImage, dstImage,-1, Size(currentvalue+1, currentvalue+1 ));
    imshow("方框", dstImage);
}


void on_MedianBlur(int, void*)
{
    Mat dstImage = srcImage.clone();
    medianBlur(srcImage, dstImage, 2*currentvalue+1 );
    imshow("中值", dstImage);
}

void on_BilateralBlur(int, void*)
{
    Mat dstImage = srcImage.clone();
    bilateralFilter(srcImage, dstImage, currentvalue, currentvalue * 2, currentvalue/2);
    imshow("双边", dstImage);
}

效果图:这里写图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值