数字图像处理(c++ opencv):图像复原与重建-常见的滤波方法--自适应滤波器

自适应局部降噪滤波器

自适应局部降噪滤波器(Adaptive, Local Noise Reduction Filter)原理步骤

步骤

(1)计算噪声图像的方差 在这里插入图片描述

(2)计算滤波器窗口内像素的均值 在这里插入图片描述和方差 在这里插入图片描述

(3)利用原理公式:在这里插入图片描述

在这里插入图片描述

原理

(1)若 在这里插入图片描述为零,则滤波器仅返回(x, y)处的值g。因为噪声为零时,(x, y)处的g等于f.

(2)若局部方差与高度相关,则滤波器返回(x, y)处的一个接近于g的值。高局部方差通常与边缘相关,且应保留这些边缘。

(3)若两个方差相等,则希望滤波器返回Sxy中像素的算术平均值。当局部区域的性质与整个图像的性质相同时会出现这个条件,且平均运算会降低局部噪声。

#include<iostream>
#include<opencv2/opencv.hpp>using namespace cv;
using namespace std;//定义滤波函数
void AdaptiveLocalNoiseReductionFilter(Mat img_input, Mat& img_output, int m, int n); //输入图像,输出图像,m,n为滤波器大小。int main()
{Mat image, image_gray, image_output;   //定义输入图像,灰度图像,输出图像image = imread("高斯噪声.png");  //读取图像;if (image.empty()){cout << "读取错误" << endl;return -1;}imshow("image", image);//转换为灰度图像cvtColor(image, image_gray, COLOR_BGR2GRAY);imshow("image_gray", image_gray);//自己编写的滤波函数AdaptiveLocalNoiseReductionFilter(image_gray, image_output, 7, 7);imshow("image_output", image_output);waitKey(0);  //暂停,保持图像显示,等待按键结束return 0;
}//实现滤波函数
void AdaptiveLocalNoiseReductionFilter(Mat img_input, Mat& img_output, int m, int n)
{img_output = img_input.clone();Mat sortarray(1, m * n, CV_8U);  //局部像素灰度矩阵//1、为了保证图像的边缘也能够被滤波,这里首先扩展图像边缘,扩展方法为镜像copyMakeBorder(img_input, img_input, (m - 1) / 2, (m - 1) / 2, (n - 1) / 2, (n - 1) / 2, BORDER_REFLECT);//2、计算图像方差Mat mat_mean1, mat_stddev1, mat_mean2, mat_stddev2; //图像均值标准差矩阵,局部均值标准差矩阵meanStdDev(img_input, mat_mean1, mat_stddev1); //meanStdDev获取矩阵的平均值和标准差double stddev1, mean2, stddev2;  //图像标准差,局部均值和标准差stddev1 = mat_stddev1.at<double>(0, 0);//图像标准差//3、自适应局部降噪滤波for (int i = (m - 1) / 2; i < img_input.rows - (m - 1) / 2; i++){for (int j = (n - 1) / 2; j < img_input.cols - (n - 1) / 2; j++){int h = 0;for (int x = -(m - 1) / 2; x <= (m - 1) / 2; x++){for (int y = -(n - 1) / 2; y <= (n - 1) / 2; y++){sortarray.at<uchar>(h) = img_input.at<uchar>(i + x, j + y);h++;}}//计算局部均值和方差meanStdDev(sortarray, mat_mean2, mat_stddev2);stddev2 = mat_stddev2.at<double>(0, 0);  //局部标准差mean2 = mat_mean2.at<double>(0, 0);  //局部均值//滤波器double k = (stddev1 * stddev1) / (stddev2 * stddev2 + 0.00001);if (k <= 1){img_output.at<uchar>(i - (m - 1) / 2, j - (n - 1) / 2) = img_input.at<uchar>(i, j) - k * (img_input.at<uchar>(i, j) - mean2);}else{img_output.at<uchar>(i - (m - 1) / 2, j - (n - 1) / 2) = mean2;}}}
}

