基于opencv的几种图像滤波

一、介绍

    盒式滤波、均值滤波、高斯滤波、中值滤波、双边滤波、导向滤波。

    boxFilter()

    blur()

    GaussianBlur()

    medianBlur()

    bilateralFilter()

二、代码

#include <opencv2/core/core.hpp>                      
#include <opencv2/highgui/highgui.hpp>          
#include <opencv2/imgproc/imgproc.hpp>      
#include <iostream> using namespace std;
using namespace cv;#define WINDOWNAME "【滤波处理结果窗口】"  //---------------【全局变量声明部分】-------------------------  
Mat g_srcIamge, g_dstImage1, g_dstImage2, g_dstImage3, g_dstImage4, g_dstImage5, g_dstImage6;
int g_nBoxFilterValue = 1;       //盒式滤波内核值  
int g_nMeanBlurValue = 1;        //均值滤波内核值  
int g_nGaussianBlurValue = 1;    //高斯滤波内核值  
int g_nMedianBlurValue = 1;      //中值滤波内核值  
int g_nBilateralFilterValue = 1; //双边滤波内核值  
int g_nGuidedFilterValue = 1;    //导向滤波内核值  
const int g_nMaxVal = 20;        //预设滑动条最大值 //--------------【全局函数声明部分】-------------------------   
static void on_BoxFilter(int, void*);       //盒式滤波器  
static void on_MeanBlur(int, void*);        //均值滤波器  
static void on_GaussianBlur(int, void*);    //高斯滤波器  
static void on_MedianBlur(int, void*);      //中值滤波器  
static void on_BilateralFilter(int, void*); //双边滤波器  
static void on_GuidedFilter(int, void*);    //导向滤波器  
void guidedFilter(Mat& srcMat, Mat& guidedMat, Mat& dstImage, int radius, double eps); //导向滤波器  //----------------------------【主函数】---------------------------  
int main()
{//------------【1】读取源图像并检查图像是否读取成功------------    g_srcIamge = imread("D:\\opencv4_1_2\\opencv\\sources\\samples\\data\\lena.jpg");if (!g_srcIamge.data){cout << "读取图片错误,请重新输入正确路径!\n";system("pause");return -1;}namedWindow("【源图像】", 1);     //创建窗口  imshow("【源图像】", g_srcIamge); //显示窗口  //------------【2】在WINDOWNAME窗口上分别创建滤波6个滑动条------------         namedWindow(WINDOWNAME); //创建窗口    createTrackbar("方框滤波", WINDOWNAME, &g_nBoxFilterValue, g_nMaxVal, on_BoxFilter); //创建方框滤波轨迹条  on_BoxFilter(g_nBoxFilterValue, 0);createTrackbar("均值滤波", WINDOWNAME, &g_nMeanBlurValue, g_nMaxVal, on_MeanBlur); //创建均值滤波轨迹条  on_MeanBlur(g_nMeanBlurValue, 0);createTrackbar("高斯滤波", WINDOWNAME, &g_nGaussianBlurValue, g_nMaxVal, on_GaussianBlur); //创建高斯滤波轨迹条  on_GaussianBlur(g_nGaussianBlurValue, 0);createTrackbar("中值滤波", WINDOWNAME, &g_nMedianBlurValue, g_nMaxVal, on_MedianBlur); //创建中值滤波轨迹条  on_MedianBlur(g_nMedianBlurValue, 0);createTrackbar("双边滤波", WINDOWNAME, &g_nBilateralFilterValue, g_nMaxVal, on_BilateralFilter); //创建双边滤波轨迹条  on_BilateralFilter(g_nBilateralFilterValue, 0);createTrackbar("导向滤波", WINDOWNAME, &g_nGuidedFilterValue, g_nMaxVal, on_GuidedFilter); //创建导向滤波轨迹条  on_GuidedFilter(g_nGuidedFilterValue, 0);//------------【3】退出程序------------    cout << "\t按下'q'键,退出程序~!\n" << endl;while (char(waitKey(1)) != 'q') {}return 0;
}//----------------------【on_BoxFilter()函数】------------------------  
static void on_BoxFilter(int, void*)
{boxFilter(g_srcIamge, g_dstImage1, -1, Size(g_nBoxFilterValue * 2 + 1, g_nBoxFilterValue * 2 + 1));cout << "\n当前为【盒式滤波】处理效果,其内核大小为:" << g_nBoxFilterValue * 2 + 1 << endl;imshow(WINDOWNAME, g_dstImage1);
}//----------------------【on_MeanBlur()函数】------------------------  
static void on_MeanBlur(int, void*)
{blur(g_srcIamge, g_dstImage2, Size(g_nMeanBlurValue * 2 + 1, g_nMeanBlurValue * 2 + 1), Point(-1, -1));cout << "\n当前为【均值滤波】处理效果,其内核大小为:" << g_nMeanBlurValue * 2 + 1 << endl;imshow(WINDOWNAME, g_dstImage2);
}//----------------------【on_GaussianBlur()函数】------------------------  
static void on_GaussianBlur(int, void*)
{GaussianBlur(g_srcIamge, g_dstImage3, Size(g_nGaussianBlurValue * 2 + 1, g_nGaussianBlurValue * 2 + 1), 0, 0);cout << "\n当前为【高斯滤波】处理效果,其内核大小为:" << g_nGaussianBlurValue * 2 + 1 << endl;imshow(WINDOWNAME, g_dstImage3);
}//----------------------【on_MedianBlur()函数】------------------------  
static void on_MedianBlur(int, void*)
{medianBlur(g_srcIamge, g_dstImage4, g_nMedianBlurValue * 2 + 1);cout << "\n当前为【中值滤波】处理效果,其内核大小为:" << g_nMedianBlurValue * 2 + 1 << endl;imshow(WINDOWNAME, g_dstImage4);
}//----------------------【on_BilateralFilter()函数】------------------------  
static void on_BilateralFilter(int, void*)
{bilateralFilter(g_srcIamge, g_dstImage5, g_nBilateralFilterValue, g_nBilateralFilterValue * 2, g_nBilateralFilterValue / 2);cout << "\n当前为【双边滤波】处理效果,其内核大小为:" << g_nBilateralFilterValue << endl;imshow(WINDOWNAME, g_dstImage5);
}//----------------------【on_GuidedFilter()函数】------------------------  
static void on_GuidedFilter(int, void*)
{vector<Mat> vSrcImage, vResultImage;//【1】对源图像进行通道分离,并对每个分通道进行导向滤波操作  split(g_srcIamge, vSrcImage);for (int i = 0; i < 3; i++){Mat tempImage;vSrcImage[i].convertTo(tempImage, CV_64FC1, 1.0 / 255.0); //将分通道转换成浮点型数据  Mat cloneImage = tempImage.clone(); //将tempImage复制一份到cloneImage  Mat resultImage;guidedFilter(tempImage, cloneImage, resultImage, g_nGuidedFilterValue * 2 + 1, 0.01); //对分通道分别进行导向滤波  vResultImage.push_back(resultImage); //将分通道导向滤波后的结果存放到vResultImage中  }//【2】将分通道导向滤波后结果合并  merge(vResultImage, g_dstImage6);cout << "\n当前处理为【导向滤波】,其内核大小为:" << g_nGuidedFilterValue * 2 + 1 << endl;imshow(WINDOWNAME, g_dstImage6);
}//-------------------【实现导向滤波器函数部分】-------------------------  
void guidedFilter(Mat& srcMat, Mat& guidedMat, Mat& dstImage, int radius, double eps)
{//------------【0】转换源图像信息,将输入扩展为64位浮点型,以便以后做乘法------------  srcMat.convertTo(srcMat, CV_64FC1);guidedMat.convertTo(guidedMat, CV_64FC1);//--------------【1】各种均值计算----------------------------------  Mat mean_p, mean_I, mean_Ip, mean_II;boxFilter(srcMat, mean_p, CV_64FC1, Size(radius, radius)); //生成待滤波图像均值mean_p   boxFilter(guidedMat, mean_I, CV_64FC1, Size(radius, radius)); //生成导向图像均值mean_I     boxFilter(srcMat.mul(guidedMat), mean_Ip, CV_64FC1, Size(radius, radius)); //生成互相关均值mean_Ip  boxFilter(guidedMat.mul(guidedMat), mean_II, CV_64FC1, Size(radius, radius)); //生成导向图像自相关均值mean_II  //--------------【2】计算相关系数,计算Ip的协方差cov和I的方差var------------------  Mat cov_Ip = mean_Ip - mean_I.mul(mean_p);Mat var_I = mean_II - mean_I.mul(mean_I);//---------------【3】计算参数系数a、b-------------------  Mat a = cov_Ip / (var_I + eps);Mat b = mean_p - a.mul(mean_I);//--------------【4】计算系数a、b的均值-----------------  Mat mean_a, mean_b;boxFilter(a, mean_a, CV_64FC1, Size(radius, radius));boxFilter(b, mean_b, CV_64FC1, Size(radius, radius));//---------------【5】生成输出矩阵------------------  dstImage = mean_a.mul(srcMat) + mean_b;
}

