iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++实现中值滤波的示例代码
  • 861
分享到

C++实现中值滤波的示例代码

2024-04-02 19:04:59 861人浏览 泡泡鱼
摘要

目录冒泡排序实现:中值滤波的实现:为了加深对中值滤波算法的理解以及方便以后更好的复习,我将该算法的一些重点细节和实现过程踩过的坑记录下来。 中值滤波器是一种非线性滤波器,或者叫统计排

为了加深对中值滤波算法的理解以及方便以后更好的复习,我将该算法的一些重点细节和实现过程踩过的坑记录下来。

中值滤波器是一种非线性滤波器,或者叫统计排序滤波器。

适用对象:带椒盐噪声的图像

由于椒盐噪声像素值与原图像素值没有关联,随机性较大,因此使用中值滤波可有效滤掉噪声。

中值滤波需要对像素值进行排序,因此首先写一个冒泡排序算法。

冒泡排序实现:

为提高效率加入标志位flag,当第i次寻找最大值时,如果相邻两个数均未发生互换,此时flag位为false,即说明此时数组已经按照递增排列,可提前终止。此处应该注意flag=false所在位置,因为需要保证第i次寻找最大值过程中,遍历到所有未参与排列的数据,所以flag=false应该放在循环条件for(int j=0; j<len-1-i; j++)的外部。

void bubble(std::vector<int> &arr, int len)
{
    bool flag = true;
    for (int i = 0; i < len-1; i++)
    {
        while (flag)
        {
            flag = false;
            for (int j = 0; j < len - i - 1; j++)
            {
                
                if (arr[j + 1] < arr[j])
                {
                    flag = true;  //只要发生一次交换就继续判断
                    int temp = arr[j + 1];
                    arr[j + 1] = arr[j];
                    arr[j] = temp;
                }
            }
        }
    }    
}

中值滤波的实现:

需要注意的主要问题:

为了能够遍历到原图的边界,需要对原图进行边界扩充,扩充长度为(窗口的长度-1)/ 2。
注意利用窗口对扩充后的图像遍历时,起始的位置不是0,而是扩充的长度,因为这时对应的才是原图的第一个像素点,同理结束的位置也是原图的最后一个像素点。
另外为了方便将窗口内对应的像素存到容器中,可以写两个循环,循环长度为窗口的长度与宽度,依次将像素值存入容器中。
最后对容器内的像素按照递增排列后,取中值赋给目标矩阵相应的位置,而此时的位置也应该用i-h,对应扩充前的位置。
经实践证明我写的这两个算法可有效使用。

void medianFilter(cv::Mat& src, cv::Mat& dst, cv::Size width)
{
    //判断窗口是否为奇数
    if (width.width % 2 == 0 || width.height % 2 == 0)
    {
        std::cout << "输入窗口大小应该为奇数,请重新输入" << endl;
        exit(-1);
    }
    else
    {
        //计算边界扩充长度
        int h = (width.height - 1) / 2;
        int w = (width.width - 1) / 2;
 
        //对原图边界扩充
        cv::Mat src_border;
        cv::copyMakeBorder(src, src_border, h, h, w, w, cv::BORDER_REFLECT_101);
        for (int i = h; i < src.rows + h; i++)
        {
 
            for (int j = w; j < src.cols + w; j++)
            {
                //定义容器存放窗口对应的像素
                std::vector <int> v;
                for (int ii = i - h; ii <= i + h; ii++)
                {
                    for (int jj = j - w; jj <= j + w; jj++)
                    {
 
                        v.push_back(src_border.at<uchar>(ii, jj));
                    }
                }
                //对容器内存放的像素排序
                int len = width.area();
                bubble(v, len);
                //将中值赋给目标图像对应位置
                dst.at<uchar>(i-h, j-w) = v[(len - 1) / 2];
                
            }
        }
        
    }
 
}

到此这篇关于c++实现中值滤波的示例代码的文章就介绍到这了,更多相关C++ 中值滤波内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C++实现中值滤波的示例代码