在这里插入图片描述

自适应中值滤波器

原理

在这里插入图片描述

与中值滤波不同之处在于判定原灰度值是否为噪声,若不是噪声,则灰度值不变,这样可以减少图像的失真

最大最小值比较判定是否为噪声

#include<iostream>
#include<opencv2/opencv.hpp>
#include "Salt.h"using namespace cv;
using namespace std;//定义滤波函数
void AdaptiveMedianFilter(Mat img_input, Mat& img_output, int size_max); //输入图像,输出图像,size_max为滤波器最大尺寸。
//定义判定输出函数
uchar AdaptiveMedian(Mat img_input, int i, int j, int filter_size, int size_max);int main()
{Mat image, image_gray, image_output;   //定义输入图像,灰度图像,输出图像image = imread("lena.png");  //读取图像;if (image.empty()){cout << "读取错误" << endl;return -1;}imshow("image", image);//转换为灰度图像cvtColor(image, image_gray, COLOR_BGR2GRAY);imshow("image_gray", image_gray);//添加盐粒噪声Salt(image_gray, 10000);imshow("image_gray2", image_gray);//自己编写的滤波函数AdaptiveMedianFilter(image_gray, image_output, 7);imshow("image_output", image_output);waitKey(0);  //暂停,保持图像显示,等待按键结束return 0;
}//实现滤波函数
void AdaptiveMedianFilter(Mat img_input, Mat& img_output, int size_max)
{img_output = img_input.clone();//1、为了保证图像的边缘也能够被滤波,这里首先扩展图像边缘,扩展方法为镜像copyMakeBorder(img_input, img_input, (size_max - 1) / 2, (size_max - 1) / 2, (size_max - 1) / 2, (size_max - 1) / 2, BORDER_REFLECT);//2、滤波for (int i = (size_max - 1) / 2; i < img_input.rows - (size_max - 1) / 2; i++){for (int j = (size_max - 1) / 2; j < img_input.cols - (size_max - 1) / 2; j++){int filter_size = 3;  //起始滤波器尺寸img_output.at<uchar>(i - (size_max - 1) / 2, j - (size_max - 1) / 2) = AdaptiveMedian(img_input, i, j, filter_size, size_max);}}
}//通过判定,找到输出值
uchar AdaptiveMedian(Mat img_input,int i, int j, int filter_size, int size_max)
{int num = filter_size * filter_size;vector<uchar> sortarray(num);int h = 0;for (int x = -(filter_size - 1) / 2; x <= (filter_size - 1) / 2; x++){for (int y = -(filter_size - 1) / 2; y <= (filter_size - 1) / 2; y++){sortarray[h] = img_input.at<uchar>(i + x, j + y);h++;}}sort(sortarray.begin(), sortarray.end()); //排序int z_min = sortarray[0];int z_med = sortarray[(num - 1) / 2];int z_max = sortarray[num - 1];int z_xy = img_input.at<uchar>(i, j);if (z_med > z_min && z_med < z_max){if (z_xy > z_min && z_xy < z_max)return z_xy;elsereturn z_med;}else{filter_size += 2;if (filter_size <= size_max)return AdaptiveMedian(img_input, i, j, filter_size, size_max);elsereturn z_med;}
}

添加盐粒噪声h文件:

#pragma once
#include<iostream>
#include<opencv2/opencv.hpp>
#include <random>using namespace cv;
using namespace std;void Salt(Mat image, int n);

添加盐粒噪声cpp文件:

#include "Salt.h"void Salt(Mat image, int n)
{default_random_engine generater;uniform_int_distribution<int>randomRow(0, image.rows - 1);uniform_int_distribution<int>randomCol(0, image.cols - 1);int i, j;for (int k = 0; k < n; k++){i = randomCol(generater);j = randomRow(generater);if (image.channels() == 1){image.at<uchar>(j, i) = 255;}else if (image.channels() == 3){image.at<Vec3b>(j, i)[0] = 255;image.at<Vec3b>(j, i)[1] = 255;image.at<Vec3b>(j, i)[2] = 255;}}
}

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

