服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - C++实现中值滤波的示例代码

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

2022-11-30 13:37小魏612 C/C++

本文主要介绍了C++实现中值滤波的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

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

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

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

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

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

冒泡排序实现:

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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,对应扩充前的位置。
经实践证明我写的这两个算法可有效使用。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
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++ 中值滤波内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/qq_62945476/article/details/123694500

延伸 · 阅读

精彩推荐
  • C/C++C++解析Json的方法详解【jsoncpp】

    C++解析Json的方法详解【jsoncpp】

    这篇文章主要介绍了C++解析Json的方法,结合实例形式分析了C++操作json格式数据的相关实现技巧与注意事项,需要的朋友可以参考下...

    typ20044012021-05-16
  • C/C++C++第三方日志库log4cplus的安装与使用配置教程

    C++第三方日志库log4cplus的安装与使用配置教程

    log4cplus是C++编写的开源的日志系统,log4cplus具有线程安全、灵活、以及多粒度控制的特点,本文给大家介绍C++第三方日志库log4cplus的安装与使用教程,感兴...

    wendy_ya9182022-09-29
  • C/C++详解C++中多态的底层原理

    详解C++中多态的底层原理

    要了解C++多态的底层原理需要我们对C指针有着深入的了解,这个在打印虚表的时候就可以见功底,所以快来跟随小编一起学习一下吧...

    卖寂寞的小男孩9552022-11-20
  • C/C++实例分析一个简单的Win32程序

    实例分析一个简单的Win32程序

    这篇文章主要介绍了实例分析一个简单的Win32程序,对于Win32应用程序的原理、执行流程、实现方法主要环节都做了较为详细的分析,有助于读者深入理解Win...

    C语言程序设计6442021-01-31
  • C/C++软件构建工具makefile基础讲解

    软件构建工具makefile基础讲解

    这篇文章介绍了软件构建工具makefile,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...

    haoel10152022-07-21
  • C/C++C语言字符串快速压缩算法代码

    C语言字符串快速压缩算法代码

    这篇文章主要介绍了C语言字符串快速压缩算法代码,将字符串中连续出席的重复字母进行压缩,其主要的压缩字段的格式为”字符重复的次数+字符”。有...

    C语言教程网10972021-02-22
  • C/C++C语言实现随机抽取纸牌程序

    C语言实现随机抽取纸牌程序

    这篇文章主要为大家详细介绍了C语言实现随机抽取纸牌程序,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    风叶翩翩12042022-10-31
  • C/C++c++将字符串转数字的实例方法

    c++将字符串转数字的实例方法

    在本篇文章里小编给大家整理的是关于c++将字符串转数字的实例方法,有需要的朋友们可以参考下。...

    藏色散人10722021-08-15