本文链接: https://www.lsjlt.com/news/148619.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C++实现中值滤波的示例代码
    目录冒泡排序实现:中值滤波的实现:为了加深对中值滤波算法的理解以及方便以后更好的复习,我将该算法的一些重点细节和实现过程踩过的坑记录下来。 中值滤波器是一种非线性滤波器,或者叫统计排...
    99+
    2022-11-13
  • openCV中值滤波和均值滤波的代码实现
    目录一.均值滤波二.中值滤波 在开始我们今天的博客之前,我们需要先了解一下什么是滤波: 首先我们看一下图像滤波的概念。图像滤波,即在尽量保留图像细节特征的条件下对目标图像的...
    99+
    2022-11-13
  • C#实现一阶卡尔曼滤波算法的示例代码
    //FilterKalman.cs namespace FusionFiltering { public class FilterKalman { ...
    99+
    2022-11-12
  • C++如何实现中值滤波
    这篇文章主要介绍了C++如何实现中值滤波的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C++如何实现中值滤波文章都会有所收获,下面我们一起来看看吧。中值滤波器是一种非线性滤波器,或者叫统计排序滤波器。适用对象:...
    99+
    2023-06-30
  • C++实现OpenCV方框滤波的代码
    一、方框滤波    方框滤波是均值滤波的一种形式。在均值滤波中,滤波结果的像素值是任意一个点的邻域平均值,等于各邻域像素值之和的均值,而在方框滤波中,可以自由...
    99+
    2022-11-12
  • python opencv图像的高通滤波和低通滤波的示例代码
    目录前言完整代码低通滤波高通滤波结果展示低通滤波高通滤波前言 上一章我们说明了如何将图像机娘傅里叶变换,将图像由时域变换成频域,并将低频移动至图像中心。那么将低频移动中心后,就可以将...
    99+
    2022-11-11
  • OpenCV学习方框滤波实现图像处理代码示例
    目录一、方框滤波二、C++代码三、python代码四、结果展示1、原始图像2、归一化3、不归一化4、平方和求均值一、方框滤波    方框滤波是均值滤波的一种形...
    99+
    2022-11-12
  • C#实现一键清空控件值的示例代码
    目录场景需求开发环境开发工具实现代码实现效果代码解析场景 在任何一个Form表单的操作页面或者数据台账的查询页面,基本都会看到一个清除的按钮,其功能就是用来清除我们需要抛弃的已经写入...
    99+
    2022-11-13
  • C++实现MyString的示例代码
    MyString的构造、析构、拷贝构造、赋值运算 class String { char* str; public: String(const char* p = NULL) :...
    99+
    2022-11-13
  • django filters实现数据过滤的示例代码
    常用 当前循环. 作用 ...
    99+
    2022-11-12
  • SpringBoot实现过滤敏感词的示例代码
    过滤敏感词 1. 创建一个储存要过滤的敏感词的文本文件 首先创建一个文本文件储存要过滤的敏感词 在下面的工具类中我们会读取这个文本文件,这里提前给出 @PostConstruct...
    99+
    2022-11-13
    SpringBoot过滤敏感词 SpringBoot 敏感词
  • C++中priority_queue模拟实现的代码示例
    目录priority_queue概述 priority_queue定义 priority_queue特点 构造函数 修改相关函数pushpop容量相关函数sizeempty元素访问相...
    99+
    2022-11-12
  • SpringBoot+Redis实现布隆过滤器的示例代码
    目录简述Redis 安装 Bloom Filter基本指令结合 SpingBoot方式一方式二简述 关于布隆过滤器的详细介绍,我在这里就不再赘述一遍了 我们首先知道:BloomFil...
    99+
    2022-11-13
  • C++ 实现桶排序的示例代码
    目录原理实现步骤:模拟生成整数随机数桶排序实现完整版可运行程序时间复杂度计算桶排序:整数  原理 原理简述:按照需要排序数组的实际情况,生成一个一定长度的一维数组,用于统计...
    99+
    2022-11-12
  • C语言实现栈的示例代码
    目录一、了解栈的结构特点二、具体实现补充 栈的用处一、了解栈的结构特点 栈是一种特殊的线性表,只允许从一端进出数据,称为后进先出,先进后出。 压栈:栈的插入操作叫做进栈/压...
    99+
    2022-11-13
  • C++实现Dijkstra算法的示例代码
    目录一、算法原理二、具体代码1.graph类2.PathFinder类3. main.cpp三、示例一、算法原理 链接: Dijkstra算法及其C++实现参考这篇文章 二、具体代码...
    99+
    2022-11-13
  • C#实现ComboBox变色的示例代码
    目录实践过程效果代码实践过程 效果 代码 public partial class B_ComboBox : ComboBox { public B_...
    99+
    2023-01-05
    C#实现ComboBox变色 C# ComboBox变色 C# ComboBox
  • C++模拟实现vector的示例代码
    目录1.前言2.vector介绍3.vector模拟实现3.1 迭代器接口3.2 vector元素操作3. 3 构造与析构1.前言 大家在学习C++的时候一定会学到STL(标准模板库...
    99+
    2022-11-13
  • c++实现堆排序的示例代码
    看了一下优先队列,查了一下堆排序。堆排序主要就是建最大堆(最小堆)和交换2个操作。如果建的是最大堆,那么交换的时候,父节点就和最大的子节点比较,如果它比最大的子节点还大,那就不用比了...
    99+
    2023-02-02
    c++ 堆排序
  • C/C++实现精灵游戏的示例代码
    目录前言创建win32项目游戏效果核心代码前言 采用面向过程的遍程思想,通过acllib图形库来实现。 acllib下载地址:acllib tom,jerry,dog,heart以及...
    99+
    2022-11-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作