C++:类和对象(上)

目录 一、类的定义 二、 访问限定符 三、 实例化概念类&#xff1a; 类&#xff08;Class&#xff09; 对象&#xff08;Object&#xff09; 实例化&#xff08;Instantiation&#xff09; 四、 对象大小 五、this 指针的基本概念 this 指针的作用&#xff1a; this 指…

如何在vscode 中打开新文件不覆盖上一个窗口

在 VSCode 中&#xff0c;如果你单击文件时出现了覆盖Tab的情况&#xff0c;这通常是因为VSCode默认开启了预览模式。在预览模式下&#xff0c;单击新文件会覆盖当前预览的文件Tab。为了解决这个问题&#xff0c;你可以按照以下步骤进行操作 1.打开VSCode&#xff1a;启动你的…

Linux篇(权限管理命令)

目录 一、权限概述 1. 什么是权限 2. 为什么要设置权限 3. Linux中的权限类别 4. Linux中文件所有者 4.1. 所有者分类 4.2. 所有者的表示方法 属主权限 属组权限 其他权限 root用户&#xff08;超级管理员&#xff09; 二、普通权限管理 1. ls查看文件权限 2. 文件…

冲压车间如何开展六西格玛管理培训

面对日益严苛的客户要求与成本控制挑战&#xff0c;传统的管理模式已难以满足高质量发展的需求。此时&#xff0c;六西格玛管理以其严谨的数据驱动、持续改进的理念&#xff0c;成为众多企业转型升级的有力工具。本文&#xff0c;天行健企业管理咨询公司将深入探讨冲压车间如何…

基于微信小程序的平安驾校预约平台的设计与实现(源码+LW++远程调试+代码讲解等)

摘 要 互联网发展至今&#xff0c;广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。针对高校教师成果信息管理混乱&#xff0c;出错率高&#xff0c;信息安全性差&#xff0c;劳动强度大&#xff0c;费时费力…

插入排序(sort)C++

链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 来源&#xff1a;牛客网 时间限制&#xff1a;C/C/Rust/Pascal 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C/Rust/Pascal 512 M&#xff0c;其他语言1024 M 64bit IO Format: %lld 题目描述 插入排序是一种…

卷积、频域乘积和矩阵向量乘积三种形式之间的等价关系与转换

线性移不变系统 线性移不变系统&#xff08;Linear Time-Invariant System, LTI系统&#xff09;同时满足线性和时不变性两个条件。 线性&#xff1a;如果输入信号的加权和通过系统后&#xff0c;输出是这些输入信号单独通过系统后的输出的相同加权和&#xff0c;那么该系统就…

15分钟学 Go 第 53 天 :社区资源与学习材料

第53天&#xff1a;社区资源与学习材料 目标 了解Go语言官方资源掌握社区重要学习平台学会利用开源项目学习构建个人知识体系 一、Go语言官方资源汇总 资源类型网址说明Go官网golang.org官方文档、下载、教程Go Blogblog.golang.org技术博客、最新特性介绍Go Playgroundpla…

「QT」文件类 之 QIODevice 输入输出设备类

✨博客主页何曾参静谧的博客&#x1f4cc;文章专栏「QT」QT5程序设计&#x1f4da;全部专栏「Win」Windows程序设计「IDE」集成开发环境「UG/NX」BlockUI集合「C/C」C/C程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「UG/NX」NX定制…

timescale使用例子 - 纽约出租车

一、资料使用 在timescale的官方网站的“教程”菜单中&#xff0c;有几个不同业务场景的例子&#xff0c;其中就有运输行业的例子。我访问中文站点的时候&#xff0c;关于教程的几个步骤内容刷不出来&#xff0c;所以还是建议访问英文站点。 https://docs.timescale.com/tuto…

树(二叉查找树、平衡二叉树、红黑树)