三、显示

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/75004.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OpenLayers入门,OpenLayers使用fetch加载并显示TopoJson格式区划边界数据并叠加文字标注,动态创建要素样式

专栏目录: OpenLayers入门教程汇总目录 前言 上一章中已经说明了TopoJson格式数据,《OpenLayers入门,OpenLayers加载TopoJson数据,使用行政区划边界作为示例》,大家应该都已经有所了解。 本章在上一章基础上改用fetch加载TopoJson格式数据,并手动解析数据为Feature要素…

【GITHUB】FlipIt – Windows的开源翻页时钟

FlipIt 是一款免费开源的翻页时钟应用&#xff0c;专为 Windows 平台设计。该应用灵感来源于备受喜爱的老牌翻页时钟应用 Fliqlo&#xff0c;后者被公认为经典的翻页时钟屏保。然而&#xff0c;由于 Fliqlo 是基于 Flash 技术开发的&#xff0c;随着微软最近正式禁用 Flash&…

contact.sh:一款专门用于安全漏洞报告的公开资源情报工具

关于contact.sh contact.sh一款专门用于安全漏洞报告的公开资源情报工具&#xff0c;在该工具的帮助下&#xff0c;广大研究人员可以扫描企业域名并搜索企业中的用户账号&#xff0c;并根据安全威胁等级来发送安全漏洞报告。 工具安装 GNU/Linux 在下载该工具之前&#xff…

