OpenCV-AMF算法(自适应中值滤波Adaptive Median Filtering)

作者:翟天保Steven
版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处

实现原理

       AMF(Adaptive Median Filter,自适应中值滤波)是一种用于图像处理和信号处理的滤波算法,其目的是在保持图像细节的同时去除噪声。它是基于中值滤波的一种改进,可以根据局部像素的灰度值特征自适应地调整滤波器的大小和形状。

       AMF算法的主要思想是根据像素邻域的特征动态调整滤波器的尺寸和形状,以适应不同区域的噪声水平和图像细节。具体步骤如下:

  1. 参数和初始化

    • 函数接受一个输入图像input和一个整数参数winSize,表示滤波器的初始大小。
    • 创建一个和输入图像大小相同的输出图像output,用于存储滤波结果。
    • 变量 R 为窗口半径的最大限制值。
  2. 并行遍历处理图像每个像素

    • 使用 OpenMP 实现并行化,对图像的每一个像素进行处理。注意需要在设置里打开OpenMP。
  3. 窗口处理

    • 对于每个像素(i, j),以其为中心构建一个大小为(2*r+1)*(2*r+1)的窗口。
    • 在窗口边界进行限制,防止越界。
  4. 窗口数据排序

    • 将窗口内的像素值存储在 datas 向量中,并进行排序。
  5. 计算中值和最值

    • 计算排序后的数据中的最小值 minValue、最大值 maxValue 和中值 midValue
  6. 判断是否需要扩大窗口

    • 根据中值与最小值、最大值的差值是否超过某个阈值 thresh 来决定是否需要扩大窗口。
    • 如果窗口内的中值不在最小值和最大值之间一定范围内,则继续扩大窗口,直到r大于R。
  7. 滤波处理

    • 如果当前像素值与窗口最值的差值大于阈值,说明不需要滤波,直接将当前像素值赋给输出图像的对应位置。
    • 否则,将窗口内的中值赋给输出图像的对应位置。
  8. 返回结果

    • 返回处理后的输出图像。

       AMF算法的优点是能够有效地处理不同区域的噪声和图像细节,因为它在滤波器大小和形状上具有自适应性。然而,它也有一些缺点,比如计算复杂度较高,处理速度较慢,特别是对于大尺寸的滤波器。

       总的来说,AMF算法是一种灵活而有效的滤波器,特别适用于那些噪声水平不均匀且图像细节丰富的场景,尤其是针对椒盐噪声。

功能函数代码

// AMF算法(Adaptive Median Filtering)
cv::Mat adaptiveMedianFiltering(cv::Mat input, int winSize)
{int row = input.rows;int col = input.cols;cv::Mat output(row, col, CV_8UC1);int R = winSize / 2;// 遍历处理
#pragma omp parallel forfor (int i = 0; i < row; i++){vector<float> datas;for (int j = 0; j < col; j++){int r = 1;while (r <= R){// 卷积窗口边界限制,防止越界int ms = ((i - r) > 0) ? (i - r) : 0;int me = ((i + r) < (row - 1)) ? (i + r) : (row - 1);int ns = ((j - r) > 0) ? (j - r) : 0;int ne = ((j + r) < (col - 1)) ? (j + r) : (col - 1);// 窗口内有效数据排序datas.clear();for (int m = ms; m <= me; ++m){for (int n = ns; n <= ne; ++n){datas.push_back(float(input.at<uchar>(m, n)));}}sort(datas.begin(), datas.end());// 计算数值float minValue = datas[0];float maxValue = datas[datas.size() - 1];float midValue = datas[datas.size() / 2];// 若窗口内中值不为在最值一定范围内,则说明当前窗口尺寸足够,不需要扩展也可完成有效滤波;反之,则继续扩大窗口,直到最大窗口尺寸float thresh = (maxValue - minValue) * 0.02f;if ((midValue - minValue) > thresh && (maxValue - midValue) > thresh){// 若数据本身就不为最值,则不需要滤波,这也是自适应算法保持高分辨的关键if ((input.at<uchar>(i, j) - minValue) > thresh && (maxValue - input.at<uchar>(i, j)) > thresh){output.at<uchar>(i, j) = input.at<uchar>(i, j);}// 若为最值,则说明当前数值大概率是噪声信息,进行中值滤波else{output.at<uchar>(i, j) = uchar(midValue);}break;}else{r++;}// 如果窗口尺寸达到限制了,则直接滤波if (r > R){output.at<uchar>(i, j) = uchar(midValue);}}}}return output;
}