树&#xff08;二叉树、二叉查找树、平衡二叉树、红黑树&#xff09; 二叉查找树&#xff08;二叉排序树、二叉搜索树&#xff09;添加元素查找元素遍历弊端 平衡二叉树旋转机制&#xff1a;左旋旋转机制&#xff1a;右旋需要旋转的四种情况1. 左左&#xff1a;一次右旋2. 左右…

医疗器械包装运输试验之抗压试验的条件选取及方法和设备的要求

医疗器械包装运输试验之抗压试验的试验目的&#xff1a; 抗压试验通常用来评估产品在承受外界压力时&#xff0c;包装对内装物样品的保护能力。试验通常模拟产品在运输流通过程中可能遇到的压力环境。通过试验&#xff0c;可以验证包装对内装物的保护能力、包装结构的完整性、…

C++内存池实现

1.内存池概念 内存池就和其他的池数据&#xff08;如线程池&#xff09;结构类似&#xff0c;由程序维护一个“池”结构来管理程序使用的内存&#xff0c;然后根据需要从内存池中申请使用内存或者向内存池中释放内存&#xff0c;来达到高效管理内存的目的。 在一般的内存管理的…

数据结构-二叉树

一.二叉树的定义 二叉树有左右儿子之分 完美二叉树&#xff08;满二叉树&#xff09;除了最下面的没有儿子其他结点都有两个儿子&#xff0c;叶节点比较齐的&#xff0c;完全二叉树不是满二叉数允许缺失最后的结点 满二叉树可以达到2^k-1 边的总数节点数-1 二.二叉树的存储结构…

OKR制定指南

Goal Crafting 目标制定是最基本的领导活动之一。组织绩效和团队成长依赖于精心制定的目标。没有良好的目标制定练习&#xff0c;团队可能只关注眼前的事务&#xff0c;解决看似可以快速解决的问题。良好的目标制定迫使你不忽视或推迟那些需要新思维方式、合作或克服困难的问题…

详细分析Java中FilterChain过滤器的基本知识

目录 前言1. 基本知识2. Demo 前言 基本的Java知识推荐阅读&#xff1a; java框架 零基础从入门到精通的学习路线 附开源项目面经等&#xff08;超全&#xff09;【Java项目】实战CRUD的功能整理&#xff08;持续更新&#xff09; 从实战中学习&#xff1a; 常用在一些重复代…

TableGPT2-7B:用于表格数据分析的大规模解码器模型

TableGPT2-7B 是浙江大学开发的最先进的大规模解码器模型&#xff0c;专为涉及表格数据的数据密集型任务而设计。该模型以 Qwen2.5 架构为基础&#xff0c;包括针对表格数据的专用编码&#xff0c;其中独特的语义编码器可从行、列和整个表格中获取洞察力。 主要特点和功能 Ta…

SQL面试题——抖音SQL面试题 主播播出时长

主播播出时长 现有如下数据,主播id、房间号、播出的批次号,每个批次号进出房间的时间戳、分区时间: 每一次直播都有一个上播和下播,每个房间里,同一个批次号会有两条数据,分别记录了上播和下播时间,求每个主播的播出时长? 通过上面的数据,可以清晰的看出,同一个批次…

数字信号处理Python示例(14)生成锯齿波和三角波

文章目录 前言一、锯齿波和三角波二、生成锯齿波和三角波的Python代码三、仿真结果及分析写在后面的话 前言 因其独特的数学特性和物理表现&#xff0c;在工程和技术领域扮演着重要角色。这是生成非正弦信号的几个Python示例的其中一个&#xff0c;生成三角波与锯齿波&#xf…

HBase理论_HBase架构组件介绍

近来有些空闲时间&#xff0c;正好最近也在开发HBase相关内容&#xff0c;借此整理一下学习和对HBase组件的架构的记录和个人感受&#xff0c;付出了老夫不少心血啊&#xff0c;主要介绍的就是HBase的架构设计以及我的拓展内容。内容如有不当或有其他理解 matirx70163.com HB…