多线程之NSOperation

套话 与GCD一样&#xff0c;NSOperation也是我们日常开发中经常用到的多线程技术。本文将会介绍NSOperation的基本使用、添加依赖、 初次使用 NSOperation是个抽象类&#xff0c;依赖于子类NSInvocationOperation、NSBlockOperation去实现 下面是开发者文档上对NSOperation…

macOS 虚拟桌面黑屏(转)

转自&#xff1a;macOS重置虚拟桌面、macOS 虚拟桌面黑屏 有几次出现如图的情况&#xff0c;以为是iTerm的问题&#xff0c;但是在关闭软件&#xff0c;重启之后&#xff0c;依旧无效。 后面经过网友告知&#xff0c;才知道是虚拟桌面的问题。 为了清理这个问题&#xff0c;有以…

ELD透明屏在智能家居中有哪些优点展示?

ELD透明屏是一种新型的显示技术&#xff0c;它能够在不需要背光的情况下显示图像和文字。 ELD透明屏的原理是利用电致发光效应&#xff0c;通过在透明基板上涂覆一层特殊的发光材料&#xff0c;当电流通过时&#xff0c;发光材料会发出光线&#xff0c;从而实现显示效果。 ELD…

论文研读|多媒体自动评论生成发展综述

前言&#xff1a;多媒体自动评论生成旨在通过使用生成模型&#xff0c;对给定上下文生成符合情境的评论&#xff0c;近年来&#xff0c;随着图像描述等跨模态工作取得较大突破&#xff0c;相关研究也逐渐展开。评论作为社交平台互动的重要组成部分&#xff0c;在引导舆论、提升…

python-MySQL数据库建表语句(需要连接数据库)转存为Excel文档-工作小记

将create table XXXXXX 转为指定Excel文档。该脚本适用于数据库表结构本地文档记录 呈现效果 代码 # -*- coding:utf-8 -*- # Time : 2023/8/2 15:14 # Author: 水兵没月 # File : MySQL建表_2_excel.py import reimport mysql.connector import pandas as pd db 库名 mydb …

Linux的基本指令(2)