C++测试代码

#include <algorithm>
#include <iostream>
#include <opencv2/opencv.hpp>using namespace std;
using namespace cv;// AMF算法(Adaptive Median Filtering)
cv::Mat adaptiveMedianFiltering(cv::Mat input, int winSize)
{int row = input.rows;int col = input.cols;cv::Mat output(row, col, CV_8UC1);int R = winSize / 2;// 遍历处理
#pragma omp parallel forfor (int i = 0; i < row; i++){vector<float> datas;for (int j = 0; j < col; j++){int r = 1;while (r <= R){// 卷积窗口边界限制,防止越界int ms = ((i - r) > 0) ? (i - r) : 0;int me = ((i + r) < (row - 1)) ? (i + r) : (row - 1);int ns = ((j - r) > 0) ? (j - r) : 0;int ne = ((j + r) < (col - 1)) ? (j + r) : (col - 1);// 窗口内有效数据排序datas.clear();for (int m = ms; m <= me; ++m){for (int n = ns; n <= ne; ++n){datas.push_back(float(input.at<uchar>(m, n)));}}sort(datas.begin(), datas.end());// 计算数值float minValue = datas[0];float maxValue = datas[datas.size() - 1];float midValue = datas[datas.size() / 2];// 若窗口内中值不为在最值一定范围内,则说明当前窗口尺寸足够,不需要扩展也可完成有效滤波;反之,则继续扩大窗口,直到最大窗口尺寸float thresh = (maxValue - minValue) * 0.02f;if ((midValue - minValue) > thresh && (maxValue - midValue) > thresh){// 若数据本身就不为最值,则不需要滤波,这也是自适应算法保持高分辨的关键if ((input.at<uchar>(i, j) - minValue) > thresh && (maxValue - input.at<uchar>(i, j)) > thresh){output.at<uchar>(i, j) = input.at<uchar>(i, j);}// 若为最值,则说明当前数值大概率是噪声信息,进行中值滤波else{output.at<uchar>(i, j) = uchar(midValue);}break;}else{r++;}// 如果窗口尺寸达到限制了,则直接滤波if (r > R){output.at<uchar>(i, j) = uchar(midValue);}}}}return output;
}void main()
{cv::Mat image = cv::imread("test.jpg", cv::IMREAD_GRAYSCALE);// 添加随机椒盐噪声int row = image.rows;int col = image.cols;cv::Mat noise = image.clone();for (int i = 0; i < row; i += 10){for (int j = 0; j < col; j += 10){noise.at<uchar>(i, j) = rand() % 255;}}// 传统中值滤波int winSize = 15;cv::Mat median;cv::medianBlur(noise, median, winSize);// AMF算法处理cv::Mat resultimage = adaptiveMedianFiltering(noise, winSize);// 显示cv::imshow("ori", image);cv::imshow("noise", noise);cv::imshow("AMF", resultimage);cv::waitKey(0);cout << "end." << endl;
}

测试效果 

图1 原图
图2 噪声图
图3 传统中值滤波算法效果
图4 AMF算法效果图

       如上图所示,AMF算法在保留图像细节的同时有效去除了椒盐噪声。

       Matlab版本见:

Matlab-AMF算法(自适应中值滤波Adaptive Median Filtering)-CSDN博客   

       如果函数有什么可以改进完善的地方,非常欢迎大家指出,一同进步何乐而不为呢~

       如果文章帮助到你了,可以点个赞让我知道,我会很快乐~加油!

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

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

相关文章

蓝桥杯2024年第十五届省赛真题-R 格式(高精度乘法 + 加法)

本题链接&#xff1a;蓝桥杯2024年第十五届省赛真题-R 格式 - C语言网 题目&#xff1a;​​​​​​​ 样例&#xff1a; 输入 2 3.14 输出 13 思路&#xff1a; 根据题意&#xff0c;结合数据范围&#xff0c;这是一道模板的高精度乘以低精度问题。 题意是double 类型 d 与…

论文笔记:Time Travel in LLMs: Tracing Data Contamination in Large Language Models

iclr 2024 spotlight reviewer评分 688 1 intro 论文认为许多下游任务&#xff08;例如&#xff0c;总结、自然语言推理、文本分类&#xff09;上观察到的LLMs印象深刻的表现可能因数据污染而被夸大 所谓数据污染&#xff0c;即这些下游任务的测试数据出现在LLMs的预训练数据…

mac电脑软件 Magnet v2.14.0免激活中文版

Magnet是一款窗口管理工具&#xff0c;适用于Mac操作系统。它可以帮助用户轻松地管理和组织多个应用程序的窗口&#xff0c;提高工作效率。 Magnet支持多种窗口布局和组合方式&#xff0c;可以将窗口分为左右、上下、四分之一等不同的比例和位置&#xff0c;用户可以根据实际需…

阿里云Centos7下编译glibc

编译glibc 原来glibc版本 编译前需要的环境: CentOS7 gcc 8.3.0 gdb 8.3.0 make 4.0 binutils 2.39 (ld -v) python 3.6.8 其他看INSTALL, 但有些版本也不易太高 wget https://mirrors.aliyun.com/gnu/glibc/glibc-2.37.tar.gz tar -zxf glibc-2.37.tar.gz cd glibc-2.37/ …

Spring Boot 整合 Mockito:提升Java单元测试的高效实践

引言 在Java开发领域&#xff0c;Spring Boot因其便捷的配置和强大的功能而受到广泛欢迎&#xff0c;而Mockito作为一款成熟的单元测试模拟框架&#xff0c;则在提高测试质量、确保代码模块间解耦方面扮演着至关重要的角色。本文将详细介绍如何在Spring Boot项目中整合Mockito&…

c++总结笔记(一)

计算机可以将程序转化为二进制指令&#xff08;即机器码&#xff09;&#xff0c;并由CPU执行&#xff0c;CPU会按照指令的顺序依次执行每个指令。 C语言特点&#xff1a; 简洁高效可移植模块化标准化 C语言的标准 C89(C90)标准C99标准C11标准 导入 使用include导入包含…

《R语言与农业数据统计分析及建模》学习——数据读入

一、工作目录 # 获取当前工作目录 getwd()# 改变工作目录为指定路径下的文件夹 # 注意工作目录的表达方式 setwd(D:/R_class) setwd(D:\\R_class) 二、文件路径 读取文件中的数据首先要确定文件路径&#xff0c;如果文件不在工作目录下&#xff0c;则必须使用绝对路径 1、文…

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单实战案例 之十二 简单图片添加水印效果

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单实战案例 之十二 简单图片添加水印效果 目录 Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单实战案例 之十二 简单图片添加水印效果 一、简单介绍 二、简单图片添加水印效果实现原理 三、简单图片添加水印效果案例…

解决VS2022创建项目只有解决方案看不到项目文件

问题&#xff1a;无法运行、看不到项目文件 解决&#xff1a; 检查环境变量是否正确

开源相机管理库Aravis例程学习(一)——单帧采集single-acquisition

开源相机管理库Aravis例程学习&#xff08;一&#xff09;——单帧采集single-acquisition 简介源码函数说明arv_camera_newarv_camera_acquisitionarv_camera_get_model_namearv_buffer_get_image_widtharv_buffer_get_image_height 简介 本文针对官方例程中的第一个例程&…

MVSplat:稀疏多视点图像的高效3D高斯溅射