指令1&#xff1a;man 作用&#xff1a;可以查询linux指令语法内容。 格式&#xff1a; man 指令 安装man指令&#xff1a; yum install -y man-pages 例如&#xff1a; 查询 指令 ls 的语法内容。 man ls 查询 fork 指令的语法内容。 man fork 在man中存在9个手册&…

【腾讯云Cloud Studio实战训练营】使用Cloud Studio迅捷开发一个3D家具个性化定制应用

目录 前言&#xff1a; 一、腾讯云 Cloud Studio介绍&#xff1a; 1、接近本地 IDE 的开发体验 2、多环境可选&#xff0c;或连接到云主机 3、随时分享预览效果 4、兼容 VSCode 插件 5、 AI代码助手 二、腾讯云Cloud Studio项目实践&#xff08;3D家具个性化定制应用&…

Day51 算法记录| 动态规划 18(单调栈)

单调栈 739. 每日温度496.下一个更大元素 I503. 下一个更大元素 II42. 接雨水84. 柱状图中最大的矩形 单调栈&#xff1a;找最近的比他大的值 最近大的值&#xff1a;需要一个单调递减的栈&#xff08;大于栈顶元素就弹出&#xff09; 最近最小值&#xff1a;单调递减栈 方向&a…

idea-常用插件汇总

idea-常用插件汇总 码云插件 这个插件是码云提供的ps-码云是国内的一款类似github的代码托管工具。 Lombok Lombok是一个通用Java类库&#xff0c;能自动插入编辑器并构建工具&#xff0c;简化Java开发。通过添加注解的方式&#xff0c;不需要为类编写getter或setter等方法…

记一次 .NET 某物流API系统 CPU爆高分析

一&#xff1a;背景 1. 讲故事 前段时间有位朋友找到我&#xff0c;说他程序CPU直接被打满了&#xff0c;让我帮忙看下怎么回事&#xff0c;截图如下&#xff1a; 看了下是两个相同的程序&#xff0c;既然被打满了那就抓一个 dump 看看到底咋回事。 二&#xff1a;为什么会打…

【雕爷学编程】Arduino动手做(181)---Maixduino AI开发板11

37款传感器与执行器的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&am…

中断管理

其实&#xff0c;关于中断的概念和定义在之前已经反复学习和实践了&#xff0c;这节主要讲和FreeRTOS相关的中断知识。 中断优先级 任何中断的优先级都大于任务&#xff01; 在我们的操作系统&#xff0c;中断同样是具有优先级的&#xff0c;并且我们也可以设置它的优先级&a…

汽车EBSE测试流程分析(四):反思证据及当前问题解决

EBSE专题连载共分为“五个”篇章。此文为该连载系列的“第四”篇章&#xff0c;在之前的“篇章&#xff08;三&#xff09;”中已经结合具体研究实践阐述了“步骤二&#xff0c;通过系统调研确定改进方案”等内容。那么&#xff0c;在本篇章&#xff08;四&#xff09;中&#…

elementUI全屏loading的使用(白屏的解决方案)

官网中有使用方法&#xff0c;但是我实际上手之后会出现白屏&#xff0c;解决办法如下&#xff1a; <el-button type"text" size"small" click"delRow(scope)"> 删除</el-button>loading: false, // loading 动画loadingInstance…

windows图标白了,刷新图标

1.进入C盘&#xff0c;user(用户文件夹)&#xff0c;进入当前用户文件夹&#xff0c;再进入隐藏文件夹(AppDada)&#xff0c;最后进入Local 2.删除Local文件夹里的IconCache.db文件 3.重启资源管理器 -------------------------------------------- 或者创建bat文件&#xf…

爬虫008_流程控制语句_if_if else_elif_for---python工作笔记026

然后我们再来看一下这里的,判断,可以看到 再看一个判断,这里的布尔类型 第二行有4个空格,python的格式 注意这里,输入的age是字符串,需要转一下才行 int可以写到int(intput("阿斯顿法师打发地方")) 这样也可以

无涯教程-Perl - Subroutines(子例程)

定义子程序 Perl编程语言中 Subroutine子程序定义的一般形式如下: sub subroutine_name {body of the subroutine } 调用该Perl Subroutine的典型方式如下- subroutine_name( list of arguments ); 在Perl 5.0之前的版本中&#xff0c;调用 Subroutine的语法略有不同&…