MVSplat: Efficient 3D Gaussian Splatting from Sparse Multi-View Images MVSplat&#xff1a;稀疏多视点图像的高效3D高斯溅射 Yuedong Chen1  Haofei Xu2,3  Chuanxia Zheng4  Bohan Zhuang 粤东陈浩飞徐 2,3 郑传霞 4 庄伯涵1 Marc Pollefeys2,5  Andreas Geiger3  T…

长波热红外应用

长波热红外通常是指波长范围在8至14微米之间的红外辐射。这种红外辐射主要来自于物体的热能&#xff0c;因此也称为热红外辐射。相比于短波红外&#xff0c;长波热红外更适合用于测量和探测物体的温度&#xff0c;因为它们能够捕捉到物体辐射的长波长热能&#xff0c;从而提供更…

web自动化系列-selenium find_elements定位方法详解(八)

接上文 &#xff1a; web自动化测试系列-selenium css_selector定位方法详解(七)-CSDN博客 前面已经介绍了8种定位方法 &#xff0c;大多数情况下我们都会优先使用这8种方法 。 但有的时候在你选择定位元素时 &#xff0c;会出现多个同样的定位属性和值 。而且你能选择定位也…

前端框架模板

前端框架模板 1、vue-element-admin vue-element-admin是基于element-ui 的一套后台管理系统集成方案。 **功能&#xff1a;**https://panjiachen.github.io/vue-element-admin-site/zh/guide/#功能 **GitHub地址&#xff1a;**GitHub - PanJiaChen/vue-element-admin: :t…

脚本开发与自动化运维----shell脚本开发及其在DevOps中的应用

一.正则表达式 正则表达式(Regular Expression、regex 或 regexp, 缩写为RE), 又称规则表达式,是计算机科学中的一个概念。正则表通常被用来检索、替换那些符合某个模式(规则)的文本。正则表达式是对字符串(包括普通字符(例如&#xff0c; a 到 z 之间的字母)和特殊字符(称为“…

信也科技网络自动化实践-网络策略管理

1、背景 随着各种法律法规和行业标准的出台和更新&#xff0c;企业或组织需要遵守各种安全合规性要求。网络安全策略管理需要符合这些要求&#xff0c;从而保障企业或组织的安全和合规性。网络安全策略管理需要涵盖企业或组织的整个网络生命周期&#xff0c;包括网络规划、设计…

场景文本检测识别学习 day04(目标检测的基础概念)

经典的目标检测方法 one-stage 单阶段法&#xff1a;YOLO系列、SSD系列 one-stage方法&#xff1a;仅预测一次&#xff0c;直接在特征图上预测每个物体的类别和边界框输入图像之后&#xff0c;使用CNN网络提取特征图&#xff0c;不加入任何补充&#xff08;锚点、锚框&#x…

Kafka 架构深入介绍 及搭建Filebeat+Kafka+ELK

目录 一 架构深入介绍 &#xff08;一&#xff09;Kafka 工作流程及文件存储机制 &#xff08;二&#xff09;数据可靠性保证 &#xff08;三&#xff09;数据一致性问题 &#xff08;四&#xff09;故障问题 &#xff08;五&#xff09;ack 应答机制 二 实…

蓝桥杯2024年第十五届省赛

E:宝石组合 根据给的公式化简后变为gcd(a,b,c)根据算数基本定理&#xff0c;推一下就可以了 然后我们对1到mx的树求约数&#xff0c;并记录约数的次数&#xff0c;我们选择一个最大的且次数大于等3的就是gcd int mx; vector<int> g[N]; vector<int> cnt[N]; int…

基于贝叶斯算法的机器学习在自动驾驶路径规划中的应用实例

目录 第一章 引言 第二章 数据准备 第三章 贝叶斯路径规划模型训练 第四章 路径规划预测 第五章 路径执行 第六章 实验结果分析 第一章 引言 自动驾驶技术的发展带来了自动驾驶车辆的出现&#xff0c;而路径规划作为自动驾驶车辆的关键功能之一&#xff0c;对于确定最佳行…